学习链接:学习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)校验码生成代码:
#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 联网部分可以使用)。