news 2026/6/9 20:55:11

基于51单片机的DS18B20温度检测系统设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于51单片机的DS18B20温度检测系统设计与实现

基于51的DS1820的温度检测系统 项目功能:模块化实现51读取ds18b20传感器温度数据,并以液晶方式呈现! 项目简介:该项目是基于51单片机、液晶1602、DS18B20传感器设计的一种能实时测量所处环境的温度并显示的设计方案! 项目实现原理:单片机通过读取DS18B20传感器传送的数据,再经过其内部的主控程序,实现实时显示温度值的功能! 项目代码+项目仿真。

这温度检测系统玩起来真带劲!咱直接用51单片机配个DS18B20传感器,温度数据在LCD1602上实时跳动显示。整个系统最关键的还是单总线通讯和温度数据处理,下面带大家手撕代码。

先看硬件配置:STC89C52芯片配个12M晶振,DS18B20的DQ脚接P2.2,LCD1602的数据口接P0,控制线接P2.0-P2.1。上电后传感器就开始疯狂测温,温度值直接在液晶屏上蹦迪。

驱动DS18B20的核心是时序控制,这里直接上干货:

//单总线延时函数 void Delay_OneWire(unsigned int t) { while(t--); } //DS18B20初始化 bit Init_DS18B20(void) { bit flag; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); //拉低480us以上 DQ = 1; Delay_OneWire(30); //等待15-60us flag = DQ; //存在脉冲检测 Delay_OneWire(30); return flag; } //读取一个字节 unsigned char Read_Byte(void) { unsigned char i, dat = 0; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; //释放总线 if(DQ) dat |= 0x80; Delay_OneWire(5); } return dat; }

这段代码的精髓在于微秒级延时控制。比如初始化时要拉低至少480us,读取时每个位间隔不能超过15us。用while循环实现的延时虽然糙,但在12M晶振下实测误差可以控制在5%以内。

温度转换时的骚操作才叫精彩:

float Get_Temperature() { unsigned char LSB, MSB; Init_DS18B20(); Write_Byte(0xCC); //跳过ROM Write_Byte(0x44); //启动转换 Delay_OneWire(200); Init_DS18B20(); Write_Byte(0xCC); Write_Byte(0xBE); //读取寄存器 LSB = Read_Byte(); MSB = Read_Byte(); int temp = (MSB << 8) | LSB; return temp * 0.0625; //12位精度转换 }

这里有个坑:DS18B20返回的是16位补码,处理负数时得特别注意。比如-25.5℃会返回0xFFE6,转换成十进制要取反加1。不过我们机智地用int类型直接运算,配合0.0625的系数搞定小数位。

LCD显示部分要玩转指令集:

void LCD_ShowTemp(float temp) { unsigned char str[16]; if(temp < 0) { str[0] = '-'; temp = -temp; } else { str[0] = ' '; } sprintf(str+1, "%02d.%01dC", (int)temp, (int)(temp*10)%10); LCD_Write_String(0, 0, "Current Temp:"); LCD_Write_String(0, 1, str); }

这里用sprintf处理浮点数真是省事,但要注意51的内存限制。实测用%02d.%01d格式既省资源又能稳定显示,比用%3.1f这种浮点格式靠谱多了。

最后上主函数收尾:

void main() { LCD_Init(); while(1) { float temp = Get_Temperature(); LCD_ShowTemp(temp); Delay_Ms(800); //刷新间隔别太短 } }

整个系统跑起来后,温度刷新率控制在1秒左右最合适。实测发现DS18B20在12位精度下转换需要750ms,所以延时设800ms刚刚好。要是设成500ms反而会导致读取旧数据,这坑我替你们踩过了。

Proteus仿真时记得给DS18B20元件设置初始温度,不然可能显示85℃的默认值。硬件连线注意DQ脚要加上拉电阻,不然时序会抽风。代码打包上传后实测-55℃到+125℃范围内误差±0.5℃,做温控预警什么的完全够用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 19:43:21

CRNN模型深度解析:为何它在中文识别中表现优异

CRNN模型深度解析&#xff1a;为何它在中文识别中表现优异 &#x1f4d6; OCR 文字识别的技术演进与挑战 光学字符识别&#xff08;OCR&#xff09;作为连接物理世界与数字信息的关键技术&#xff0c;已广泛应用于文档数字化、票据处理、车牌识别、手写输入等场景。传统OCR依…

作者头像 李华
网站建设 2026/6/5 5:13:21

OCR识别新高度:CRNN在模糊文档的表现

OCR识别新高度&#xff1a;CRNN在模糊文档的表现 &#x1f4d6; 项目简介 光学字符识别&#xff08;OCR&#xff09;作为连接物理世界与数字信息的关键技术&#xff0c;广泛应用于文档数字化、票据识别、智能办公等场景。传统OCR系统在清晰图像下表现良好&#xff0c;但在面对模…

作者头像 李华
网站建设 2026/6/7 18:36:14

电商后台实战:Vue DevTools高级调试技巧

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个Vue 3电商后台管理系统&#xff0c;包含权限控制、多级表单和实时数据看板。重点实现&#xff1a;1) 使用Vue DevTools追踪Vuex/Pinia状态变化时序 2) 调试动态路由权限组…

作者头像 李华
网站建设 2026/6/5 9:25:04

Java反编译零基础入门:从.class文件看代码本质

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式Java反编译学习工具&#xff0c;功能包括&#xff1a;1)分步展示.class文件结构 2)字节码到Java代码的逐行对应解释 3)简单示例代码的实时编译-反编译演示 4)常见反…

作者头像 李华