找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 595|回复: 8
打印 上一主题 下一主题
收起左侧

T12白光烙铁固件源码(天山V1.2 51问题,缺文件吗

[复制链接]
跳转到指定楼层
楼主
ID:60178 发表于 2026-4-11 13:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
T12白光烙铁固件源码(天山V1.2 51单片机问题
主函数如下
#include "config.h"

void main(void)
{
        
        //系统初始化
        Sys_Init();
        while(1)
        {
                //显示主界面
                Sys_Monitor();这叫:
空闲休眠(IDLE 模式)
它只休眠:
  • CPU 内核休息

但这些全部正常工作:
  • 定时器中断
  • PWM 加热
  • ADC 采集
  • IIC 通信
  • 外部中断
  • 编码器扫描

一句话:
CPU 睡了,但是所有外设都在跑!


休眠后怎么唤醒?
中断一来,自动唤醒!
你的程序里:

  • 定时器 1ms 中断 → 唤醒
  • 编码器中断 → 唤醒
  • 按键中断 → 唤醒

唤醒后继续执行:

plaintext









Sys_Monitor();   // 显示ParaSet();       // 按键





所以你看到的现象是:
明明休眠了,屏幕还在刷新,加热还在控制,温度还在跑!


终极总结(你一定要记住)
  • IRON = 加热 IO,在 config.h 里
  • PID = IronTempControl()
  • main 只管显示 + 按键
  • 真正加热、温控、计时 = 定时器中断后台跑
  • 休眠 = CPU 休息,外设继续跑,所以程序不会停



你现在想让我继续做什么?
  • 帮你找 IRON 引脚
  • 帮你看 PID 代码
  • 帮你画 流程图
  • 帮你移植到 STM32
                //编码器设定参数,
                ParaSet();
        }
}************************************************************
  65           * 函数名               :       timer1_int
  66           * 功能说明     :       定时器1中断,主要控制
  67           *
  68           * 输入参数     :       无      
  69           * 输出参数     :       无
  70           *
  71           * 修改记录     :       新增函数,第一次编辑
  72           * 历次作者     :       王志浩
  73           * 日期                 :       2017-10-18
  74          *************************************************************/  
  75          void timer1_int (void) interrupt TIMER1_VECTOR
  76          {
  77   1              static unsigned int             IronUseCounter[2]={0,0};
  78   1              static  unsigned int    ShutDownCounter = 0;
  79   1              static unsigned char    Sleep_Old = 0;
  80   1              static unsigned char    PWM_counter     =       0;
  81   1              static unsigned char SetTempCounter = 0;
  82   1      
  83   1              
  84   1              //烙铁PWM生成
  85   1              PWM_counter=Timer.mSec%100;
  86   1              if((PWM_counter<PWM.Duty) && PWM.Run)
  87   1                      IRON = 1;
  88   1              else
  89   1                      IRON = 0;
  90   1              
  91   1              //1ms处理部分
  92   1              Timer.mSec++;                   //定时器0分段计数器自加
  93   1              EC11_Capture();         //捕捉EC11信息  
  94   1      
  95   1              //10ms处理部分
  96   1              if(Timer.mSec%10 == 0)
  97   1              {
  98   2                      if(IronUse_Status.Handle || IronUse_Status.Coder)//烙铁或编码器用了,那要看看现在是不是休眠什么的状态了


主函数只有这几个,没有看出来怎么加热,能解释下吗,下面的文件多不用,怎么工作的,谁来整理解释下,经过学习,


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:857072 发表于 2026-4-11 17:58 来自触屏版 | 只看该作者
#include "config.h"这么大一个,顺着进去找啊
回复

使用道具 举报

板凳
ID:60178 发表于 2026-4-11 18:57 | 只看该作者
主函数中没有,好向在中断中加热
************************************************************
  65           * 函数名               :       timer1_int
  66           * 功能说明     :       定时器1中断,主要控制
  67           *
  68           * 输入参数     :       无      
  69           * 输出参数     :       无
  70           *
  71           * 修改记录     :       新增函数,第一次编辑
  72           * 历次作者     :       王志浩
  73           * 日期                 :       2017-10-18
  74          *************************************************************/  
  75          void timer1_int (void) interrupt TIMER1_VECTOR
  76          {
  77   1              static unsigned int             IronUseCounter[2]={0,0};
  78   1              static  unsigned int    ShutDownCounter = 0;
  79   1              static unsigned char    Sleep_Old = 0;
  80   1              static unsigned char    PWM_counter     =       0;
  81   1              static unsigned char SetTempCounter = 0;
  82   1      
  83   1              
  84   1              //烙铁PWM生成
  85   1              PWM_counter=Timer.mSec%100;
  86   1              if((PWM_counter<PWM.Duty) && PWM.Run)
  87   1                      IRON = 1;
  88   1              else
  89   1                      IRON = 0;
  90   1              
  91   1              //1ms处理部分
  92   1              Timer.mSec++;                   //定时器0分段计数器自加
  93   1              EC11_Capture();         //捕捉EC11信息  
  94   1      
  95   1              //10ms处理部分
  96   1              if(Timer.mSec%10 == 0)
  97   1              {
  98   2                      if(IronUse_Status.Handle || IronUse_Status.Coder)//烙铁或编码器用了,那要看看现在是不是休眠什么的状态了
回复

使用道具 举报

地板
ID:469589 发表于 2026-4-11 21:07 | 只看该作者
不管怎么说,T12的PID程序编的非常简练、科学、实用!
回复

使用道具 举报

5#
ID:84476 发表于 2026-4-13 13:11 | 只看该作者
我们有时候写的程序,主函数里几乎是空的。哈哈
回复

使用道具 举报

6#
ID:60178 发表于 2026-4-16 09:56 | 只看该作者
新手抱着试试看,阅读了王志浩板本的T12烙铁程序,去看了MAIN函数,发现只有开关机和主界面程序,按键程序调用,没有PWM加热,ADC,显示,PID等程序,百思不得其解,后来发现中断好像有,问了豆包,牵出来关于程序结构问题,原来单片机是主程序和中断程序分2路同时运行的,其它程序在中断程序里执行的,以定时中断时间1MS为基准,再用变量计数10MS、20MS,50MS等分别判断执法其它程序,是可以没有MAIN,或不在MAIN也能单独运行,又了解了程序结构的时间片轮询,状态机结构等。比方每隔20MS重复一次,结构为定时器每中断1MS,变量++,间隔变量=当前变量一一前次变量。IF间隔时间如果=10MS,就执行,ADC,然后把前次变量=当前变量,然后其它按此方法,间隔20MS,50MS时间间隔分别执行PWM加热开关,PID算法,滤波等程序。后来发现疑问这个变量没有清零,是不是有问题呢,又问豆包,它说溢出后计数为5,5-65535=11,不改间隔时间
回复

使用道具 举报

7#
ID:230500 发表于 2026-4-20 11:08 | 只看该作者
想当年 我们玩这个的时候,群里也是热热闹闹的。当年这个程序主编是王志浩,一名  大学的学生。我做了几台 至今还在使用。后来又改了几个锂电池版本的。
我这个帖子里有程序和PCB的源文件,都是验证可以用的。
http://www.51hei.com/bbs/dpj-216508-1.html
回复

使用道具 举报

8#
ID:60178 发表于 2026-4-21 02:54 | 只看该作者
a399288395 发表于 2026-4-20 11:08
想当年 我们玩这个的时候,群里也是热热闹闹的。当年这个程序主编是王志浩,一名  大学的学生。我做了几台  ...

去学习下
回复

使用道具 举报

9#
ID:60178 发表于 2026-4-21 03:03 | 只看该作者
T12 焊台 K 型热电偶 代码逐行精讲
我把公式原理 + 代码逐行解释完全对应起来,用最通俗的话讲透,新手也能彻底看懂。
先记住核心物理原理:T12 内部是 K 型热电偶,温度越高,输出的毫伏电压越大,我们用数学公式把电压 ↔ 温度互转。

一、先把公式讲明白(代码的数学基础)
1. 物理公式(冷端 0℃)
正向(温度算电压):E=0.04107×t−0.055反向(电压算温度,焊台真正用):t=0.04107E+0.055​
符号含义:

t:烙铁头温度(℃)
E:热电偶输出电压(mV 毫伏)
0.04107:K 型热电偶在 T12 温区的平均灵敏度(每℃ 约 0.041mV)
-0.055:拟合修正值,让计算更准

2. 冷端补偿原理(必须懂!)
热电偶只有冷端 = 0℃时公式才直接成立。但焊台冷端是室温,所以必须:总电压 = 实测电压 + 室温对应的电压总测室温
室温电压简化公式:室温室温

二、完整代码 + 逐行超详细解释c运行// 1. 功能:将热电偶电压(mV) 转换成 温度(℃),不带冷端补偿(理论值)
float mv_to_temp(float mv)
{
    // 公式:温度 = (电压 + 0.055) / 0.04107
    return (mv + 0.055f) / 0.04107f;
}

// 2. 功能:带冷端补偿的电压转温度(焊台实际使用的核心函数)
float mv_to_temp_comp(float mv_meas, float t_room)
{
    // 第一步:计算 室温 产生的热电偶电压
    float mv_room = 0.0407f * t_room;

    // 第二步:总电压 = 实测电压 + 室温补偿电压
    float mv_total = mv_meas + mv_room;

    // 第三步:用总电压计算真实温度
    return (mv_total + 0.055f) / 0.04107f;
}


三、逐行拆解(每行都讲透)
① 函数 1:mv_to_temp(无补偿,基础版)
float mv_to_temp(float mv)

float:返回值是温度(小数)
mv_to_temp:函数名,意思是 mV 转 温度
float mv:传入参数 = 热电偶电压(毫伏)

return (mv + 0.055f) / 0.04107f;

对应公式:t=0.04107E+0.055​
mv + 0.055f:修正电压偏移
/ 0.04107f:除以灵敏度,把毫伏 → 摄氏度
f:告诉编译器这是小数(浮点数),避免计算错误

② 函数 2:mv_to_temp_comp(带补偿,真实可用)
float mv_to_temp_comp(float mv_meas, float t_room)

mv_meas:ADC 实测到的电压(来自烙铁头热电偶)
t_room:冷端室温(由单片机内部温度传感器测得)

float mv_room = 0.0407f * t_room;

公式:室温室温
作用:算出室温本身产生的毫伏电压
因为热电偶冷端不是 0℃,必须补上这部分电压
float mv_total = mv_meas + mv_room;
公式:总测室温
作用:把室温电压补偿回去,等效冷端 = 0℃的总电压

return (mv_total + 0.055f) / 0.04107f;

用补偿后的总电压算温度
结果 = 烙铁头真实温度

四、用一个例子带你跑一遍(彻底懂)
假设:
室温 = 25℃
实测电压 = 16.2 mV

计算过程:

室温电压 = 0.0407 × 25 = 1.0175 mV
总电压 = 16.2 + 1.0175 = 17.2175 mV
温度 = (17.2175 + 0.055) / 0.04107= 17.2725 / 0.04107= ≈ 420.6℃

代码就是自动完成这三步计算。

五、最核心的 3 句话总结

热电偶 = 温度 → 小电压信号
公式 = 把小电压翻译成温度
冷端补偿 = 把室温的影响减掉,得到真实温度


如果你需要,我可以继续给你讲:

ADC 原始值 → mV 的公式与代码
整数运算优化版(适合 51 单片机 / STM8 低速芯片)
T12 控温的完整温度计算逻辑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表