DS18B20 与 单总线

学习链接:学习B站 up 主金善愚的DS18B20课程

一、单总线概述



单总线芯片,在其内部的 ROM 中都编制好了唯一的序列号(64位)。



单总线芯片在应用时对时序的要求非常高。


二、单总线的基本操作

三、DS18B20的主要性能

电源电压范围:3 --- 5.5 V

测量温度范围为 ---55 ℃ --- +125 ℃

分辨率为 9 ~ 12 位 (包括1位符号位),可由编程决定具体位数。

四、DS18B20的典型电路连接

1、外部供电模式下的单只 DS18B20 芯片的电路连接

2、外部供电模式下的多只 DS18B20 芯片的电路连接

五、读取单总线器件的ROM码





六、读取单总线器件的ROM码

结论:读取的温度传感器的前56位进行 CRC 校验,与最后一个字节不匹配,但读出来的温度正确。

校验方法:

方法一:

CRC校验网址,选择

方法二:

C语言编写好的 CRC 代码,参考网址Dallas器件DS18B20的CRC8(x8+x5+x4+1)校验码生成代码

javascript 复制代码
#include <stdio.h>

typedef unsigned char uint8_t;

uint8_t dat[] = { 0x28,0xBD,0xE8,0x65,0x55,0x5F,0xE5 }; // 实际的DS18B20返回的值是7A。
 
uint8_t  CheckCrc()
{
    uint8_t crc = 0, i, j;
    for (i = 0; i < sizeof dat / sizeof dat[0] ; i++)
    {
        crc = crc ^ dat[i];
        for (j = 0; j < 8; j++)
        {
            if (crc & 0x01) crc = (crc >> 1) ^ 0x8C;
            else crc >>= 1;
        }
    }
    return crc;
} 

int main()
{
    printf("0x%x", CheckCrc()); // 输出校验码 16进制格式
    return 0;
}

运行代码后,输出 0x51,与实际的 DS18B20 返回的值一致,说明读取 64 位的ROM成功。

做个总结:实验了两个程序:一个是读取并显示一个 DS18B20 读取的温度数据,第二个是(单总线)读取并显示两(三)个DS18B20读取到的温度数据。****使用的单片机是两个STC12C5A60S2和STM32F103ZET6,读取一个 DS18B20 在STC12C5A60S2上成功,读取多个没有成功(基本完全按照视频中的代码)。在 STM32F103ZET6 上读取多个 DS18B20 采集的温度,没有按照视频中的代码,下载的如下链接的代码:单总线读取并显示三个DS18B20的温度数据在LCD1602上,可以很容易改在串口上进行显示。因为该程序的代码和视频中的代码思路是基本一致的,所以我尝试将其部分代码移植到STC12C5A60S2上(按照视频中的步骤),但是,没有成功。现在也不想弄了,原因是耐不下来心了。

代码均上传至资料库(STC12C5A60S2 程序中的 ESP8266 联网部分可以使用)。

相关推荐
KINO3210 个月前
STM32控制DS18B20温度传感器获取温度
stm32·单片机·嵌入式硬件·ds18b20
听我一言10 个月前
普中STM32-PZ6806L开发板(HAL库函数实现-访问多个温度传感器DS18B20)
stm32·单片机·嵌入式硬件·ds18b20