基于1-wire总线的温度数据采集与硬件设计
2012-07-04左现刚刘艳昌
左现刚,刘艳昌
(河南科技学院 信息工程学院,新乡 453003)
0 引言
单片机系统除了可以对电信号进行测量外,还可以通过外接传感器对温度信号进行测量。传统的温度检测大多以热敏电阻为传感器,但热敏电阻可靠性差、测量的温度不够准确,且必须经专门的接口电路转成数字信号后才能被单片机处理。DS18B20是一种集成数字温度传感器,采用单总线与单片机连接即可实现温度的测量。
系统是以AT89S51单片机、DS18B20单线温度转换器和LED为主要元器件得的一个对温度进行数据采集并在LED上进行显示的系统。它实现的功能就是把模拟的温度信号以数字化的形式在LED上显示出来,使人们更直接方便的读出温度值。系统整体框图如下图1所示。
图1 系统整体框图
1 DS18B20工作原理
DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供单片机处理,可实现温度的精度测量与控制。测温范围为-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃,分辨率可通过编程控制设置为0.5℃,0.25℃,0.125℃和0.0625℃。
1.1 工作原理
DS18B20的内部框图如图2所示,主要包括寄生电源、温度传感器、64位激光ROM单线接口、存放中间数据的高速贮存器、用于存储用户设定的温度上下限值、触发器存储与控制逻辑、8位循环冗余校验码发生器等7部分。
图2 DS18B20内部框图
高速寄存器RAM由9个字节的存储器组成。其中,第0、1字节是温度转换有效位,第0字节的低3位存放了温度的高位,高5位存放温度的正负值;第1字节的高4位存放温度的低位,后4位存放温度的小数部分;第2和第3个字节是DS18B20的与内部E2PROM的有关的TH和TL,用来存储温度上限和下限,可以通过程序设计把温度的上下限从单片机中读到TH和TL中,并通过程序再复制到DS18B20内部E2PROM中,同时TH和TL在器件加电后复制E2PROM的内容;第4个字节是配置寄存器,第4个字节的数字也可以更新;第5,6,7三个字节是保留的。
DS18B20中的温度传感器完成对温度的测量,通过16位符号扩展的2进制补码读数形式提供,以0.0625℃/LSB形式表达,如表1所示。
表1 高速寄存器RAM
1.2 硬件连接
DS18B20是单片机外设,单片机为主器件,DS18B20为从器件。图3的接法是单片机与一个DS18B20通信,单片机只需要一个I/O口就可以控制DS18B20,为了增加单片机I/O口驱动的可靠性,总线上接有上拉电阻。对如果要控制多个DS18B20进行温度采集,只要将所有DS18B20的DQ全部连接到总线上就可以了,在操作时,通过读取每个DS18B20内部芯片的序列号来识别。
1.3 DS18B20工作时序
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了三种信号的时序:初始化时序、读时序和写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。下面分别介绍操作步骤。
图3 单片机与一个DS18B20通信
1)初始化
初始化是单片机对DS18B20的基本操作,主要目的是单片机感知DS18B20存在并为下一步操作做准备,同时启动DS18B20,程序设计根据时序进行。DS18B20初始化操作步骤为:
(1)先将数据线置高电平1,然后延时(可有可无);
(2)数据线拉到低电平0。然后延时750μs(该时间范围可以在480~960μs),调用延时函数决定;
(3)数据线拉到高电平1。如果单片机P1.0接DS18B20的DQ引脚,则P1.0 此时设置高电平,称为单片机对总线电平管理权释放。此时,P1.0的电平高低由DS18B20的DQ输出决定;
(4)延时等待。如果初始化成功,则在15~60ms总线上产生一个由DS18B20返回的低电平0,据该状态可以确定它的存在。但是应注意,不能无限地等待,不然会使程序进入死循环,所以要进行超时判断;
(5)若单片机读到数据线上的低电平0后,说明DS18B20存在并相应,还要进行延时,其延时的时间从发出高电平算起(第(5)步的时间算起)最少要 480μs;
(6)将数据线再次拉到高电平1,结束初始化步骤。
从单片机对DS18B20的初始化过程来看,单片机与DS18B20之间的关系如同有人与人之间对话,单片机要对DS18B20操作,必须先证实DS18B20的存在,当DS18B2响应后,单片机才能进行下面的操作。
2)对DS18B20写数据
(1)数据线先置低电平0,数据发送的起始信号;
(2)延时确定的时间为15μs;
(3)按低位到高位顺序发送数据(一次只发送一位);
(4)延时时间为45μs,等待DS18B20接收;
(5)将数据线拉到高电平1,单片机释放总线;
(6)重复(1)~(5)步骤,直到发送完整个字节;
(7)最后将数据线拉高,单片机释放总线。
3)DS18B20读数据
(1)将数据线拉高;
(2)延时 2μs;
(3)将数据线拉低到0;
(4)延时6μs,延时时比写数据时间短;
(5)将数据线拉高到1,释放总线;
(6)延时 4μs;
(7)读数据线的状态得到一个状态位,并进行数据处理;
(8)延时 30μs;
(9)重复(1)~(7)步骤,直到读取完一个字节。
只有在熟悉了DS18B20操作时序后,才能对器件进行编程,由于DS18B20有器件编号、温度数据有低位高位、另外还有温度的上线限,读取的数据较多,所以DS18B20提供了自己的指令。
1.4 DS18B20指令
1)ROM操作指令
DS18B20指令主要有ROM操作指令、温度操作指令两类。ROM操作指令主要针对DS18B20的内部ROM。每一个DS18B20都有自己独立的编号,存放在DS18B20内部64位ROM中,ROM内容见表2所示。64位ROM中的序列号是出厂前已经固化好,它可以看做该DS18B20的地址序列码。其各位排列顺序是,开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前面56位的CRC循环冗余校验码(CRC=X8+X5+X4+1)。
表264 位 ROM 定义
ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线上挂接多个DS18B20的目的。ROM操作指令如表3所示。
在实际应用中,如果总线上只存在一个DS18B20,就不需要读取ROM编码以及匹配ROM编码了,只要跳过ROM(CCH)命令,就可进行如下温度转换和读取操作。
2)温度操作指令
温度操作指令见表4所示,DS18B20在出厂时温度数值默认为12位,其中最高位为符号位,即
表3 ROM 操作指令
温度值共11位,单片机在读取数据时,依次从高速寄存器第0、1地址读2字节共16位,读完后将低11位的二进制数转转换为实际温度值。0地址对应的1个字节的前5个数字为符号位,这5位同时变化,前5位为1时,读取的温度为负值;前5位为0时,读取的温度为正值,且温度为正值时,只要将测得的数值乘以0.0625即可得到实际温度值。
表4 温度操作指令
2 数字温度计
2.1 电路原理
AT89S51单片机和DS18B20的硬件连接图如图4所示,单片机的P10口和DS18B20的数据口相连接。单片机通过P10口对DS18B20进行初始化,DS18B20将转换后的数字温度值通过P10口传给单片机。
2.2 系统软件设计
图4 温度采集系统硬件连接图
本程序采用Keil 公司IDE软件uVision3设计和编译。主要包括温度检测和显示,按键驱动和温度控制等。其中温度检测是单片机通过调用初始化函数对DS18B20按照初始化时序进行初始化,启动温度的转换,再将转换后的数字传给单片机,单片机通过计算将数字温度转换成实际的温度值,通过数码管显示出来,并和设置的温度值进行比较,如何大于设置的温度上限或者小于设置的温度的下限,则给P11管脚一个低电平信号,则PNP三极管8550导通,驱动蜂鸣器发出告警声音;同时调用控制程序来控制P12管脚以便吸合或者断开,达到根据温度来控制的目的。其初始化函数可以根据上面介绍的过程写出,下面详细的介绍对DS18B20的温度读取函数。主程序流程图如图5所示。
/*******************************
* 读取温度函数
*******************************/
uint ReadTemperature(void)
{
unsigned char a=0,b=0;
Init_DS18B20(); //DS18B20初始化函数
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
delay(200); //延迟一段时间,等待温度转换完毕
图5 主程序流程图
Init_DS18B20(); //在读温度值前必须重新初始化18b20;
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//读温度值低8位,赋给变量a。
b=ReadOneChar();//读温度值高8位,赋给变量b。
t=b;
t<<=8; //
t=t|a; //把温度值低8位和温度值高8位赋给变量t。
tt=t*0.0625; //12位分辨率,乘以温度分辨率0.0625后为温度值
t=tt*10+0.5; //取小数点后一位值,因此要放大10倍后加0.5输出,即四舍五入。
return(t); //返回温度值,送LED显示并和设置的温度值进行比较。
}
3 结束语
DS18B20体积小、精度高、接口简单、硬件开销低、附加功能强。将温度检测与温度数据输出都集成在一个微小的芯片上,不需要A/D转换,并且能自动产生CRC检验码,从而使得其的抗干扰纠错能力很强、可靠性更高、使用更为方便。基于AT89S51系列单片机和DS18B20数字温度传感器的温度测量系统结构简单、成本低、操方便,比较好推广,而且也可以根据情况进行扩展,比如进行多点采集等。
[1] 孔庆霞, 朱全银.基于DS18B20的远距离分布式温度数据采集系统[J].电子测量技术, 2009, 32: 4.
[2] 马臣岗, 孟立凡.基于单总线式无线温度采集系统设计[J].电子设计工程, 2010(3): 31-33.
[3] 舒斌, 吴建, 仲志燕.基于单片机和FPGA的远程温度监控系统[J].现代电子技术,2008,31(17):127-130.
[4] 张军.智能温度传感器DS18B20及其应用[J].仪表技术,2010, 4: 68-70.
[5] 周学军.基于AT89C2051的数字温度计设计[J].现代电子技术, 2010, 17: 164-165.