DS18B20
硬件核心 · 死都要记住
核心特性
-
通信接口:1-Wire 单总线,仅需 1 个 I/O 管脚 + 地线通信
-
唯一标识:内置 64 位唯一序列号,支持单总线多设备组网
-
供电方式:数据线寄生供电 / 外部 3.0V~5.5V 供电,无需额外电源
-
硬件设计:无需外围元件,电路简单,支持分布式多路温度采集
-
测量指标:量程 - 55℃ ~ +125℃;-10℃~85℃范围内精度 ±0.5℃
-
分辨率:用户自定义 9~12 位,对应不同转换时间和测量精度
-
附加功能:可编程非易失性存储器,支持过温 / 低温报警触发
一句话核心:单总线通信、12位分辨率、补码输出、三步操作
引脚(TO-92封装,底部视角)
常见封装
-
TO-92:最常见的直插封装,引脚为 GND、DQ、VDD(从左到右,底部视角)。
-
SO (150 mils) / DS18B20Z:贴片封装。
-
μSOP / DS18B20U:小型贴片封装。
引脚功能
| 引脚名称 | 功能说明 |
|---|---|
| GND | 地线,必须连接到系统地。 |
| DQ | 单总线通信接口,同时在寄生电源模式下作为供电端口;需外接约 10kΩ 上拉电阻。 |
| VDD | 外部电源输入(3.0V–5.5V);在寄生模式下可接地,用于芯片识别 VDD 状态。 |
| N.C. | 未连接引脚,使用时悬空即可。 |
电路铁律
-
DQ必须接10kΩ上拉电阻 → 否则通信失败
-
唯一I/O口,单总线 = 1根线既供电又通信
温度数据格式
16位补码,分辨率0.0625℃
高8位(MSB) + 低8位(LSB) = 16位有符号整数
实际温度 = 16位整数值 ÷ 16.0
位分配(12位模式)
| 位 | 15~11 | 10~4 | 3~0 |
|---|---|---|---|
| 含义 | 符号位(S) | 7位整数 | 4位小数 |
| 说明 | 全S=负数 | 0~127 | 0.0625℃/位 |
经典数值 · 背下来
| 温度 | 十六进制 | 二进制 | 特征 |
|---|---|---|---|
| +85℃ | 0x0550 | 0000 0101 0101 0000 | 上电默认值 |
| +25.0625 | 0x0191 | 0000 0001 1001 0001 | 0.0625精度演示 |
| +0.5 | 0x0008 | 0000 0000 0000 1000 | 小数位=1000 |
| -0.5 | 0xFFF8 | 1111 1111 1111 1000 | 补码负温度 |
| -55 | 0xFC90 | 1111 1100 1001 0000 | 量程下限 |
记忆口诀:
正数直接除16,负数补码取反加一除16
寄存器结构 · 读写要清楚
高速暂存器(9字节,只读前2字节)
共 9 个字节,上电复位后默认值为 0x0550(对应 85℃):
| 地址 | 名称 | 类型 | 复位值 | 说明 |
|---|---|---|---|---|
| 0 | 温度值低 8 位(LSB) | 只读 | 0x50 | 温度数据的低 8 位,包含小数部分 |
| 1 | 温度值高 8 位(MSB) | 只读 | 0x05 | 温度数据的高 8 位,包含符号位和整数部分 |
| 2 | TH 或用户字节 1 | 读写 | EEPROM | 温度报警高值(补码),可写入 EEPROM 保存 |
| 3 | TL 或用户字节 2 | 读写 | EEPROM | 温度报警低值(补码),可写入 EEPROM 保存 |
| 4 | 配置寄存器 CR | 读写 | EEPROM | 用于设置温度分辨率(9–12 位) |
| 5–7 | 保留位 | 只读 | 0xFF, 0x0C, 0x10 | 厂家保留,不可修改 |
| 8 | CRC 校验字节 | 只读 | - | 暂存器 0–7 数据的 CRC 校验码 |
配置寄存器(重点)
| 分辨率 | 位b6~b5 | 精度 | 转换时间 | 考频 |
|---|---|---|---|---|
| 9位 | 00 | 0.5℃ | 94ms | |
| 10位 | 01 | 0.25℃ | 188ms | |
| 11位 | 10 | 0.125℃ | 375ms | |
| 12位 | 11 | 0.0625℃ | 750ms |
默认/最常用:12位
改分辨率:0x4E → 写TH/TL/配置寄存器
单总线时序 · 三步不能乱(工作流程)
铁律:初始化 → ROM指令 → 功能指令
顺序错一步,设备就装死
1. 初始化 DS18B20(最关键时序)(复位+存在脉冲)
-
单片机拉低总线至少 480us(复位脉冲),然后释放总线(拉高)
-
DS18B20 检测到后,拉低总线60~240us(存在脉冲)作为应答
-
单片机在 60~240us 内读取总线电平,低电平 = 初始化成功,高电平 = 失败
-
DS18B20 释放总线后,总线由上拉电阻拉回高电平
bit init_ds18b20(void)
{
bit initflag;
DQ = 1; Delay_onewire(12);
DQ = 0; Delay_onewire(80); // 拉低480us+
DQ = 1; Delay_onewire(10); // 释放+等待应答
initflag = DQ; // 0=成功,1=失败
Delay_onewire(5);
return initflag;
}
成功标志:initflag = 0
失败原因:上拉电阻没接/线序错/时序不对
2. 执行 ROM 指令(单设备无脑0xCC)
总线上仅 1 个 DS18B20 时,直接发跳过 ROM 指令 0xCC(蓝桥杯重点);多设备需用搜索 ROM(0xF0)/ 读取 ROM(0x33)。
| 指令 | 代码 | 场景 |
|---|---|---|
| 跳过ROM | 0xCC | 单设备,最常用 |
| 读ROM | 0x33 | 读64位ID |
| 搜索ROM | 0xF0 | 多设备识别 |
蓝桥杯只用0xCC
3. 执行功能指令(蓝桥杯核心常用 3 条)
发送功能指令前必须完成初始化 + ROM 指令,核心常用指令如下:
| 指令 | 代码 | 作用 | 步骤 |
|---|---|---|---|
| 温度转换 | 0x44 | 启动测量 | 发完等待转换结束 |
| 读暂存器 | 0xBE | 读温度数据 | 连读2字节(low+high) |
| 写暂存器 | 0x4E | 写TH/TL/配置 | 连写3字节 |
| 拷贝 | 0x48 | 写入EEPROM | 掉电保存 |
代码模板 · 考场上直接默写
延时函数(12MHz晶振专用)
void Delay_onewire(unsigned int t)
{
t *= 12;
while(t--);
}
写字节(低位先发)
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = dat & 0x01;
Delay_onewire(5);
DQ = 1;
dat >>= 1;
Delay_onewire(5);
}
}
读字节(低位先收)
unsigned char Read_DS18B20(void)
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ) dat |= 0x80;
Delay_onewire(5);
}
return dat;
}
六、最终核心 · 读温度函数
背下来,一字不改
float rd_temperature(void)
{
unsigned char low, high;
int temp;
init_ds18b20(); // 1. 复位
Write_DS18B20(0xCC); // 2. 跳过ROM
Write_DS18B20(0x44); // 3. 启动转换
init_ds18b20(); // 4. 再次复位(等转换完)
Write_DS18B20(0xCC); // 5. 跳过ROM
Write_DS18B20(0xBE); // 6. 读暂存器
low = Read_DS18B20(); // 7. 读LSB
high = Read_DS18B20(); // 8. 读MSB
temp = (high << 8) | low; // 合成16位补码
return temp / 16.0; // 温度值(含负数)
}
为什么能直接除16.0?
-
12位分辨率 = 0.0625℃ = 1/16
-
补码整数 ÷ 16.0 = C语言自动转浮点
七、常见死因排查(考场救命)
| 现象 | 最可能原因 | 解决方案 |
|---|---|---|
| 一直读85℃ | 上电默认值,没启动转换 | 检查0x44有没有发 |
| 读回0xFF/0x00 | 时序不对/上拉电阻没接 | 检查Delay_onewire |
| 温度跳变 | 没等转换完 | 750ms延时或二次复位 |
| 负数不对 | 补码没理解 | 直接用temp/16.0 |
八、考前5分钟速记卡
text
【DS18B20必背】
引脚:GND、DQ、VDD
上拉:10kΩ
数据格式:16位补码 / 16.0
上电值:+85℃ = 0x0550
分辨率:12位 = 0.0625℃
三步曲:复位 → 0xCC → 功能
功能1:0x44 启动转换
功能2:0xBE 读温度
读温度:low+high → (high<<8)|low → /16.0
一句话总结:
单总线、0xCC、0x44、0xBE、读两字节、除16.0 → 完事
