1. 项目背景与需求分析
潮湿的回南天里,晾晒的衣物总是难以干透,传统烘干机又耗电量大且功能单一。基于这个痛点,我决定用AT89C52单片机开发一款智能烘干机。这个项目需要实现以下几个核心功能:
- 冷热风切换功能:用户可以根据需要选择吹冷风或热风
- 智能节能控制:通过红外感应实现有人时工作,无人时自动断电
- 可视化操作界面:LCD显示屏实时显示时间和工作状态
- 可调工作时间:用户可以自行设置烘干时长
选择AT89C52单片机主要基于以下考虑:
- 成本低廉,适合DIY项目
- 51内核架构简单,开发门槛低
- 具备足够的I/O口和定时器资源
- 个人有丰富的51单片机开发经验
2. 硬件设计与选型
2.1 核心控制器电路
AT89C52最小系统需要以下基本电路:
- 复位电路:采用10kΩ上拉电阻和10μF电容组成RC复位
- 时钟电路:使用12MHz晶振配合30pF负载电容
- 电源电路:AMS1117-5.0稳压芯片将输入电压稳定在5V
注意:晶振要尽量靠近单片机引脚,走线要短,否则容易导致时钟不稳定
2.2 人机交互模块
按键部分采用4个轻触开关:
- S1:冷热风切换
- S2:进入时间设置模式
- S3:时间+
- S4:时间-
显示部分选用LCD1602液晶屏:
- 第一行显示当前时间
- 第二行显示工作状态和剩余时间
状态指示灯:
- 红色LED:加热状态
- 黄色LED:送风状态
2.3 执行机构设计
温度控制部分:
- 加热元件:5V/20W陶瓷发热片
- 驱动电路:IRF540N MOSFET管配合PC817光耦隔离
- 温度检测:DS18B20数字温度传感器
送风系统:
- 选用5V/0.2A直流风扇
- 直接由单片机I/O口驱动
红外感应模块:
- HC-SR501人体红外传感器
- 检测距离可调(0-7米)
- 延时时间可调(5-200秒)
3. 软件设计与实现
3.1 系统主流程设计
系统采用前后台架构:
- 主循环处理用户界面和状态显示
- 定时器中断处理PWM生成和时间基准
- 外部中断处理紧急停止功能
c复制void main() {
system_init();
while(1) {
key_process();
display_update();
mode_control();
}
}
3.2 按键处理实现
采用状态机实现按键消抖:
c复制typedef enum {
KEY_IDLE,
KEY_PRESS,
KEY_RELEASE
} KeyState;
uint8_t key_scan() {
static KeyState state = KEY_IDLE;
static uint16_t debounce_cnt = 0;
switch(state) {
case KEY_IDLE:
if(!KEY_INPUT) {
state = KEY_PRESS;
debounce_cnt = 0;
}
break;
case KEY_PRESS:
if(++debounce_cnt >= 10) { // 10ms消抖
if(!KEY_INPUT) {
state = KEY_RELEASE;
return get_key_value();
} else {
state = KEY_IDLE;
}
}
break;
case KEY_RELEASE:
if(KEY_INPUT) state = KEY_IDLE;
break;
}
return KEY_NONE;
}
3.3 红外感应处理
红外信号采用三级滤波算法:
c复制#define FILTER_LEVEL 3
bit human_detect() {
static uint8_t filter_cnt = 0;
if(IR_PIN) {
if(++filter_cnt >= FILTER_LEVEL) {
filter_cnt = FILTER_LEVEL;
return 1;
}
} else {
if(filter_cnt > 0) filter_cnt--;
}
return (filter_cnt >= FILTER_LEVEL);
}
3.4 PWM温度控制
使用定时器0产生10kHz PWM波:
c复制void timer0_init() {
TMOD &= 0xF0; // 设置定时器0模式1
TMOD |= 0x01;
TH0 = 0xFF; // 100us中断
TL0 = 0x9C;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 {
static uint16_t pwm_cnt = 0;
TH0 = 0xFF;
TL0 = 0x9C;
if(++pwm_cnt >= 1000) pwm_cnt = 0;
HEAT_PIN = (pwm_cnt < heat_duty) ? 1 : 0;
}
3.5 时间管理
使用独立看门狗作为时间基准:
c复制void watchdog_init() {
WDT_CONTR = 0x34; // 2s超时
}
void watchdog_isr() interrupt 6 {
if(countdown > 0) countdown--;
if(countdown == 0) system_stop();
WDT_CONTR |= 0x10; // 喂狗
}
4. 调试经验与问题解决
4.1 常见问题排查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 系统不启动 | 电源接反/短路 | 检查电源极性,测量各点电压 |
| LCD显示乱码 | 初始化时序不对 | 调整初始化延时,检查接线 |
| 加热不稳定 | MOSFET驱动不足 | 增加光耦隔离,检查栅极电阻 |
| 红外误触发 | 环境干扰 | 增加软件滤波,调整传感器灵敏度 |
| PWM控制不灵 | 定时器配置错误 | 检查定时器初值和中断设置 |
4.2 关键调试技巧
- 电源处理:
- 数字和模拟部分分开供电
- 每个IC旁边放置0.1μF去耦电容
- 大电流线路加粗走线
- 抗干扰设计:
- 信号线远离功率线路
- 关键信号采用屏蔽线
- 适当增加上拉/下拉电阻
- 调试方法:
- 分段调试,先确保最小系统正常工作
- 使用LED指示灯辅助调试
- 善用串口打印调试信息
重要提示:焊接MOS管时一定要做好防静电措施,我的前两片IRF540N就是被静电击穿的
5. 成品测试与优化
5.1 性能测试数据
| 测试项目 | 测试结果 | 达标要求 |
|---|---|---|
| 冷风风速 | 2.5m/s | ≥2m/s |
| 热风温度 | 55℃ | 50-60℃ |
| 待机功耗 | 0.5W | ≤1W |
| 工作功耗 | 25W | ≤30W |
| 响应时间 | 1.5s | ≤3s |
5.2 使用体验优化
- 增加预热提示功能:
c复制if(heat_flag && temp < 40) {
lcd_show("Preheating...");
delay_ms(1000);
}
- 改进时间设置逻辑:
- 长按加速调整
- 设置超时自动退出
- 增加安全保护:
c复制if(temp > 70) { // 过热保护
heat_duty = 0;
alarm();
}
6. 项目总结与改进方向
经过两周的开发和调试,这个基于AT89C52的智能烘干机基本实现了预期功能。实测烘干一双袜子约需25-30分钟,相比商用烘干机虽然效率不高,但胜在功耗低且具有智能控制功能。
主要改进方向:
- 改用STM32F103提升处理能力
- 增加蓝牙/WiFi远程控制
- 优化风道设计提高热效率
- 加入湿度传感器实现自动停机
这个项目最大的收获是深入理解了如何将单片机应用于家电控制,特别是在抗干扰和安全性设计方面积累了不少实战经验。虽然过程中踩了不少坑,但最终看到湿袜子被成功烘干时,那种成就感是无可替代的。