DS18B20数字温度传感器超详细学习笔记|51单片机单总线通信

通信方式:半双工、异步、串行 OneWire单总线,一根GPIO信号线完成单片机与传感器双向通信。

一、DS18B20核心参数

|------------|---------------------------------------------------------------|
| 参数 | 说明 |
| 温度量程 | -55℃ ~ 125℃ |
| 测量精度 | ±0.5℃,例如真实温度 25℃,传感器返回范围 24.525.5℃ |
| 分辨率 | 9 位:0.5℃;10 位:0.25℃;11 位:0.125℃;12 位:0.0625℃,分辨率越高可以识别越小的温度变化 |
| 工作电压 | 3V5.5V,兼容 51 单片机 IO 电平 |

分辨率概念:分辨率越高,传感器对微小温度变化越敏感,温度读数越细腻。

二、单总线One-Wire基础理解

DS18B20采用单总线通信,一根信号线实现双向通信,具备线与特性。

线与逻辑真值表

|-------------------|--------------------|----------------|
| 单片机 IO 输出 | DS18B20 输出 | 总线实际电平 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
| 0 | 0 | 0 |

关键点:

  1. GPIO有输出模式、输入模式两种状态。

  2. 拉高=释放总线:当单片机作为数据接收方,必须释放总线,不能强行驱动总线电平,交给外部器件控制总线。

  3. 读取到的温度是16位数据,二进制补码,需要做符号位扩展处理。

三、DS18B20完整测温工作流程

完整读取一次温度的执行顺序:

ds18b20_reset(); //1.复位DS18B20,初始化单总线

write_ds18b20(0xCC); //2.发送0xCC,跳过ROM指令,单点传感器可以直接跳过ROM匹配

write_ds18b20(0x44); //3.发送0x44,启动温度转换

delay_ms(750); //4.等待温度转换完成,至少750ms

ds18b20_reset(); //再次复位

write_ds18b20(0xBE); //5.发送0xBE,读取温度寄存器指令

//6.读取2字节温度原始数据,后续解析补码得到真实温度

指令说明:

  • 0xCC:Skip ROM跳过ROM,只有总线上只有1个DS18B20时使用;多个传感器不能用这条指令。

  • 0x44:启动温度转换,传感器内部完成AD采样,需要等待转换时间。

  • 0xBE:读取暂存寄存器,返回2字节温度原始值。

四、关键时序详解(单总线时序是驱动重点)

时序是DS18B20驱动最容易踩坑的地方,延时时间一定要严格遵守,时序错就会读不出温度或者读数乱跳。

4.1 复位时序(初始化)

复位用来通知传感器,开始一次通信。

  1. 主机(51单片机)把总线拉低,保持480μs ~ 960μs,输出复位脉冲。

  2. 主机释放总线,延时1560μs。

  3. DS18B20检测到总线释放,将总线拉低60240μs,发出存在脉冲(响应脉冲)。

  4. DS18B20释放总线,总线回到高电平,复位初始化完成。

4.2 写时序 write_ds18b20(unsigned char dat)

写时序分为写0、写1,主机向传感器发送指令/数据,字节低位先发。

写'0'时序

  1. 主机拉低总线,维持60μs ~ 120μs。

  2. DS18B20会在1560μs窗口采样总线,此时总线低电平,识别为发送0。

  3. 主机释放总线,结束写0。

写'1'时序

  1. 主机拉低总线小于15μs,立刻释放总线。

  2. DS18B20在1560μs采样,总线为高电平,识别为发送1。

注意:两次写bit之间,需要留出至少1μs间隔。

4.3 读时序(主机读取传感器数据)

主机每读取一位,都需要执行读时隙。

读'1'时序

  1. 主机把总线拉低,保持大于1μs,然后立刻释放总线。

  2. DS18B20不驱动总线,总线保持高电平。

  3. 主机必须在15μs之内采样总线电平,读到高电平代表bit为1。

读'0'时序

  1. 主机拉低总线大于1μs,释放总线。

  2. DS18B20会主动把总线拉低,代表传输bit0。

  3. 主机15μs内采样总线,低电平,读到bit为0。

重要坑点:读时隙采样窗口只有15μs,采样不能太晚,晚了总线电平已经变化,读到错误数据。

五、开发常见踩坑总结

  1. 时序延时不准:51单片机不同晶振,us延时函数要校准,时序时间是DS18B20驱动最大坑。

  2. 忘记等待转换时间:发送0x44转换指令,必须等待750ms,立刻读温度会拿到旧数据。

  3. 接收数据没有释放总线:单片机读数据时IO必须切换输入模式释放总线,不能一直强行输出高/低。

  4. 温度原始数据是二进制补码:负温度需要做符号扩展,直接打印原始数值会出错。

  5. 0xCC跳过ROM指令只适合单传感器,一条总线挂载多个DS18B20不能使用该指令。

六、小结

DS18B20的难点不在硬件接线,核心在于单总线严格时序:复位、写bit、读bit三个时序要严格按照手册时间编写。流程记住:复位→发指令启动转换→等待转换完成→复位→发读寄存器指令→读取两字节原始温度,再解析补码换算成实际温度。

后续可以基于这套时序,完成51单片机完整驱动代码,数码管或者LCD1602显示温度。

相关推荐
橘为己有4412 天前
51单片机:定时/计数器
单片机·51单片机
wuyk5553 天前
嵌入式故障诊断-Bug002-局部大数组压栈高温必死机
stm32·单片机·嵌入式硬件·mcu·物联网·51单片机·嵌入式实时数据库
橘为己有4413 天前
51单片机:流水灯
单片机·51单片机
木子单片机9 天前
基于单片机的直流电机调速系统设计
单片机·嵌入式硬件·51单片机·nosql·keil
智者知已应修善业10 天前
【51单片机实现从下到上,从上到下,从中间到两边,两边到中间】2024-10-23
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
Sakura_j_h_11 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
动词ing12 天前
【学习笔记】51单片机 模块化编程
笔记·学习·51单片机
糖糖单片机设计12 天前
基于 STM32 + LU-ASR01 的智能台灯
stm32·单片机·嵌入式硬件·51单片机·语音识别
笨笨饿14 天前
#60_# 一、Photoshop 2025 如何批量导出 PSD 文件中的所有图层为独立 PNG 图片
stm32·单片机·嵌入式硬件·物联网·ui·51单片机·photoshop
木子单片机15 天前
基于单片机的DS18B20温度传感器测温系统设计
单片机·嵌入式硬件·51单片机·keil