(1)DS18B20初步认识
DS18B20是美国DALLAS半导体公司推出的一种数字化单总线器件,属于新一代适配微处理器的改进型智能温度传感器。我们先来看看DS18B20在芯片手册上的标题——“DS18B20 Programmable Resolution 1-Wire Digital Thermometer”。从这个标题上看我可以获取一些有价值的信息。首先分辨率是可以编程的,也就是我们可以通过程序来修改这个器件的分辨率。其次它又是“一线-总线”,那么简单的讲,就是我们与DS18B20的沟通就是通过这一根线实现的,换一个说法就是“写数据”,“发命令”,“读数据”等等都是通过这根线来完成的。第三点,从标题可以看到,它是数字温度计,也就是它能把温度信号转成数字信号。
其实这里的“第三点”非常重要——把温度信号转成数字信号。注意我们使用这个器件的目的就是要获取温度的信息,那么我们要做的事情就是获取这个DS18B20器件转换的“数字信号”。这是我们的根本目的。其实这个过程中有很多问题值得思考。比如说,这个器件既然能把温度信号转成数字信号,那么可以推测这个器件有个部分或者说它的核心材料具备感知温度的能力。那么这个材料是什么?为什么这个材料具备这样的能力?最重要的一点是,DS18B20内部是如何把感知的温度信号转成数字信号的?可以看到,这几个问题才是DS18B20的核心内容(叁议电子)。但是想一想我们需要去解答这些问题吗?根本不需要。注意我们这里是从应用层面来思考问题的。我们要干什么?目的就是获取温度值嘛。刚才不是说了吗,DS18B20能把温度信号转成数字信号。那么我们只需要关心这个“数字信号”放到哪里了,然后通过这一根“一线-总线”进行沟通,取出这个“数字信号”就可以了。至于我们刚才思考那些问题有用吗?根本没必要。当然如果你想深入了解这个器件也可以去查阅相关的资料。这里再次强调,我们是从应用层面来思考问题的。好了,通过对DS18B20芯片手册的标题分析,我们可以推测出一个大概的思路:DS18B20会把周围的温度信号变成数字信号,放在了某个地方(www.ppptalk.com),然后我们通过这一根“一线-总线”取出这个“数字信号”。知道了这个思路,剩下的工作就是去查阅芯片手册,确定具体的操作的过程了。这里我用一幅图来描述这个过程,如下所示:
首先DS18B20内部的传感器(前面说过关于这个传感器不关心,只要知道它具备的功能就行了)感知周围的温度并且把它转成数字信号(这个过程也不关心),然后把这个“数字信号”存储在一个叫做“ScratchPad”的里面。ScratchPad存储器一共9个字节(Byte0-Byte8),数字信号就存储在Byte0_LSM和Byte1_MSB中。其中Byte0为低位,Byte1为高位。
BYTE2-BYTE3是关于“报警”的功能,BYTE2是设定的高温界限,BYTE3是设定的低温界限。可以想到,当周围温度超过这个范围时,会发出某种警告信号。接着就是Byte2_TH和Byte3_TL报警的功能了,图中Byte2_TH表示设置的最高温度,Byte3_TL表示设置的最低温度。同样S表示温度的正负,如果S=0,那么表示正,如果S=1,那么温度为负。Byte2_TH和Byte3_TL就表示设定温度的范围了。注意这里的Byte2_TH与Byte3_TL与”T-16bit”中的bit11到bit4是对应的,如图中蓝色部分所示。前面讲了,在”T-16bit”中,bit4每变化1为1°C,因此在Byte2_TH与Byte3_TL中的最低位每变化1,表示温度变化1°C.比如Byte2_TH设定为,01111001(十进制为121),首位为0,表示+121°C, Byte3_TL为01001001(十进制为73),首位为0,表示+73°C .因此温度的设定范围为: 73-121°C.当”T-16bit”中的温度高于/等于+121°C,或者低于/等于73°C时,将触发报警。
BYTE4是关于精度设定的,刚好与它的“标题”对应,“精度可编程”。一共四种精度可选,这样四种精度只需两个bit就可以组合了,如图中的Byte4_Config所示。bit5和bit6分别为R0和R1,其他几位是固定的。R0和R1分别可以取0或者1,因此可以组合成4种情况,00/01/10/11,分别对应不同的精度。
Byte5-Byte7未给出
Byte8为CRC用与通信错误检测,我们暂且不用管它,我们先考虑简单的部分。
为了简化问题,这里我们先只重点关注BYTE0和BYTE1,里面存在的就是我们需要的数字信息。如上图所示,我们把Byte0_LSM和Byte1_MSB组合成一个16bit的数字信号,Byte0_LSB为低位,Byte1_MSB为高位,并给它取个名字叫”T-16bit”。那么如何把这个”T-16bit”的数字信号转换成温度呢?从图中看出,bit11-bit15为S,表示温度的正负,如果S=0,那么温度为正,如果S=1那么温度为负。后面的bit10-bit0,数值每增加一就表示温度增加0.0625°C,举个例子:假如LSB中读出来的是1100 0011,MSB读出来的是0000 0110,那么LSB和MSB结合起来”T-16bit”就是0000 0110 1100 0011,高5位为0,表示温度为正,余下11位bit10-bit0(110 1100 0011=1731),把1731×0.0625=108.1875,那么测量的温度为+108.1875°C.
(2)DS18B20操作步骤
这个“一线-总线”在硬件上比较省事,但是对应的增加了程序的复杂性。它要求每次与DS18B20沟通都要有这三个步骤,(1)初始化;(2)ROM指令;(3)DS18B20 功能指令。 什么意思呢?比如你想“write scratchpad”,那么首先就要初始化,然后rom指令,之后write scratchpad,如果紧跟着你想read scratchpad,那么就必须再次重复初始化;rom指令;read scrachpad这个过程。以下步骤是读出scratchpad中BYTE0和BYTE1并通过LCD1602显示温度结果的过程:
(1) DS18B20初始化
(2) 跳过ROM指令
(3) 转换温度,注意上电的时候DS18B20是没有工作的。如果没有Convert这个指令,那么读出来的温度应该是默认值80度。
(4) 温度转换是需要时间的,不少于750ms,这里需要有忙信号检查,确定转换完成
现在可以读Scatchpad了,但是同样要有三个步骤
(5) DS18B20初始化
(6) 跳过ROM
(7) 读Scatchpad
(8) RCV DATA(参考read time slot)
(9) 读出来的是二进制信号,需要转成十进制
(10)输出温度值(通过数码管/LCD1602液晶模块)