温度传感器DS18B20 MCU起航 QQ:2246080671
主要内容 1、DS18B20的初步了解 2、控制DS18B20的指令 3、DS18B20的工作时序 4、操作DS18B20的实例
DS18B20的初步了解 DS18B20是Dallas半导体公司生成的一款数字式温度传 感器,也有的地方说它的厂家是美国美信(MAXIM)半导体 公司,其实也没错,因为美信在2001年收购了Dallas,它成 为了美信的全资子公司。所以,说它是美信生产的没问题。
DS18B20的初步了解 DS18B20有两大特点:1、数字式传感器,读取便捷;2、 一线式总线(1-wire bus)通信,只占用一个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无效。 LS Byte bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 23 22 21 20 2-1 2-2 2-3 2-4 MS Byte bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8 S 26 25 24
DS18B20的初步了解 温度数据表 温度 数字输出(二进制) 数字输出(十六进制) +125°C 0000 0111 1101 0000 07D0h +85°C* 0000 0101 0101 0000 0550h +25.0625°C 0000 0001 1001 0001 0191h +10.125°C 0000 0000 1010 0010 00A2h +0.5°C 0000 0000 0000 1000 0008h 0°C 0000 0000 0000 0000 0000h -0.5°C 1111 1111 1111 1000 FFF8h -10.125°C 1111 1111 0101 1110 FF5Eh -25.0625°C 1111 1110 0110 1111 FE6Fh -55°C 1111 1100 1001 0000 FC90h
DS18B20的初步了解 以12位分辨率为例,二进制数最低位增加1,表示温度 增加0.0625°C。0.5°C的二进制数换算成10进制后为 8,0.0625×8结果刚好为0.5。 如果计算零下的温度值,需要先求得上述编码的补码。 补码的计算过程是符号位不变,其余各位取反,然后加1。 如表12.6所示,以-55°C为例,它的补码为1111 1011 0111 0000,不考虑符号位,换算成十进制数为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) 温度值高位(MSB) (05H) 1 温度上限(TH)* 2 温度下限(TL)* 3 配置寄存器* 4 保留 (FFH) 5 保留 (0CH) 6 保留 (10H) 7 CRC校验值* 8
控制DS18B20的指令 先看温度值低位与温度值高位,每次上电复位后,这两 个寄存器默认值都是固定的(50H与05H),如果直接读取 的话,对应的温度值是85°C。 再看上表中带有*的寄存器,寄存器地址为2、3、4的 值,可以通过复制暂存器的指令将三个值分别写入EEPROM 中。而且,每次上电后这三位默认的值,也是自动从 EEPROM中读取出来的。
接下来看“配置寄存器”,之所以说它是配置寄存器, 是因为它能控制温度转换的精度:到底是9位、10位、11位 还是12位。它是一个8bit的寄存器,格式如表所示: R1与R0值由用户设置,其余6bit为固定值。R1与R0的 值与转换精度对应的关系如表12.9所示: bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 R1 R0 1 R1 R0 分辨率 最大转换时间 9-bit 93.75ms (tCONV/8) 1 10-bit 187.5ms (tCONV/4) 11-bit 375ms (tCONV/2) 12-bit 750ms (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时隙(TIME SLOT),按照此时隙操作总线, 可以向DS18B20写入1bit数据0。过程如下:先把总线拉低, 维持低电平至少60us即可。 再看写1时隙(TIME SLOT),按照次时隙操作总线, 可以向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位, 数据脚接到单片机P3.7脚,每隔一秒单片机读取当前温度值, 然后通过UART口传到串口助手上。