news 2026/4/23 12:58:27

基于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/4/23 12:54:08

双模支持:CRNN OCR的WebUI与API接口开发指南

双模支持&#xff1a;CRNN OCR的WebUI与API接口开发指南 &#x1f4d6; 项目简介 在数字化转型加速的今天&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;文字识别技术已成为信息自动化处理的核心工具之一。无论是发票扫描、文档电子化&#xff0c;还是…

作者头像 李华
网站建设 2026/4/23 11:32:55

DevExpress vs 原生开发:效率对比实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 分别用原生HTML/CSS/JS和DevExpress MVC实现相同的员工信息管理系统&#xff0c;包含分页表格、表单验证和图表统计。输出两份完整代码并对比行数、开发时间和性能指标。点击项目生…

作者头像 李华
网站建设 2026/4/10 8:50:56

一站式宠物店服务系统 宠物商城系统小程序的设计与实现Thinkphp-Laravel框架项目源码开发实战

目录一站式宠物店服务系统与宠物商城小程序的设计与实现核心功能模块技术实现项目亮点项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理一站式宠物店服务系统与宠物商城小程序的设计与实现 该系统基于ThinkPHP-Laravel混合框架开发&#xff0c;整合…

作者头像 李华
网站建设 2026/4/18 3:15:30

基于CRNN的轻量级OCR:无GPU依赖的文字识别方案

基于CRNN的轻量级OCR&#xff1a;无GPU依赖的文字识别方案 &#x1f4d6; 项目简介 在数字化转型加速的今天&#xff0c;OCR&#xff08;光学字符识别&#xff09;技术已成为信息自动化处理的核心工具之一。无论是发票扫描、证件录入&#xff0c;还是文档电子化&#xff0c;OCR…

作者头像 李华
网站建设 2026/4/20 4:34:51

AI帮你搞定JAVA环境配置:快马平台一键生成安装脚本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个自动化JAVA安装脚本&#xff0c;要求&#xff1a;1. 支持Windows 11系统 2. 安装JDK 17 LTS版本 3. 自动配置JAVA_HOME环境变量 4. 包含安装后验证步骤 5. 输出中文提示…

作者头像 李华