温度传感器DS18B20主要内容1、DS18B20的初步了解2、控制DS18B20的指令3、DS18B20的工作时序4、操作DS18B20的实例DS18B20的初步了解DS18B20是Dallas半导体公司生成的一款数字式温度传感器,也有的地方说它的厂家是美国美信(MAXIM)半导体公司,其实也没错,因为美信在2001年收购了Dallas,它成为了美信的全资子公司。所以,说它是美信生产的没问题。DS18B20的初步了解DS18B20有两大特点:1、数字式传感器,读取便捷;2、一线式总线(1-wirebus)通信,只占用一个IO脚。除此之外,它也有大量的优点:1、每个器件都有一个唯一的64位序列号,可实现多点组网2、应用电路设计简单,只需要很少的器件;3、供电电压3.0~5.5V,也可以从数据引脚获取电源;4、测量温度从-55°C到+125°C,在-10°C~+85°C时精度为±0.5°C;5、温度计的分辨率从9位至12位可选,其中包含温度正负位;6、用户可定义的非易失性报警设置;7、多种封装方式:SO-8、μSOP-8以及TO-92,最后一种较为常见。DS18B20的初步了解TO-92封装的18B20样式非常小巧,有三只脚,分别为:1脚GND,2脚数据,3脚电压,外形和直插式的三极管一模一样,接口电路如图所示。DS18B20的初步了解18B20通过编程可以实现最高12位的温度转换,同时可识别温度正负。温度数据寄存器格式如表所示:温度值被存在一个16位寄存器中,前面五位“S”为符号位:S=0,温度为正,S=1,温度为负。如果DS18B20被配置为12位分辨率,那么该16位寄存器中的所有bit都有效;如果是11位分辨率,那么bit0无效;如果是10位分辨率,那么bit0和bit1无效;如果是9位分辨率,那么bit0、bit1和bit2无效。LSBytebit7bit6bit5bit4bit3bit2bit1bit0232221202-12-22-32-4MSBytebit15bit14bit13bit12bit11bit10bit9bit8SSSSS262524DS18B20的初步了解温度数据表温度数字输出(二进制)数字输出(十六进制)+125°C000001111101000007D0h+85°C*00000101010100000550h+25.0625°C00000001100100010191h+10.125°C000000001010001000A2h+0.5°C00000000000010000008h0°C00000000000000000000h-0.5°C1111111111111000FFF8h-10.125°C1111111101011110FF5Eh-25.0625°C1111111001101111FE6Fh-55°C1111110010010000FC90hDS18B20的初步了解以12位分辨率为例,二进制数最低位增加1,表示温度增加0.0625°C。0.5°C的二进制数换算成10进制后为8,0.0625×8结果刚好为0.5。如果计算零下的温度值,需要先求得上述编码的补码。补码的计算过程是符号位不变,其余各位取反,然后加1。如表12.6所示,以-55°C为例,它的补码为1111101101110000,不考虑符号位,换算成十进制数为880,然后880×0.0625得到55,刚好符合表中的结果。控制DS18B20的指令虽然长得和三极管很像,但是它真的是一款数字型、总线通信的温度传感器。想要控制它的话,需要先知道常用的控制指令有哪些。访问一片DS18B20的顺序如下:1、设备上电后,通过发送一定时序的高低电平,实现设备的初始化。2、发送ROM命令,单片机的一个IO上可以挂载一个或多个DS18B20,所以此处可发送相关的ROM命令进行设备识别。3、发送功能命令,例如启动温度转换、设置温度报警上下限等等。控制DS18B20的指令首先看ROM相关的指令:1、F0H-搜索ROM。用来确定挂在同一总线上的DS18B20有多少个,获得相应的ROM码。2、33F-读ROM。一条总线上只接一个DS18B20时,发送该指令即可获取ROM码。3、55H-匹配ROM。发出该命令后,接着发出一个64bit的ROM码,即可选定该码对应的设备。4、CCH-跳过ROM。不检测64bit的ROM码,直接发送功能命令,常用于单个设备的情况。5、ECH-搜索报警命令。该指令的功能和搜索ROM的功能类似,区别在于只有出现了报警标志的从设备才会返回自身的ROM码。执行该指令的前提是DS18B20设置了温度报警的功能。控制DS18B20的指令6、44H-转换温度。DS18B20收到该指令后,根据当前温度,转换成相应的数据存入16bit的寄存器中。7、4EH-写暂存器。DS18B20内部有9个字节的暂存器,暂存器地址从0至8。执行该指令后,需向DS18B20写入三个字节的数据:第一个字节写入温度上限寄存器TH(第三个暂存器),设置报警温度的上限;第二个字节写入温度下限寄存器TL(第四个暂存器),设置报警温度的下限;第三个字节写入配置寄存器(第五个暂存器),设置转换精度。写指令时,由于是串行传输,写入顺序为先写低位,后写高位。8、BEH-读暂存器。从地址0开始,到地址8,可以依次读出暂存器的所有内容。如果只需要前面几个字节的内容,读出后对DS18B20进行复位设置,即可结束此次读过程。控制DS18B20的指令9、48H-复制暂存器。执行该指令,可以把TH、TL、配置寄存器中的内容复制到EEPROM中,即使以后设备断电,上述内容也不会丢失。10、B8H-读取EEPROM。执行该指令,会把EEPROM中的TH、TL、配置寄存器的值,分别存入暂存器中相应的位置。11、B4H-读取供电模式。DS18B20有两种供电模式:外部电源供电与寄生电源供电。执行该指令后,寄生电源供电的DS18B20会把总线拉低,外部电源供电的DS18B20会把总线拉高。控制DS18B20的指令上面提到了一个9字节的暂存器和EEPROM,暂存器内部包括9个寄存器,具体内容如表所示:寄存器名称寄存器地址温度值低位(LSB)(50H)0温度值高位(MSB)(05H)1温度上限(TH)*2温度下限(TL)*3配置寄存器*4保留(FFH)5保留(0CH)6保留(10H)7CRC校验值*8控制DS18B20的指令先看温度值低位与温度值高位,每次上电复位后,这两个寄存器默认值都是固定的(50H与05H),如果直接读取的话,对应的温度值是85°C。再看上表中带有*的寄存器,寄存器地址为2、3、4的值,可以通过复制暂存器的指令将三个值分别写入EEPROM中。而且,每次上电后这三位默认的值,也是自动从EEPROM中读取出来的。接下来看“配置寄存器”,之所以说它是配置寄存器,是因为它能控制温度转换的精度:到底是9位、10位、11位还是12位。它是一个8bit的寄存器,格式如表所示:R1与R0值由用户设置,其余6bit为固定值。R1与R0的值与转换精度对应的关系如表12.9所示:bit7bit6bit5bit4bit3bit2bit1bit00R1R011111R1R0分辨率最大转换时间009-bit93.75ms(tCONV/8)0110-bit187.5ms(tCONV/4)1011-bit375ms(tCONV/2)1112-bit750ms(tCONV)DS18B20的工作时序DS18B20使用了比较严格的1-wire通信协议来确保数据的完整性,毕竟只有一条线,既要进行读操作,又要进行写操作,这样一个半双工通信要有规范的说明。在该通信协议中定义了几个信号类型:复位脉冲、存在脉冲、写数据0、写数据1、读数据0和读数据1。除去存在脉冲,其它的信号都是由主机进行操作的。DS18B20的工作时序首先是复位脉冲和存在脉冲,它们两个结合在一起,组成了DS18B20的初始化信号。首先,主机发送一个复位脉冲,然后DS18B20返回一个存在脉冲。当存在脉冲返回之后,说明DS18B20已经准备好了,随时开始工作。DS18B20的工作时序DS18B20闲置状态下,保持数据脚为高电平:1、把数据脚拉低,持续时间480us~960us,进行复位操作。2、把数据脚拉高,将其释放。相当于把这条线的控制主动权交给DS18B20,勾引它做出应答。持续时间15~60us。3、DS18B20变得主动以后,只要器件本身没有质量问题,会向主机发出一个存在脉冲,也有的地方叫“应答脉冲”,毕竟有来有往的才叫通信,有来无往的只能叫做广播。存在脉冲为低电平脉冲,持续时间60~240us。所以主机只要在存在脉冲的时间内检测数据脚的电压,持续为低的话,说明DS18B20初始化正常。DS18B20的工作时序初始化完成后,进入写指令和读数据的阶段。在写操作中,有两种信号类型:0和1,时序图如图所示DS18B20的工作时序先看写0时隙(TIMESLOT),按照此时隙操作总线,可以向DS18B20写入1bit数据0。过程如下:先把总线拉低,维持低电平至少60us即可。再看写1时隙(TIMESLOT),按照次时隙操作总线,可以向DS18B20写入1bit数据1。过程如下:先把总线拉低,至少维持1us低电平,然后在14us内释放总线,让上拉电阻将总线拉高。向DS18B20写入数据的原理:无论写入0还是1,都要先把总线拉低,拉低的目的在于提醒DS18B20:我要给你写数据了,准备接收。DS18B20收到提醒后的15us开始,就要采样总线上的数据,此时总线上的数据是0,那就采集到0,如果是1,那就采集到1。DS18B20的工作时序再来看读操作,依然要读取0和1两种信号。先看时隙图DS18B20的工作时序首先,DS18B20无法主动向主机发送数据,只有当主机告诉它我要读数据的时候才可以。因此,主机需要先向DS18B20发出一个读数据之类的指令(例如读暂存器),然后紧跟读时隙的操作。所有读时隙的操作不能超过60us,每两个读时隙的操作之间,至少间隔1us的恢复时间。主机拉低总线至少1us后,然后释放总线,将总线的控制权交给DS18B20。此时DS18B20会通过拉高或拉低总线的方式,传输数据1或0。从总线拉低开始算起,数据1或0的有效时间为15us,因此主机必须在有效时间内对总线进行采样。15us之后,无论数据是1是0,总线都维持高电平。操作DS18B20的实例这里使用外部电源供电,总线上挂载一个DS18B20,控制流程如下:1、初始化DS18B20;2、发送命令0xCC,跳过读ROM;3、发送命令0x44,DS18B20将当前温度转换为数据,存入暂存器;4、等待一段时间,复位DS18B20,重新初始化;5、发送命令0xBE,告诉DS18B20,我要读取暂存器里面的数据;6、进行读操作,将温度值读出、保存。7、因为只需要读暂存器的前两位,温度读出后,发出480us~960us的低电平,复位DS18B20。操作DS18B20的实例为什么第3步执行完,要重新初始化,直接跳到第5步行么?答案是:不行。首先,前面提到了DS18B20的控制顺序:1、初始化;2、ROM指令;3、功能指令。所以每个ROM指令后面只能跟一个功能指令,如果再想发送ROM指令的话,那就重新初始化DS18B20。其次,为什么第4步里面先进行了一个延时,然后才是重新初始化?就像PCF8591进行AD转换一样,DS18B20转换温度也是需要一定时间的,不可能指令刚发过来,数据马上就能传送回去。所以,需要给出一定的时间,让DS18B20完成转换。操作DS18B20的实例如何确保转换完成?两种方法:1、如果是外部电源供电模式,当转换指令发送完毕后,可以检测总线的电平,如果为低电平,说明转换过程正在进行;如果为高电平,说明转换过程已经完成。2、也是下面这段程序使用的方法,不去判断,给出一个足够长的延时让它处理,然后去读数据就完了。任务如下:DS18B20外部供电,温度精度默认12位,数据脚接到单