
前言
最近完成了一个经典的 51 单片机入门项目:数字温度计。这个项目非常适合初学单片机的同学练手,覆盖了单总线时序、LCD 液晶驱动、按键扫描、声光报警等知识点,也是单片机课程设计里高频选题。下面把整个设计思路、硬件电路、功能逻辑和踩坑点分享出来,附带 Proteus 原理图。
一、系统整体方案
本系统主控采用 AT89C51,使用 DS18B20 数字温度传感器采集环境温度,LCD1602 液晶实时显示当前温度与报警阈值;两个独立按键用来增加 / 减小报警阈值;当采集温度超过设定阈值时,触发蜂鸣器 + LED 指示灯声光报警。 整体分为 5 大模块:
- 主控最小系统(AT89C51、晶振、复位电路)
- DS18B20 温度采集模块(单总线)
- LCD1602 液晶显示模块
- 阈值调节按键模块
- 声光报警模块(PNP 三极管驱动蜂鸣器 + 红色 LED)
二、Proteus 原理图说明
- 主控电路:AT89C51 最小系统,11.0592MHz 晶振,上电复位 + 手动复位电路。
- 温度传感器 DS18B20:单总线协议,DQ 引脚接到 P3.7,只需要一根 IO 口就可以完成温度读取,测温范围 -55℃ ~ 125℃,精度 0.1℃。
- LCD1602 显示屏 :数据口接 P0 口,P0 口上拉排阻 RP1;RS 接 P2.7,EN 接 P2.6,两行显示:第一行展示当前温度
Now Tem:XX.X℃,第二行展示报警阈值Thresh:XX.X℃。 - 按键模块:P1.0 为阈值加按键,P1.1 为阈值减按键,按下可以修改报警温度阈值。
- 报警模块:P2.0 输出控制信号,PNP 三极管驱动蜂鸣器,同时搭配红色 LED,温度超限之后蜂鸣器响、红灯点亮。
三、实现功能清单
✅ DS18B20 实时采集温度,0.1℃分辨率 ✅ LCD1602 双行显示:实时温度 + 报警阈值 ✅ 两个独立按键,自由上调 / 下调报警阈值 ✅ 温度大于设定阈值,LED 点亮、蜂鸣器鸣叫声光报警 ✅ Proteus 仿真可直接运行,适合课程设计、毕设入门
四、核心原理简述
- DS18B20 单总线:严格遵循初始化、写时序、读时序,单片机发送指令启动温度转换,等待转换完成后读取两个字节温度数据,再做数据拼接、正负处理、小数点换算。时序是这个器件最容易踩坑的地方,延时一定要匹配。
- LCD1602 驱动 :分为写指令、写数据,先初始化液晶,再定位光标,分段打印字符串和数字。P0 口是开漏输出,必须加上排阻上拉,否则液晶大概率不显示或者乱码。
- 按键处理:采用软件消抖,检测按键按下后,延迟消抖再执行阈值增减,防止多次误触发。
- 报警逻辑 :每次读取温度后和阈值做对比,
当前温度 > 阈值就开启报警,温度回落之后自动关闭报警。
五、开发环境
- 代码编译:Keil C51
- 仿真平台:Proteus 8
- 编程语言:C 语言
六、常见踩坑记录(重点)
- DS18B20 时序不对,读出来固定 85℃:大概率是初始化、读写延时不准,单总线对时序非常敏感。
- LCD1602 黑屏 / 乱码:检查 P0 上拉排阻、RS/EN 引脚接线、液晶初始化指令。
- 蜂鸣器不响:注意三极管是 PNP 类型,电平逻辑和 NPN 相反,高电平关闭、低电平导通。
- 按键抖动,按一次阈值跳好几下:增加软件消抖延时,或者做边沿检测。
七、总结
这个数字温度计是单片机非常经典的综合项目,麻雀虽小五脏俱全。没有复杂外设,但是把 IO 控制、时序通信、人机交互、阈值判断都串起来了,非常适合巩固 51 单片机基础。
通过网盘分享的文件:仿真文件获取.zip
链接: https://pan.baidu.com/s/1V5zzxbpHc_fRqfGIzSdLfg?pwd=6666 提取码: 6666