STC15F104E 只有 8 个引脚,资源非常紧张,因此必须用最少的外设实现温控 + PWM + 睡眠 + 报警,这也是目前网上最常见、最稳定的做法。
一、硬件方案
1、引脚分配(STC15F104E)
| 引脚 | 功能 |
|---|---|
| P3.1 (TXD) | 振动开关 / 手柄晃动检测 |
| P3.0 (RXD) | 按键(短按加温 / 长按睡眠) |
| P3.2 (INT0) | 热电偶输入(LM358 放大后) |
| P3.3 (INT1) | PWM 输出 → MOSFET |
| P3.4 | 指示灯 LED |
| VCC / GND | 5V 供电 |
2、典型电路结构
T12 烙铁头
│
├── 加热丝 → MOSFET → GND
│
└── 热电偶(mV级)
↓
LM358 放大 ×100
↓
STC15F104E ADC
MOSFET :AO3400 / IRLZ44N
放大电路 :LM358 单电源放大
供电:DC 24V → 7805 → 5V
二、温度采集原理
T12 的热电偶输出约 2--5 mV/℃,必须放大:
放大倍数 ≈ Rf / Rin ≈ 100
ADC 分辨率:STC15F104E ≈ 10bit
温度计算公式(经验拟合):
c
temp = adc * 0.48 - 50;
实际一定要 实物校准
三、核心控制逻辑
PID 控制 PWM 占空比
定时采样(100ms)
休眠 / 唤醒
防干烧
四、示例代码
1、头文件与宏定义
c
#include <STC15F104E.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define PWM_PIN P33
#define LED_PIN P34
#define KEY_PIN P30
#define SHAKE_PIN P31
#define TEMP_TARGET 300 // 目标温度 ℃
2、PWM(软件 PWM)
c
uchar pwm_cnt = 0;
uchar pwm_duty = 0;
void Timer0Init(void) {
AUXR &= 0x7F;
TMOD &= 0xF0;
TL0 = 0xCD;
TH0 = 0xD4;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void Timer0_ISR() interrupt 1 {
pwm_cnt++;
if (pwm_cnt >= 100) pwm_cnt = 0;
PWM_PIN = (pwm_cnt < pwm_duty) ? 1 : 0;
}
3、ADC 读取温度
c
uint Get_ADC(void) {
ADC_CONTR = 0x80 | 0x02; // 通道2
_nop_(); _nop_();
ADC_CONTR |= 0x40;
while (!(ADC_CONTR & 0x20));
return (ADC_RES << 2) | (ADC_RESL & 0x03);
}
4、温度转换
c
uint Get_Temp(void) {
uint adc;
adc = Get_ADC();
return (uint)(adc * 0.48 - 50); // 校准公式
}
5、PID 控制(增量式)
c
int err, err_last, err_sum;
#define KP 12
#define KI 2
#define KD 5
void PID_Control(uint cur_temp) {
int out;
err = TEMP_TARGET - cur_temp;
err_sum += err;
if (err_sum > 200) err_sum = 200;
if (err_sum < -200) err_sum = -200;
out = KP * err
+ KI * err_sum
+ KD * (err - err_last);
err_last = err;
if (out > 95) out = 95;
if (out < 0) out = 0;
pwm_duty = out;
}
6、主循环
c
void main(void) {
uint temp;
Timer0Init();
while (1) {
temp = Get_Temp();
if (temp < 600) {
PID_Control(temp);
LED_PIN = 1;
} else {
pwm_duty = 0; // 超温保护
LED_PIN = 0;
}
if (KEY_PIN == 0) {
pwm_duty = 0; // 睡眠
LED_PIN = 0;
}
if (SHAKE_PIN == 0) {
LED_PIN = 1; // 唤醒
}
for (uint i = 0; i < 30000; i++);
}
}
参考代码 STC15F104E编写的白光烙铁T12控制器 www.youwenfan.com/contentcsu/70216.html
五、调试与校准
校准步骤
- 烙铁加热到 300℃
- 用万用表测 ADC 值
- 调整公式:
c
temp = adc * K - B;
六、常见问题解决
| 问题 | 原因 | 解决 |
|---|---|---|
| 温度跳动大 | 放大倍数不稳 | 加 RC 滤波 |
| 不上温 | MOSFET 未导通 | 检查栅极驱动 |
| 一直满功率 | PID 参数过大 | 减小 KP |
| 休眠失效 | 振动开关误触 | 软件消抖 |