DS18B20温度传感器:(初始化,写字节,读字节,发送温度转换命令,发送读取温度命令,读取温度)
1.一些注意点:
.适应电压范围更宽,电压范围:3.0~5.5V
.测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
.可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃
和0.0625℃,可实现高精度测温。
.在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms
内把温度值转换为数字,速度更快。(非常显然,分辨率越高,也就意味着精度越高,肯定耗费时间更多啦)
.这里特别需要注意的是,DS18B20采用的是单总线
.注意不要接反
2.内部结构:
.64位激光刻只读寄存器(rom)
64位光刻ROM的排列是:开始8位(28H)是产品类型标号(产品什么类型的),接着的48位是该DS18B20自身的序列号
(有了序列号同一类型就分得清了), 最后8位是前面56位的循环冗余校验码(也就是CRC,对通信的可靠性检查就需要‘校验’,
校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,
如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。)。
光刻ROM的作用是使每一个DS18B20都各不相同,
这样就可以 实现一根总线上挂接多个DS18B20的目的。
.温度转换规则:
DS18B20的核心功能是它可以直接读出数字的温度数值。温度传感器的精度为用户可编程的9,10,11或12位,
分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。
而此时读取的温度是两个字节形式的,存储在高速缓存存储器,如果你选取的是12位精度,意思是温度计占十二位,其中高五位
是符号位,0为正,1为负;(数据十一位,五位符号位)
DS18B20的存储器:
DS18B20温度传感器的内部存储器包括一个高度的暂存器RAM和一个非易失性的可电擦除的EEPROM(可复用)
后者存放高温度和低温度触发器TH、TL和结构寄存器。
DS18B20的配置寄存器:
存储器的第4位为配置寄存器,用户设置R0和R1位来设定DS18B20的精度。(9位还是还是十位,11,12)
上电默认设置:R0=1、R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留,禁止写入。
0 R1 R0 1 1 1 1 1 (配置寄存器只能动R1和R0)
精度设置记忆方法;
0 0 为九位
1 1为十二位(按你所熟悉的二进制增长模式写)
指令(这个只能死记硬背了)
使用要初始化
读,写,这些都按照时序就行
编写代码还有些注意事项
我们从DS18B20中得到的温度是实际温度的补码,所以要先减一,再取反(我们求补码时不就是取反再加一吗,这不就恢复一下吗
)
还有要乘以我们选择位数相对应的精度,比如选12位,要乘以0.0625,考虑到c语言会丢弃小数点后数的特性,我们要对
其四舍五入,比如保留两位小数,求得的温度*100+0.5,之后再把它赋给一个float型变量/100即可
写数据:
从低位到高位
DSPORT=dat&0x01
dat>>=1;
取数据:
从低位到高位
/将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。/
byte = (byte >> 1) | (bi << 7);(byte右移一位,所以高位为零,然后bi左移七位,与byte相或,怎么bi的数据就跑到byte
最高位,然后byte再右移,则刚才的数据从最高位移到次高位,bi数据又填到最高位,这样以此下去就是一开始读取的数据到
最低位,依次,就等于从低位依次读取数据)
来源:https://www.cnblogs.com/tanghaojie/p/11093560.html