数字温度传感器DS18B20的数据手册理解


前言

DS18B20被称为是数字温度传感器,也就是说它能够将外部温度转换为数字量(0和1)并存储在DS18B20中的某个存储器中。

那么引申出两个问题。第一存放在哪个存储器中?第二如何读取DS18B20的数据?

一、存储以及计算部分

1.存放在哪个存储器中?

通过数据手册可知,转换的结果放到了SCRATCHPAD里面(是一组Sram)。
在这里插入图片描述

由图可知,再细化一点就是转换的结果放在了Byte0,Byte1中。Byte0表示的是数据低8位,Byte1表示的是数据高8位。

2.如何对数字量进行计算?

在这里插入图片描述

由图所得,高8位中的前5位是状态位,如果S=0,温度为正,如果s=1,温度为负。为0的话,就可以按照BIT10x26+BIT9x25+…+BIT0x2-4
注意,该公式只适用于温度为正的情况下。如果温度为负,则公式得出的结果错误,因为LS BYTE和MS BYTE是以补码的形式存在。温度为正时,补码,原码,反码都是一样。温度为负时,需要把补码转成原码再计算。

到这里我们可以知道,我们要想读取温度转换后的结果就是读Byte0和Byte1。但是Byte0和Byte1中的数字都是0或1,并不是36摄氏度这种直观的数字。需要通过上述公式进行简单的计算,最后以串口或者OLED来显示通过公式计算好的温度。

二、如何读取BYTE0和BYTE1?

## 1.引入库

请看数据手册第11页的截图,翻译如下:此命令允许主读取暂存板的内容。数据传输从0字节的最低有效位开始,并通过暂存板一直持续到读取第9个字节(字节8 - CRC)。如果只需要部分暂存数据,主服务器可以在任何时候发出重置来终止读取。

由此可知,当单片机发送0xBE(一个功能指令)给DS18B20后,DS18B20会把暂存板中的9个字节发送给单片机。编程时按照一个字节一个字节来读取的话,我们只需要读取前面两个字节就行。因为DS18b20是从低到高的顺序,所以直接使用两个连续读取的函数。
Low_Value=Ds18b20_Read_Byte();
High_Value=Ds18b20_Read_Byte();

再看下图,在发送功能指令之前前面要有2步,第一步,初始化。第二步,ROM指令。
在这里插入图片描述
DS18b20的功能指令有:

CONVERT T [44h]
WRITE SCRATCHPAD [4Eh]
READ SCRATCHPAD [BEh](目前使用的功能指令)
COPY SCRATCHPAD [48h]
RECALL E 2 [B8h]
READ POWER SUPPLY [B4h]

DS18b20的ROM指令有:

SEARCH ROM [F0h]
READ ROM [33h]
MATCH ROM [55h]
SKIP ROM [CCh](需要发送这个ROM指令)
ALARM SEARCH [ECh]

在SKIP ROM [CCh]中有一段话:

Note that the Read Scratchpad [BEh] command can follow the Skip ROM command only if there is a single slave device on the bus.翻译过来就是,当总线上只有一个从设备时,Read Scratchpad [BEh]功能指令才能跟随Skip ROM指令。也就是说如果总线上有两个DS18B20,[BEh]这个功能指令是无效的。

目前所知的读取转换结果的流程就是:

Ds18b20_Init();
Ds18b20_Write_Cmd(0xcc);//ROM指令
Ds18b20_Write_Cmd(0xbe);//功能指令
Low_Value=Ds18b20_Read_Byte();//读SCRATCHPAD中Byte0;
High_Value=Ds18b20_Read_Byte();//读SCRATCHPAD中Byte0;

但是如果按照上述的这种步骤去编程,读出来的温度值是+85度。为什么呢?
在这里插入图片描述

请看这段话的翻译:开机时的默认分辨率是12位。DS18B20在低功耗空闲状态下启动。要开始温度测量和a - d转换,主服务器必须发出Convert T [44h]命令。转换之后,产生的热数据存储在暂存存储器中的2字节温度寄存器中,DS18B20返回到它的空闲状态。

也就是说,我们读到的是DS18B20的默认值(+85度)。如果想要读到正确的温度,单片机需要发送Convert T [44h]命令。这是一个功能指令,在发送Convert T [44h]指令之前还是需要按照前面的步骤,第一,初始化。第二,发送ROM指令。第三,发送功能指令。当发送了0x44的指令后,温度传感器开始测量周围温度,这需要一定的时间,所以加上延时,加多久的延时呢?由表格可知,延时时间与分辨率有关系。直接延时750ms就绝对没问题了。
在这里插入图片描述


总结

在发送任何功能指令之前都需要进行初始化以及发送ROM指令。先通过单片机发送0x44这个功能指令(这是开始转换温度的命令),然后发送0xBE这个功能指令(这是允许单片机读取温度指令)。

Ds18b20_Init();
Ds18b20_Write_Cmd(0xCC);//ROM指令
Ds18b20_Write_Cmd(0x44);//功能指令
Delay_ms(750);

Ds18b20_Init();
Ds18b20_Write_Cmd(0xCC);//ROM指令
Ds18b20_Write_Cmd(0xBE);//功能指令
Low_Value=Ds18b20_Read_Byte();//读SCRATCHPAD中Byte0;
High_Value=Ds18b20_Read_Byte();//读SCRATCHPAD中Byte0;

Low_Value和High_Value读取到数据之后,只有0和1。然后就需要进行计算,计算之后再进行显示(usart,lcd,oled等等)。
此时只需要根据DS18B20的时序图进行编写初始化函数,写命令以及读字节函数就可以了。

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是小白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值