« 上一篇下一篇 »

DS18B20应用总结

这个本应该是刚学单片机的时候就接触的东西,可是我却是在大三的时候才来接触它,要不是可能会用到,也许我还是不会去认识它,这说明我的学习不够认真,也不够到位,很基础的外设模块现在才来学习。

一、引脚排列:平的一面对着自己,从左到右分别是1——GND,2——DQ,3——VCC,在画电路时VCC与DQ之间要接上拉电阻,不然可能会烧坏器件。

DS18B20可测量温度范围:-55 ~ +125 摄氏度;转换精度:12位(默认12位,也可配置为11、10、9位);转换最大用时:750ms。

二、应用具体操作

1、初始化。先把DQ线拉低,保持时间480us ~ 960us,然后释放DQ线(即拉高),等待15 ~ 60us。初始化很重要,在转换前要进行初始化,在读取数据前也要进行初始化。

2、读数据。DS18B20的每次读/写都只有1位数据,且每次都是从最低有效位开始(All data is read and written least significant bit first)。读的时候先把DQ线拉低,保持时间大于1us,然后再把DQ线拉高,延时一定时间,在读时序产生7us后读取数据,之后再是一段较长的延时,满足读时序的时间长度要求。这样即读完1位的数据,连续读8次,将结果依次从低位到高位放置在一个单字节变量里,即为1个字节的数据。

3、写数据,分为写“0”与写“1”两种操作。

写“0”:先把DQ线拉低,因为写“0”时要求15us ~ 60us期间总线保持低电平,所以拉低后进行较长的一段延时,然后释放DQ线(即拉高),延时,大于1us。

写“1”:先把DQ线拉低,保持时间大于1us,因为写“1”时要求15us ~ 60us期间总线保持高电平,所以再拉高DQ线,然后较长延时。写数据同样是每次只写1位,从数据最低位开始。

4、温度转换。

先进行初始化,略延时,然后写命令'0xcc'——Skip ROM,再写命令'0x44'——开始转换。

5、数据读取。

同样先进行初始化,略延时,然后写命令'0xcc'——Skip ROM,再写命令'0xbe'——读取数据,然后用两个uchar型的变量分别读取低8位、高8位数据,再把高、低8位组合到一个16位的变量里面,这样温度数据就读出来了。

6、数据处理。

图1.   温度/数据关系

图1表示的是DS18B20采集的温度与数据存储之间的关系,由图1可以看出,DS18B20用了两个字节来存储温度数据,其中低4位为小数部分,2 ^ (-4) = 1/16,所以它的分辨率为1 / 16 = 0.0625(℃),在后面我们将会用到这个数据。假定读取出的数据存放在TEMP变量中,那么实际的温度值temp = TEMP * 0.0625,为什么呢?前面已经说过了,它的分辨率是这么多,而且我们也可以这么看,2个字节为16位,2 ^ 16 = 65536,2 ^ 12 = 4096,这里的12表示12位的分辨率,65536 * 0.0625 = 4096,所以读取出来的数据要乘上0.0625才是实际温度值。求出来的temp是一个浮点数,为了把浮点转化为整型我们还需要处理一下:temp = temp * 10 + 0.5;这段代码即为把浮点转化为整型,即放大10倍,+ 0.5为四舍五入处理,举个例子:31.25,31.25*10 + 0.5 = 312.5 + 0.5 = 313,然后显示除以10即 为31.3,即保留1位小数。

三、具体程序流程:

初始化——写命令(开始转换命令)——初始化——写命令(读取数据命令)——读取数据——数据处理——显示

四、注意事项

uchar与uint类型变量在相同代码中执行时间不一致,同样的代码(时序有规定),用uchar型变量可用范围为13 ~ 102,用uint型变量可用范围为3 ~ 25,这说明uint型的执行时间差不多是uchar型的4倍,而代码数为两条,说明同样一条代码,变量为uint类型的执行时间是uchar类型的两倍左右,我不知道这是为什么,网上也没查到,但是这是一个确确实实存在的问题,但我现在的知识不能够解释它。


附件:DS18B20测温程序、DS18B20数据手册

DS18B20测温程序.txt

DS18b20.pdf