51单片机读取DS18B20温度传感器:时序分析与代码实现

JUMU实名认证 发表于 2026-08-26 01:07 | 显示全部楼层 | 复制链接分享      上一主题  翻页  下一主题
DS18B20是一款非常经典的数字温度传感器,它把温度采集、模数转换和数字输出集成在单颗芯片里,使用单总线协议,只需一根数据线就能和单片机通信,还能在一条总线上挂多个器件分别读取地址,非常适合用在温控、环境监测等项目中。本文以51单片机为例,从单总线时序入手,完整实现温度读取。
一、DS18B20的基本特性DS18B20测温范围为-55℃到+125℃,精度在-10℃到+85℃区间内误差不超过0.5℃;默认12位分辨率,温度值以16位二进制补码形式存放在暂存器的第1、2字节(低字节在前)。它采用寄生供电或外部供电两种方式,外部供电时只需要VDD、GND、DQ三根线。单总线协议要求数据引脚通常要接一个4.7K的上拉电阻。DS18B20单总线通信的特点是时序严格,需要按微秒级精确控制,这也是学习本传感器的重点和难点。
二、单总线时序详解DS18B20的所有通信都由主机发起,关键时序有三种:复位脉冲、写时序和读时序。复位时序:主机拉低总线480~960us后释放,DS18B20会回应一个60~240us的存在脉冲,主机据此判断器件是否在线。写时序:主机拉低总线后,写0需保持低电平60us以上,写1则只需拉低1~15us即释放(DS18B20在主机拉低后的15~60us窗口采样)。读时序:主机拉低1~15us后释放,并在15us内读取总线电平。正是这些严格的微秒级时序,构成了单总线通信的基础。
三、读温度的实现流程一次完整的温度读取分四步:第一步复位并检测器件存在脉冲;第二步发送跳过ROM命令0xCC(单器件时用);第三步发送启动温度转换命令0x44,并等待转换完成(12位分辨率约需750ms,可用延时实现);第四步再次复位,发送跳过ROM命令后发送读暂存器命令0xBE,连续读取9个字节,其中前两字节就是温度数据。把两个字节拼成16位后,右移4位得到整数部分,低4位乘以0.0625得到小数部分,即可换算成实际温度值(单位℃)。
四、代码框架与常见问题排查编写驱动时建议封装成几个底层函数:ds18b20_reset()、ds18b20_write_byte()、ds18b20_read_byte()、ds18b20_read_temp(),上层程序调用起来非常清晰。常见问题有三类:一是读取温度恒为0xFFFF或0x0550,多半是时序不准确(延时误差过大),可重点检查复位和读时序;二是无法检测到存在脉冲,先检查接线、上拉电阻和供电;三是温度跳变,注意读数据时要关闭中断避免时序被打断。在Proteus中也可以直接用DS18B20仿真元件先调试时序,确认无误后再移植到实物,是51单片机温度采集学习的高效路径。

  距米网  

找到您想要的设计

工程师、学生在线交流学习平台
关注我们

手机版- JMCAD苏ICP备18040927号-1

©2017-2026 常州居居米智能技术有限公司 苏公网安备32041102000587号