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显示温度。

相关推荐
xx~t3 小时前
嵌入式——51单片机3
linux·c语言·嵌入式硬件·51单片机
sunoo-2293 小时前
【51单片机实战】温控下位机完整实现:DS18B20采集 + 自定义二进制串口协议 + PWM声光告
笔记·学习·51单片机·串口
m0_752753128 小时前
51单片机中的定时器和中断等
单片机·51单片机
AAA代码批发商8 小时前
DAYS41 UART 串口通信 + DS18B20 单总线温度传感器
嵌入式硬件·51单片机
祖力558 小时前
DS18B20数字温度传感器
51单片机·ds18b20·数字温度传感器
祖力5521 小时前
快速学会51单片机基础
单片机·嵌入式硬件·51单片机
susplus1 天前
【51单片机通信协议】串口
51单片机·串口·嵌入式·通信协议
晊晌_h1 天前
嵌入式从0到精通——51单片机(二)
嵌入式硬件·51单片机
2401_862880821 天前
UART 通信协议
单片机·51单片机