51单片机——DS18B02(二)

目录

[3. 内部结构](#3. 内部结构)

[3.1 左侧:外部接口与电源相关](#3.1 左侧:外部接口与电源相关)

[3.2 中间:核心通讯与身份标识](#3.2 中间:核心通讯与身份标识)

[3.2.1 64 位 ROM](#3.2.1 64 位 ROM)

[3.2.2 单线接口](#3.2.2 单线接口)

[3.3 右上:控制与存储中心](#3.3 右上:控制与存储中心)

[3.3.1 存储器和控制器](#3.3.1 存储器和控制器)

[3.3.2 高速缓存(暂存器)](#3.3.2 高速缓存(暂存器))

[3.4 右侧:功能元件区](#3.4 右侧:功能元件区)

[3.4.1 温度灵敏元件](#3.4.1 温度灵敏元件)

[3.4.2 低温触发器 TL / 高温触发器 TH](#3.4.2 低温触发器 TL / 高温触发器 TH)

[3.4.3 配置寄存器](#3.4.3 配置寄存器)

[3.5 下方:数据校验](#3.5 下方:数据校验)

[4. 温度读取过程](#4. 温度读取过程)

[4.1 读取流程](#4.1 读取流程)

[4.2 命令](#4.2 命令)


3. 内部结构
3.1 左侧:外部接口与电源相关

电源检测:判断 DS18B20 的供电方式(是外部电源供电,还是寄生电源(DQ 线供电)),确保器件在不同供电模式下稳定工作。

旁边的二极管 / 电路:是总线保护电路(比如防反接、防过压),避免外部电路异常(比如电压接反)损坏 DS18B20。

3.2 中间:核心通讯与身份标识
3.2.1 64 位 ROM

DS18B20 的 "身份证"------ 出厂固化的全球唯一 64 位地址(前面提过的 "家族码 + 序列号 + CRC 码"),用来在多传感器组网时区分不同器件。

开始 8 位是"家族码"/产品类型标号(DS18B20 固定为 0x28);

紧接着 48 位是"唯一序列号"(相当于传感器的 "身份证号");

最后 8 位是前面 56 位的"CRC 校验码"/循环冗余校验码(验证地址正确性)。

光刻的作用是使每一个 DS18B20 都各不相同,这样就可实现一根总线上挂接多个 DS18B20

3.2.2 单线接口

就是和单片机连接的DQ 口,负责接收单片机的指令(比如 "启动测温""读温度"),同时把温度数据、配置信息发回单片机。

3.3 右上:控制与存储中心
3.3.1 存储器和控制器

DS18B20 的 "大脑"------ 负责协调所有模块工作:

接收单线接口传来的单片机指令,指挥其他模块执行(比如 "让温度元件开始测温");

管理数据的存储、读写(比如把测温结果存到缓存里)。

3.3.2 高速缓存(暂存器)

临时 "货架"------ 用来存实时温度数据,以及用户设置的参数:

温后的数字温度值(核心数据);

低温触发阈值 TL(比如 "温度低于 10℃告警");

高温触发阈值 TH(比如 "温度高于 30℃告警");

配置寄存器的内容(比如温度分辨率)

其由 9 个字节组成:

当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速缓存存储器的第 0(低字节(LS Byte)) 、1(高字节(MS Byte))个字节,即低字节存低 8 位,高字节存高 8 位

该两个字节,高字节的前五位是符号位 S,单片机可通过单线接口读到该数据

读取时**低位在前,高位在后,**数据格式如下:

如何计算呢?

温度有正负(比如 +10℃、-5℃),而计算机用 "补码" 统一表示正负数值;

高字节(MS Byte)的前 5 位(bit15~bit11)是 "符号位 S",它决定温度的正负:

若 S=0(前 5 位全是 0):温度是正数

若 S=1(前 5 位全是 1):温度是负数

每个 bit 对应不同的 "温度权重"(直接对应温度的数值部分):

低字节(LS Byte,bit7~bit0) :对应温度的 "整数低位 + 小数位 ",权重从(8℃)到2⁻⁴(0.0625℃);

高字节(MS Byte,bit10~bit8) :对应温度的 "整数高位 ",权重从2⁴(16℃)到2⁶(64℃);

高字节前 5 位(bit15~bit11):仅作符号位 S,无数值权重。

DS18B20 默认是 12 位分辨率,所以温度值 = "16 位补码对应的数值",直接通过 bit 的权重相加得到(不用额外换算)。

例子 1:正数温度(比如 + 12.5℃)

  1. 符号位 S=0(高字节前 5 位是00000);
  2. 12.5℃的组成:8℃(2³) + 4℃(2²) + 0.5℃(2⁻¹)
  3. 对应寄存器的 bit 状态:
    • 低字节(LS Byte):bit7=1(2³)、bit6=1(2²)、bit3=1(2⁻¹),其余 bit=0 → 低字节是 1100 1000
    • 高字节(MS Byte):符号位00000 + 其余 bit=0 → 高字节是 00000000
  4. 组合 16 位补码:00000000 11001000,直接相加权重:8+4+0.5=12.5℃

例子 2:负数温度(比如 - 5℃)

负数用 "补码" 表示,规则是 "绝对值的二进制取反 + 1":

5℃=4℃(2²)+1℃(2⁰),对应寄存器的 bit:

  1. 低字节:bit6=1(2²=4)、bit4=1(2⁰=1),其余 bit=0 → 低字节是 01010000(二进制);
  2. 高字节:无高位整数(5<16),所以高字节是 00000000(二进制);→ 5℃的 16 位二进制(原码):00000000 01010000
  3. 对绝对值的 16 位原码取反00000000 01010000 取反 → 11111111 10101111
  4. 取反后加 111111111 10101111 + 1 = 11111111 10110000;→ -5℃的 16 位补码:11111111 10110000

单片机怎么读?

单片机通过单线接口,先读 "低字节(缓存第 0 字节)"、再读 "高字节(缓存第 1 字节)",把这两个字节组合成 16 位补码后:

  • 若 S=0:直接按 bit 权重相加得到正数温度;
  • 若 S=1:把补码转成原码(取反 + 1),再加上负号得到负数温度。
3.4 右侧:功能元件区
3.4.1 温度灵敏元件

DS18B20 的 "测温探头"------ 把环境温度转换成数字信号(前面说的 "无需 AD 转换",就是这个元件内部完成了 "温度→数字" 的转换)。

3.4.2 低温触发器 TL / 高温触发器 TH

用户可设置的 "温度告警阈值"------ 比如设置 TH=35℃、TL=5℃,当温度超过 35℃或低于 5℃时,DS18B20 会标记 "告警状态"(单片机可以读取这个状态)。

3.4.3 配置寄存器

控制 "测温精度"------ 可以设置 DS18B20 的测温分辨率(9~12 位),对应精度是 0.5℃、0.25℃、0.125℃、0.0625℃(默认是 12 位,精度 0.0625℃)。

结构如下:

① 低五位一直都是" 1 "

② TM 是测试模式位,用于设置是工作模式还是测试模式,出厂时被设置为 0,无需改动

③ R1、R0 用来设置其精度(分辨率)

可设置为 9位,10位,11位,12位,对应分辨率温度为0.5°C,0.25°C,0.125°C,0.0625°C

默认为 12 位,即 R1 = 1,R0 = 1;

3.5 下方:数据校验

8 位 CRC 生成器:DS18B20 的 "数据安检员"------ 在传输数据(比如 64 位 ROM 地址、温度值)时,生成一个 8 位的校验码,单片机可以通过校验码判断数据有没有传错(避免通讯干扰导致的错误数据)。

DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易失性的可电擦除的 EEPROM(存放高温存储器TH、低温存储器TL、配置寄存器)

4. 温度读取过程
4.1 读取流程

DS18B20 典型的温度读取过程(单传感器场景下,而非多传感器组网):

复位------发 SKIP ROM 命令(OXCC)------发开始转换命令(OX44)------延时------

复位------发送SKIP ROM命令------发读存储器命令(OXBE)------连续读出两个字节数据(即温度)------结束

(本质是 "复位→启动测温→等结果→复位→读数据" 的完整闭环)

① 复位

主机拉低 DQ 线 >= 48 us,释放后检测传感器的应答,确认传感器在线

(相当于喊一声:传感器,你在吗?

② 发 SKIP ROM 命令(OXCC)

单传感器专属操作(跳过匹配 ROM 地址的步骤,因为只有一个传感器,不用点名),直接进入功能指令阶段

(相当于"不用喊名字,直接说"接下来听指令" ")

③ 发开始转换命令(OX44)

告诉传感器 "开始测当前温度",传感器会启动内部的温度灵敏元件,把温度转成数字值存到高速缓存(相当于 "说'现在测温度!'")

④ 延时

DS18B20 测温需要时间(12 位分辨率下约 750ms,分辨率越低耗时越短),必须等转换完成才能读数据,否则读到的是旧数据 / 错误数据(相当于**"等传感器'算完温度'**")。

⑤ 复位

再次建立通讯:测温完成后,需要重新复位,让传感器进入 "等待指令" 状态(相当于 "测完温度了,再喊一声'准备好给我数据了吗?'")。

⑥ 发送SKIP ROM命令

再次跳过地址匹配:还是因为单传感器,直接进入读数据阶段。

(相当于 "说'现在测温度!'")

⑦ 发读存储器命令(0xBE)

告诉传感器 "把高速缓存里的温度数据给我"(高速缓存的第 0、1 字节就是温度值)

⑧ 连续读出两个字节数据(即温度)

先读低字节、再读高字节,组合成 16 位补码,解析后得到实际温度。

⑨ 结束

通讯完成,单片机可以处理温度数据了

4.2 命令

此外,"开始转换命令(OX44),SKIP ROM命令,存储器命令(0xBE)"是什么呢?如何理解并使用?

命令的本质 = 主机(51 单片机)和 DS18B20 的 "约定暗号"

这些命令是芯片厂商(Maxim,原 Dallas)在 DS18B20 的数据手册中 "规定好的协议指令",不是随便编的,所有 DS18B20 芯片都遵循这个约定 ------ 就像行业通用的 "摩斯密码表",主机必须按这个表发命令,传感器才能识别。

只要记住三个核心命令的十六进制值 + 对应功能 + 使用场景即可

0xCC:单传感器时用,跳过地址;多传感器时不能用(会冲突);

0x44:启动测温,发完必须延时(12 位分辨率等 750ms)

0xBE:读温度数据,发完后先读低字节(第 0 字节),再读高字节(第 1 字节)

相关推荐
error:(1 小时前
【保姆级】WSL 2 中使用 PlatformIO 开发 ESP32 完整教程
stm32·单片机·嵌入式硬件
沧海一条狗1 小时前
Ecat从站SSC代码与GD32H75E接口的适配注意事项
单片机·嵌入式硬件
minglie11 小时前
clion+RP2040-Zero的ws2812
单片机
点灯小铭2 小时前
基于单片机的加油站加油机显示控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
m0_690780522 小时前
串口通信,嵌入式系统
单片机·嵌入式硬件
沧海一条狗2 小时前
SOEM与ESC无法通讯问题解决方案
单片机
雾削木2 小时前
STM32 HAL 软件SPI任意GPIO控制st7735
stm32·单片机·嵌入式硬件
田甲2 小时前
【STM32】SHT30温湿度芯片驱动
stm32·单片机·嵌入式硬件
Molesidy3 小时前
【Embedded Development】对于MCU的片内内存里的分布区域结构详解
单片机·嵌入式硬件