DS18B20数字温度计 (二) 测温, ROM和CRC算法

本文详细介绍了DS18B20数字温度计的工作原理,包括供电和接线方式、温度测量、1-WIRE总线的ROM搜索算法。重点阐述了温度转换过程,分辨率设置,以及读取和解析温度数据的方法。同时,讨论了CRC校验在确保数据完整性的关键作用,并提供了CRC计算的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

测温

DS18B20的核心功能就是数字化的温度读数, 可以设置为9, 10, 11, 12位分辨率, 缺省分辨率是12位. 各分辨率对应的读数, 温度分辨率分别是0.5, 0.25, 0.125, 0.0625摄氏度.

在执行温度转换命令Convert T0x44后, 温度会被转换并存储在一个2字节的内存单元, 然后通过读取命令Read Scratchpad0xBE读出.

转换时间

在温度转换命令Convert T0x44发起到采集完成需要的时间可能会长达750 ms. 实际从 400ms 至 1s 都有可能.

读数结构

这两个字节各个bit分别代表的数字含义如下, 高字节的高5位仅用于表示温度的正负, 正温度是0, 负温度是1, 后面11个bit表示的数字, 负值使用的是补码, 读数用 (0xFF - 读数)

  • 正温度时, 将16位整数乘以对应的温度分辨率
  • 负温度时, 将16位整数取反加1后, 乘以对应的温度分辨率
7654321076543210
SSSSS 2 6 2^6 26 2 5 2^5 25 2 4 2^4 24 2 3 2^3 23 2 2 2^2 22 2 1 2^1 21 2 0 2^0 20 2 − 1 2^-1 21 2 − 2 2^-2 22 2 − 3 2^-3 23 2 − 4 2^-4 24
MSBLSBMSBLSB

读数快查表

上电后的缺省值为0x0550, 对应85°C, 如果一直读出都是这个值, 需要检查接线

TEMPERATUREDIGITAL OUTPUT (Binary)DIGITAL OUTPUT (Hex)
+125°C0000 0111 1101 000007D0h
+85°C0000 0101 0101 00000550h*
+25.0625°C0000 0001 1001 00010191h
+10.125°C0000 0000 1010 001000A2h
+0.5°C0000 0000 0000 10000008h
0°C0000 0000 0000 00000000h
-0.5°C1111 1111 1111 1000FFF8h
-10.125°C1111 1111 0101 1110FF5Eh
-25.0625°C1111 1110 0110 1111FF6Fh
-55°C1111 1100 1001 0000FC90h

测温存储结构

DS18B20内部有9字节的暂存器和3个字节的EEPROM存储, 测温的结果存在暂存器的前两个字节, 整体结构如下, 可以通过读取命令Read Scratchpad0xBE读出全部9个字节

ROM读数

每个 DS18B20 包含一个唯一的只读的64bit编码, 其结构为

  1. 最初 8 bits 为固定的 0x28, 1-Wire family code
  2. 接下来的 48 bits 是唯一序列号
  3. 最后的 8 bits 是前面 56 bits 的 CRC 校验码.

这个 64-bit ROM 和 ROM 方法允许在单线(1-Wire)总线上运行多个 DS18B20, 使用单线总线需要使用下面的方法之一发起:

  1. Read ROM,
  2. Match ROM,
  3. Search ROM,
  4. Skip ROM, or
  5. Alarm Search.

After a ROM function sequence has been successfully executed, the functions specific to the DS18B20 are accessible and the
bus master may then provide one of the six memory and control function commands.

CRC 计算

无论是读取8字节ROM, 还是读取9字节暂存器, 最后一个字节都是前面所有字节的CRC校验值. CRC值的比较与是否继续操作完全由总线控制端决定, DS18B20 内部仅计算CRC, 并不会对CRC不匹配的情况进行处理, 需要总线控制端主动判断.

计算CRC的等效多项式函数为(这是datasheet中的式子, 并非幂运算, 要结合后面的流程图理解)

C R C = X 8 + X 5 + X 4 + 1 CRC = X^8 + X^5 + X^4 + 1 CRC=X8+X5+X4+1

1-Wire总线的CRC计算由移位寄存器和异或门组成的多项式发生器来执行: 移位寄存器位初始化为0, 然后从第一个字节的最低位开始, 一次移入一位, 根据计算结果决定是否与第4, 第5位作异或, 然后CRC也往右移, 最后移位寄存器的值就是CRC.

CRC 计算代码

8位CRC的C语言计算代码为

uint8_t DS18B20_Crc(uint8_t *addr, uint8_t len)
{
    uint8_t crc = 0, inbyte, i, mix;

    while (len--)
    {
        // inbyte 存储当前参与计算的新字节
        inbyte = *addr++;

        for (i = 8; i; i--) 
        {
            // 将新字节与CRC从低位到高位, 依次做异或运算, 每次运算完CRC右移一位
            // 如果运算结果值为1, 则将CRC与 1000 1100 作异或
            // 第3,4位代表流程图中的异或运算, 第7位其实就是运算结果移入的1
            mix = (crc ^ inbyte) & 0x01;
            crc >>= 1;
            if (mix) 
            {
                crc ^= 0x8C;
            }
            inbyte >>= 1;
        }
    }
    return crc;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值