通信方式:半双工、异步、串行 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 |
关键点:
-
GPIO有输出模式、输入模式两种状态。
-
拉高=释放总线:当单片机作为数据接收方,必须释放总线,不能强行驱动总线电平,交给外部器件控制总线。
-
读取到的温度是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 复位时序(初始化)
复位用来通知传感器,开始一次通信。
-
主机(51单片机)把总线拉低,保持480μs ~ 960μs,输出复位脉冲。
-
主机释放总线,延时1560μs。
-
DS18B20检测到总线释放,将总线拉低60240μs,发出存在脉冲(响应脉冲)。
-
DS18B20释放总线,总线回到高电平,复位初始化完成。
4.2 写时序 write_ds18b20(unsigned char dat)
写时序分为写0、写1,主机向传感器发送指令/数据,字节低位先发。
写'0'时序
-
主机拉低总线,维持60μs ~ 120μs。
-
DS18B20会在1560μs窗口采样总线,此时总线低电平,识别为发送0。
-
主机释放总线,结束写0。
写'1'时序
-
主机拉低总线小于15μs,立刻释放总线。
-
DS18B20在1560μs采样,总线为高电平,识别为发送1。
注意:两次写bit之间,需要留出至少1μs间隔。
4.3 读时序(主机读取传感器数据)
主机每读取一位,都需要执行读时隙。
读'1'时序
-
主机把总线拉低,保持大于1μs,然后立刻释放总线。
-
DS18B20不驱动总线,总线保持高电平。
-
主机必须在15μs之内采样总线电平,读到高电平代表bit为1。
读'0'时序
-
主机拉低总线大于1μs,释放总线。
-
DS18B20会主动把总线拉低,代表传输bit0。
-
主机15μs内采样总线,低电平,读到bit为0。
重要坑点:读时隙采样窗口只有15μs,采样不能太晚,晚了总线电平已经变化,读到错误数据。
五、开发常见踩坑总结
-
时序延时不准:51单片机不同晶振,us延时函数要校准,时序时间是DS18B20驱动最大坑。
-
忘记等待转换时间:发送0x44转换指令,必须等待750ms,立刻读温度会拿到旧数据。
-
接收数据没有释放总线:单片机读数据时IO必须切换输入模式释放总线,不能一直强行输出高/低。
-
温度原始数据是二进制补码:负温度需要做符号扩展,直接打印原始数值会出错。
-
0xCC跳过ROM指令只适合单传感器,一条总线挂载多个DS18B20不能使用该指令。
六、小结
DS18B20的难点不在硬件接线,核心在于单总线严格时序:复位、写bit、读bit三个时序要严格按照手册时间编写。流程记住:复位→发指令启动转换→等待转换完成→复位→发读寄存器指令→读取两字节原始温度,再解析补码换算成实际温度。
后续可以基于这套时序,完成51单片机完整驱动代码,数码管或者LCD1602显示温度。