DS18B20-笔记

DS18B20

硬件核心 · 死都要记住

核心特性

  1. 通信接口:1-Wire 单总线,仅需 1 个 I/O 管脚 + 地线通信

  2. 唯一标识:内置 64 位唯一序列号,支持单总线多设备组网

  3. 供电方式:数据线寄生供电 / 外部 3.0V~5.5V 供电,无需额外电源

  4. 硬件设计:无需外围元件,电路简单,支持分布式多路温度采集

  5. 测量指标:量程 - 55℃ ~ +125℃;-10℃~85℃范围内精度 ±0.5℃

  6. 分辨率:用户自定义 9~12 位,对应不同转换时间和测量精度

  7. 附加功能:可编程非易失性存储器,支持过温 / 低温报警触发

一句话核心:单总线通信、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根线既供电又通信


温度数据格式

:white_check_mark: 16位补码,分辨率0.0625℃

 高8位(MSB) + 低8位(LSB) = 16位有符号整数
 实际温度 = 16位整数值 ÷ 16.0

:white_check_mark: 位分配(12位模式)

15~11 10~4 3~0
含义 符号位(S) 7位整数 4位小数
说明 全S=负数 0~127 0.0625℃/位

:white_check_mark: 经典数值 · 背下来

温度 十六进制 二进制 特征
+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 量程下限

:light_bulb: 记忆口诀

正数直接除16,负数补码取反加一除16


寄存器结构 · 读写要清楚

:white_check_mark: 高速暂存器(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 校验码

:white_check_mark: 配置寄存器(重点)

分辨率 位b6~b5 精度 转换时间 考频
9位 00 0.5℃ 94ms :star:
10位 01 0.25℃ 188ms :star:
11位 10 0.125℃ 375ms :star::star:
12位 11 0.0625℃ 750ms :star::star::star:

:white_check_mark: 默认/最常用:12位
:white_check_mark: 改分辨率:0x4E → 写TH/TL/配置寄存器


单总线时序 · 三步不能乱(工作流程)

:police_car_light: 铁律:初始化 → 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;
 }

:white_check_mark: 成功标志:initflag = 0
:white_check_mark: 失败原因:上拉电阻没接/线序错/时序不对

2. 执行 ROM 指令(单设备无脑0xCC)

总线上仅 1 个 DS18B20 时,直接发跳过 ROM 指令 0xCC(蓝桥杯重点);多设备需用搜索 ROM(0xF0)/ 读取 ROM(0x33)。

指令 代码 场景
跳过ROM 0xCC 单设备,最常用
读ROM 0x33 读64位ID
搜索ROM 0xF0 多设备识别

:white_check_mark: 蓝桥杯只用0xCC

3. 执行功能指令(蓝桥杯核心常用 3 条)

发送功能指令前必须完成初始化 + ROM 指令,核心常用指令如下:

指令 代码 作用 步骤
温度转换 0x44 启动测量 发完等待转换结束
读暂存器 0xBE 读温度数据 连读2字节(low+high)
写暂存器 0x4E 写TH/TL/配置 连写3字节
拷贝 0x48 写入EEPROM 掉电保存

代码模板 · 考场上直接默写

:white_check_mark: 延时函数(12MHz晶振专用)

 void Delay_onewire(unsigned int t)
 {
     t *= 12;
     while(t--);
 }

:white_check_mark: 写字节(低位先发)

 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);
     }
 }

:white_check_mark: 读字节(低位先收)

 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;
 }

:pushpin: 六、最终核心 · 读温度函数

:white_check_mark: 背下来,一字不改

 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;       // 温度值(含负数)
 }

:white_check_mark: 为什么能直接除16.0?

  • 12位分辨率 = 0.0625℃ = 1/16

  • 补码整数 ÷ 16.0 = C语言自动转浮点


:pushpin: 七、常见死因排查(考场救命)

现象 最可能原因 解决方案
一直读85℃ 上电默认值,没启动转换 检查0x44有没有发
读回0xFF/0x00 时序不对/上拉电阻没接 检查Delay_onewire
温度跳变 没等转换完 750ms延时或二次复位
负数不对 补码没理解 直接用temp/16.0

:bullseye: 八、考前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

:light_bulb: 一句话总结
单总线、0xCC、0x44、0xBE、读两字节、除16.0 → 完事