一、DS18B20 核心参数
参数项 | 规格说明 |
供电电压 | 3.0V ~ 5.5V,支持寄生供电(仅靠数据线供电,无需外接电源) |
测温范围 | -55℃ ~ +125℃ |
测量精度 | -10℃ ~ +85℃ 范围内误差 ≤ ±0.5℃ |
分辨率 | 可编程 9/10/11/12 位,出厂默认12 位- 12 位:0.0625℃ 分辨率,最大转换时间 750ms - 11 位:0.125℃,375ms - 10 位:0.25℃,187.5ms - 9 位:0.5℃,93.75ms |
通信接口 | 单总线(1-Wire),仅需 1 根数据线 + 地线即可通信 |
内置存储 | 片内 EEPROM,可保存温度报警阈值、分辨率配置 |
多设备支持 | 同一根总线上可挂载多个 DS18B20,通过 64 位唯一 ROM 地址区分 |
二、单总线通信基础:线与特性与上拉电阻
1. 线与(Wire-AND)特性
DS18B20 的 DQ 数据引脚采用 \\开漏输出(Open Drain)\\结构,自身无法输出高电平,只能输出低电平或高阻态,所有挂载在单总线上的器件共享这一特性:
总线电平由所有器件共同决定:只要有任意一个器件拉低总线,总线就为低电平;只有所有器件都释放总线,总线才会回到高电平。
这就是 “线与” 逻辑:全高才为高,有低则为低。
作用:天然支持多器件组网,无需复杂的总线仲裁,靠硬件电平特性避免冲突。
2. 上拉电阻
必要性:由于器件都是开漏输出,自身不能输出高电平,必须外接上拉电阻才能让总线回到空闲高电平。没有上拉电阻时总线永远为低,完全无法通信。
典型取值:4.7kΩ(最常用),合理范围 1kΩ ~ 10kΩ。
阻值过小:总线拉低时电流过大,功耗升高,甚至损坏器件
阻值过大:总线上升沿过慢,信号失真,通信距离缩短
接法:一端接 DQ 数据线,另一端接系统 VCC(3.3V/5V),靠近单片机端放置效果最佳。
寄生供电模式下,上拉电阻还负责在总线高电平时为 DS18B20 充电供电。
三、核心通信时序
所有通信都由主机(单片机)发起,以总线拉低作为时隙起始,严格遵循时间窗口要求。
1. 复位 + 存在脉冲(初始化时序)
每次通信的第一步,用于确认器件在线、同步总线。
主机发送复位脉冲:拉低总线≥ 480μs
主机释放总线:切换为输入模式,等待从机响应
从机回复存在脉冲:检测到总线上升沿后,等待 15\60μs,然后拉低总线 60\240μs
从机释放总线:总线回到高电平,初始化完成
成功标志:主机释放总线后,在 15~60μs 窗口内检测到低电平,即表示器件存在。 对应你的代码:复位拉低 700μs、释放后等待 50μs 再检测,符合标准时序要求。
2. 写时序(主机向从机写 1 位)
每个写时隙 ≥ 60μs,两个时隙之间至少间隔 1μs。
写 1 时序:
主机拉低总线
15μs 内释放总线,由上拉电阻拉高
剩余时间保持时隙长度(总时长 ≥ 60μs)
写 0 时序:
主机拉低总线
保持低电平 ≥ 60μs
释放总线
DS18B20 会在主机拉低后的 15~60μs 窗口内采样总线电平,判断写入的是 0 还是 1。
3. 读时序(主机从从机读 1 位)
读时隙同样由主机发起,数据有效窗口极短,必须严格控制读取时机。
主机拉低总线≥ 1μs
主机立刻释放总线,并在释放后 15μs 内读取总线电平
整个时隙总时长 ≥ 60μs,两个时隙之间至少间隔 1μs
关键:从机输出的数据仅在主机拉低后的 15μs 内有效,必须在这个窗口内完成读取,否则数据会失效。
四、完整温度采集流程(单器件场景)
对应你代码中get_temp()的执行逻辑,分为「启动转换」和「读取结果」两大步,每步都需要先复位初始化。
第一步:启动温度转换
主机发送复位脉冲,检测存在脉冲,确认器件在线
主机发送ROM 指令 0xCC(跳过 ROM / Skip ROM):总线上只有 1 个 DS18B20 时使用,跳过 64 位 ROM 地址匹配
主机发送功能指令 0x44(启动温度转换 / Convert T)
等待转换完成:12 位分辨率下最多等待 750ms(你的代码用 1s 是留了安全余量)
第二步:读取温度结果
主机再次发送复位脉冲,检测存在脉冲
主机发送 ROM 指令 0xCC(跳过 ROM)
主机发送功能指令 0xBE(读暂存器 / Read Scratchpad)
从机依次输出暂存器的 9 个字节,主机按顺序读取:
字节 0:温度低字节(TL)
字节 1:温度高字节(TH)
字节 2:高温报警阈值
字节 3:低温报警阈值
字节 4:配置寄存器(设置分辨率)
字节 5~7:保留位
字节 8:CRC 校验字节
读取前 2 字节即可计算温度值;读完 9 字节可做 CRC 校验,提升通信可靠性。
多器件场景:不能使用 0xCC 指令,需要用 0x55(匹配 ROM)+ 64 位器件地址,选中指定的 DS18B20。
五、温度数据格式与计算
DS18B20 输出 16 位二进制补码,高字节在前、低字节在后,12 位分辨率下格式如下:
位序号 | 15~11 | 10~4 | 3~0 |
含义 | 符号位 S | 温度整数部分 | 温度小数部分 |
正温度:符号位全为 0
负温度:符号位全为 1
计算公式(12 位分辨率)
温度值(℃) = 16位原始短整型值 × 0.0625
由于 C 语言中short类型天然支持补码运算,直接相乘即可自动处理正负温度,和你代码中的写法完全一致。
示例:
+25.0℃ → 原始值
0x0190→ 400 × 0.0625 = 25.0℃-10.0℃ → 原始值
0xFF60→ -160 × 0.0625 = -10.0℃