DS18B20传感器与单片机的接口
DS18B20是DALLAS半导体公司生产的具有“一线总线(单总线)”接口的数字温度传感器。现场温度直接以“一线总线”的数字方式传输,提高了系统的抗干扰性,适合于恶劣环境的现场温度测量,如环境控制、设备或过程控制、测温类消费电子产品等。DS18B20的管脚排列如图7-43所示。
图7-43 DS18B20引脚分布
(一)DS18B20的性能特点
(1)采用单总线专用技术,既可通过串行口线,也可通过其他I/O口线与微机/单片机接口,无须经过其他变换电路,直接输出被测温度值(9位二进制数,含符号位)。
(2)测温范围为-55~+125℃,测量分辨率为0.0625℃,DS18B20可通过程序设定9~12位的分辨率。
(3)内含64位经过激光修正的只读存储器ROM。
(4)适配各种单片机或系统机。
(5)内置EEPROM,具有限温报警功能。用户可分别设定各路温度的上、下限,设定的分辨率以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。
(6)内含寄生电源。
(二)DS18B20的内部结构
DS18B20共有三种形态的存储器资源,具体如下。
(1)64位光刻ROM,用于存放DS18B20ID编码,数据在出产时设置不由用户更改。其前8位是单线系列编码(DS18B20的编码是19 H),后面48位是芯片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。
(2)RAM高速数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存,存放温度上、下限)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6~8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。
(3)EEPROM非易失性记忆体,用于存放长期需要保存的数据、上下限温度报警值和校验数据。DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
在实际应用中,测量的实际温度值与分辨率有关。DS18B20温度测量分辨率有四种,即9位测量分辨率、10位测量分辨率、11位测量分辨率和12位测量分辨率,对应的温度测量精度分别为0.5℃、0.25℃、0.125℃和0.0625℃。9~12位的测量,无论采用哪种分辨率,温度整数的有效位均是表7-8中26~20、2-1~2-4,低8位中低4位为温度小数的有效位。
表7-8 DS18B20中16位温度数值的含义
以12位测量分辨率为例说明温度高低字节存放形式及计算:12位转化后得到的12位数据,存储在DS18B20的两个高、低8位的RAM中,其中二进制中的前面5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度(等价说明:高8位字节的低3位和低8位字节的高4位组成温度整数值的二进制数;或者说:12位测量时,所测数值乘以0.0625(=1/16),即右移4位后去掉了二进制数的小数部分);如果温度小于0,这5位为1,测到的数值需要取反加1再乘以0.0625才能得到实际温度(等价说明:当温度小于0时,整数部分就是各位取反,小数部分则是各位取反后加1)。部分实际温度值与测量数据的关系见表7-9。
表7-9 实际温度值与测量数据的对应关系
(三)DS18B20控制方法
在硬件上,DS18B20与单片机的连接有两种方法,一种是VCC接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5kΩ左右的上拉电阻。
单片机与DS18B20进行数据交换之前,单片机首先发送ROM指令,双方达成协议之后才进行数据交换。ROM指令共有5条,一个工作周期发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索,见表7-10。ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并做处理。如果总线上只有一个从属设备DS18B20时,则不需要匹配,执行0CCH(跳过命令)即可。
表7-10 DS18B20的ROM指令
在ROM指令发送给DS18B20之后,接着(不间断)发送存储器操作指令。操作指令同样为8位,共6条,分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令DS18B20工作,是芯片控制的关键。单片机发送存储器RAM操作指令见表7-11。
表7-11 DS18B20芯片存储器操作指令表
CPU对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器和数据操作。如果只有一个DS18B20,不需要匹配,主机送出0CCH(跳过命令)之后紧跟着BEH(读命令)。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通信协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令。这样才能对DS18B20进行预定的操作。
(四)DS18B20的时序
1.DS18B20复位时序
DS18B20复位时序如图7-44所示:总线在t0时刻发送一个复位脉冲(最短为480μs的低电平信号),接着在t1时刻释放总线并进入接收状态,DS18B20在总线的上升沿之后等待15~60μs,然后在t2时刻发出存在脉冲(低电平持续60~240μs),单片机接收到低电平脉冲说明复位成功,否则需重新进行复位操作。
图7-44 DS18B20复位时序
复位函数必须严格按照时序图编写,尤其应注意延时时间的准确性。图7-45为DS18B20复位流程图。
假设51单片机晶振12MHz,采用一根I/O口线P2.2与温度传感器DS18B20的数据端I/O连接,如图7-46所示。
图7-45 DS18B20复位流程图
图7-46 单片机与DS18B20的接口
基于单片机与DS18B20的接口图,复位初始化子程序如下:
2.DS18B20写0和写1时序
DS18B20写0和写1时序如图7-47所示:当主机总线在t0时刻从高拉至低电平时就产生写时间间隙。从t0时刻开始15μs之内主机应将所需写的位送到总线上,DS18B20在随后15~60μs内对总线电平采样,然后数据端置位高电平。连续写2位的间隙应大于1μs。图7-48为写DS18B20指令字节的流程图,写DS18B20的子程序如下:
图7-47 DS18B20的写时序
图7-48 写DS18B20指令字节的流程图
3.DS18B20读字节时序
DS18B20读字节时序如图7-49所示:主机总线在t0时刻从高拉至低电平时,总线只需保持低电平1~4μs,之后在t1时刻将总线拉高产生读时间隙,读时间隙在t1时刻后t2时刻前有效,t2距t0 15μs,也就是说t2时刻前主机必须完成读操作,并在t0后的60~120μs内释放总线。连续读2位的间隙应大于1μs。从DS18B20中读出两个字节的温度数据流程图如图7-50所示,程序如下。
图7-49 DS18B20的读时序
图7-50 读DS18B20两个温度字节的流程图
(五)单片机与DS18B20的接口程序
DS18B20采用器件默认的12位转化,最大转化时间为750μs,目的是将检测到的温度直接显示到AT89C51的两个数码管上。读DS18B20测量温度子程序流程图如图7-51所示。LCALL GET_TEMPATURE返回后,由于12位转化时每一位的精度为0.0625度,题目不要求显示小数,所以可以丢弃29H的低4位。将29H的高4位移入低4位,将28 H中的低4位移入29 H中的高4位,这样29 H单元中就是实际测量获得的温度。单片机汇编程序如下:
图7-51 读DS18B20温度的流程图
读出转换后的温度值子程序如下: