我用 51 单片机做了一个“空调控制器”:红外遥控 + PWM 风扇调速(项目开源)
🚀项目开源地址:Simple Thermostatic Control System on GitHub
🧠 项目简介
这篇文章分享的是我在《单片机课程设计》期间独立完成的一个嵌入式项目——简易恒温控制系统。项目基于 STC90C516RD+ 单片机,模拟空调的基本功能,支持:
-
实时温度采集(DS18B20)
-
PWM 控制电机风扇(调速控温)
-
LCD1602 显示工作状态
-
支持红外遥控调速
-
支持电位器手动调速
-
超温报警(蜂鸣器)
虽然是教学项目,但我按照“能开源就尽量工程化”的原则整理了整个源码、文档,已在 GitHub 上完整开源:
👉 https://github.com/liehuf/embedded_projects/tree/main/Simple_thermostatic_control_system
🖥️ 系统功能结构
-
控制核心:STC90C516RD+ 单片机
-
温度检测:DS18B20 数字温度传感器(单总线)
-
人机交互:
-
LCD1602 实时显示温度与状态
-
红外遥控(NEC 协议)调速
-
电位器输入(ADC)调速
-
-
风扇控制:PWM 模拟输出控制直流电机
-
异常报警:蜂鸣器(温度超过设定阈值)
🧱 硬件组成简述
| 模块 | 说明 |
|---|---|
| MCU | STC90C516RD+,C语言开发 |
| 传感器 | DS18B20,单总线协议,12bit 精度 |
| 显示模块 | LCD1602(并口,P2 控制) |
| PWM调速 | 软PWM,Timer0 中断生成,占空比可调 |
| 红外遥控 | 外部中断INT0 + NEC协议解码 |
| ADC模块 | ET2046(SPI接口),连接电位器调速 |
| 蜂鸣器 | 阻塞式驱动,带提示与报警两种模式 |
🧠 软件逻辑与控制流程
系统采用主循环 + 中断控制结构。
🔁 主程序逻辑:
while (1) {
1. 读取温度
2. 判断工作模式
3. 根据温度/调速输入调整 PWM
4. LCD1602 更新状态显示
5. 延时1秒,进入下一次循环
}
🧠 三种运行模式:
-
自动控温模式:
-
温度 > 设定值(26°C):
-
0°C:PWM = 64
-
2°C:PWM = 128
-
4°C:PWM = 192
-
-
自动报警 + 调速
-
-
红外手动模式:
-
遥控器选择低/中/高 三档速度
-
-
电位器调速模式:
-
ADC采集电压值(0~4095)→ 分段映射 → 占空比调整
-
⚙️ 调试与踩坑记录
-
✅ DS18B20温度值不稳定 → 关闭中断再采集(防干扰)
-
✅ LCD乱码闪烁 → 修复数码管残余代码+优化延时
-
✅ PWM无法调速 → 初始化 duty=0,PWM占空比未设置
-
✅ 红外遥控无响应 → 电池没电(调了半天…)
-
✅ 电位器调速不灵敏 → ADC 映射逻辑调整成分段控制
-
✅ 蜂鸣器响个不停 → 调整
Buzz_time()实现按场景分别响
📂 项目结构说明
项目已按嵌入式工程化风格整理为如下目录:
Simple_thermostatic_control_system/
├── src/ # 主程序与模块代码(.c/.h)
├── hardware/ # 接线说明
├── doc/ # 设计报告
├── README.md # 项目说明
└── LICENSE # MIT开源协议
📦 项目地址(欢迎 Star)
👉 https://github.com/liehuf/embedded_projects/tree/main/Simple_thermostatic_control_system
📌 工程师的思维体会
这次项目让我意识到:
“代码能跑不等于系统能跑。”
我们常常掉进“功能写完了,项目就完成了”的陷阱,但嵌入式系统最大的问题是系统整合和调试。
调试中每一个小问题——电机转不动、温度采集乱跳、LCD 闪烁——都不是“代码写错”,而是“系统兼容性问题”,这才是工程师该练的能力。
每一个 bug 解决掉之后,项目就更像一个“真·产品”。
💬 如果你有兴趣一起搞项目,可以联系我!
欢迎交流嵌入式、Rust、51单片机项目等技术,有空我也会更新一些【项目复盘】和【竞赛模板】干货~
更多推荐

所有评论(0)