关键词:写时序;读时序;温度传感器;温度采集
Abstract: A lot of new temperature sensors DS18B20 are used in distributed temperature measurement system. DS18B20 is a single bus digital temperature sensor. The hardware connection of temperature sensor is simple and time slots are very complex. Using the single bus temperature correctly, analyzing time slots and designing the program based on correct time slots have an important meaning. Initialization timing, writing time slots and reading slots are expounded in this paper in detail. Software program of realizing each time slots is provided. The temperature sampling is realized by use of initialization timing, writing time slots and reading slots. The design of 64-bit serial number reading program illustrates synthetical application of time slots. The design method of temperature sampling is illustrated. The temperature display is given out for distributed temperature measurement system. The accurate temperature reading and display based on time slots have been applied in distributed temperature measurement system.
Key words: Writing Time Slots; Reading Time Slots; Temperature Sensor; Temperature Sampling
1.引言
在分布式测温系统中应用了大量的新型传感器DS18B20,DS18B20是单总线数字温度传感器其硬件接线简单,但时序非常复杂。要实现温度的正确读取,既要有对DS18B20的ROM操作命令,又有一些功能命令。这些命令的执行,既有一定顺序,又有特定含义。都需要基于数字温度传感器初始化时序、写时序和读时序,按照严格的时序配合才能完成温度正确采集与读取。因此要想正确使用单总线数字温度传感器,必须分析其时序关系,并且基于时序编制正确程序。单总线数字温度传感器时序分析与应用研究具有及其重要意义。
2.数字温度传感器时序
DS18B20与单片机只通过一条数据线连接,所以其数据的传输方式为串行方式。为了正确读取温度值,必须严格按照时序配合关系,进行程序编制。DS18B20有严格的通信协议来保证数据传输的正确性和完整性。通信协议规定了总线上的多种信号的时序。如:复位脉冲、响应脉冲、写0、写1、读0和读1等信号的时序。DS18B20是在严格的时序控制下进行正常操作的。换句话讲,就是用较为复杂的软件来换取简单的硬件接口。因此要正确使用DS18B20,就必须了解其初始化时序、写时序和读时序。
2.1 数字温度传感器初始化时序
初始化时序有时也称复位时序,它是数据线上所有传输过程的开始。整个初始化过程由主设备发出的复位脉冲和DS18B20的响应脉冲组成。在主设备初始化的过程中,主设备通过拉低数据线至少480μS ,DS18B20即认为是接收到一个初始化脉冲,接着主设备释放数据线,在数据线上上拉电阻的作用下,数据线电平被拉高,并且主设备进入接收模式。在DS18B20检测到上升沿后,延时15~60μS ,接着通过拉低总线60~240μS以产生应答脉冲。初始化时序如图2所示。图1是图2、图3和图4的线型示意图。
图1 线型示意图
图2 初始化时序
在分布式测温系统中CPU采用AT89S52,温度读取的初始化程序如下所示:
DAT BIT P1.0
INI10: SETB DAT
MOV R2, #185
INI11: CLR DAT
DJNZ R2, INI11 ; 复位脉冲时间600us
SETB DAT ; 释放数据线
MOV R2, #28
INI12: DJNZ R2, INI12 ; 等待60us
CLR C
ORL C, DAT ; 有无应答低电平
JC INI10 ; 若无应答,初始化失败
MOV R6, #40
INI13: ORL C, DAT
JC INI14 ; 数据线变高。初始化成功
DJNZ R6, INI13 ; 低电平最多240us
SJMP INI10 ; 低电平持续大于240us,失败
INI14: MOV R2, #222
INI15: DJNZ R2, INI15 ; 应答信号至少要持续480us
RET
2.2 数字温度传感器写时序
写时序包括写“0”时序和写“1”时序。写“1”时序用于主设备向DS18B20写入1,写“0”时序用于主设备向DS18B20写入0。无论是哪种写时序都至少需要60μS ,且在两次独立的写时序之间至少需要1μS的恢复时间。两种写时序均起始于主设备拉低数据线电平。对于写“1”时序,主设备在拉低数据线之后,紧接着必须在15μS之内释放数据线,由上拉电阻将数据线拉至高电平;而对于写“0”时序,在主设备拉低数据线后,只需在整个时序内保持低电平即可至少60μS。在写时序开始后的15~60μS期间内,DS18B20读取数据线电平状态。如果此期间数据线为高电平 ,则对器件写入逻辑1,否则写入逻辑0。写时序如图3所示。
图3 数字温度传感器写时序
写一位程序如下所示。程序中DAT为I/O口P1.0。
WIR11: SETB DAT ; 拉高电平
MOV R4, #5
NOP
CLR DAT ; 高电平持续2us后拉低
WIR12: DJNZ R4, WIR12 ; 等待10微秒
MOV DAT, C ; 发送1位
MOV R4, #23
WIR13: DJNZ R4, WIR13 ; 保证写时间大于60us
SETB DAT
RET
2.3 温度传感器读时序
DS18B20只有在检测到主设备启动读时序后才向主设备传输数据。所以一般在主设备发送了读数据命令后,必须马上产生读时序,以便DS18B20能够传输数据。所有的读时序都至少需要60μS,且在两次独立的读时序之间至少需要1μS的恢复时间。每个读时序都由主设备发起,先使数据线为高电平,然后拉低数据线至少1μS,再释放数据线。在主设备发出读时序之后,DS18B20开始在数据线上发送数据0或1。若其发送1,则保持数据线为高电平。若发送0,则DS18B20拉低数据线,在该时序结束后释放数据线。DS18B20发出的数据在起始时序之后15μS内保证可靠有效。因而主设备在读时序期间必须释放数据线,并且要在时序开始后的15μS之内读取数据线状态。写时序如图4所示。
图4 数字温度传感器读时序
读一位程序如下所示:
RE11: SETB DAT ; 使数据线为高电平
NOP
NOP
CLR DAT ; 高电平持续2us后拉低数据线
MOV R4, #4
NOP ; 持续低电平2us
SETB DAT ; 释放数据线
RE12: DJNZ R4, RE12 ; 等待8us
MOV C, DAT ; 读入一位
MOV R5, #28
RE13: DJNZ R5, RE13 ; 保证一个读周期持续60us
SETB DAT ; 使数据线为高电平
RET
3.初始化以及读写时序应用
3.1 温度采集程序设计
单总线数字温度传感器DS18B20要完成温度的采集需要按顺序完成如下几个步骤:初始化、跳过ROM匹配、启动转换、等待转换完成、初始化、匹配ROM、读便笺式存储器、CRC校验、温度格式转换、保存温度值以及显示等其他处理。按照此步骤,程序设计时首先就要按照初始化时序执行2.1所介绍的初始化程序INI10,其次要将跳过ROM匹配命令(代码为CCH)写入到DS18B20中,此时需根据2.2所介绍的数字温度传感器写时序编写对DS18B20一个写入字节程序WRITE,将跳过ROM匹配命令写入DS18B20。为了完成温度启动转换,需要将启动转换命令写入DS18B20中。用延时750ms等待转换完成。随后再按照初始化时序执行本文中2.1所介绍的初始化程序INI10,用写入一个字节程序将匹配ROM命令(代码为55H)写入到DS18B20中。为了完成读便笺式存储器操作,需要先结合数字温度传感器写时序将读便笺式存储器命令(代码为BEH)写入到DS18B20中,再用温度传感器读时序编写的读一个字节程序READ,连续读取DS18B20便笺式存储器中9个字节的内容。由此可见,要想实现温度正确采集,需要结合上述所介绍的初始化时序、温度传感器写时序和温度传感器读时序,才可以将所需的命令写入与读出。完成温度的正确读取。
3.2 温度传感器序列号读取程序设计
每个单总线数字温度传感器DS18B20出厂时都有唯一的一个64位序列号,在使用温度传感器之前,需事先将每个温度传感器逐一挂接在I/O口如P1.0上,再读取温度传感器的序列号。当I/O口上挂接一个温度传感器DS18B20时,可以用读ROM命令完成64位序列号的读取。程序设计思路是首先将读ROM命令(代码为33H)送入累加器A中,随后调用写入一个字节程序WRITE,然后调用读64位序列号程序DXLH。在写入一个字节程序WRITE中,置循环次数为8,再调用写入一位子程序,严格按照时序关系,执行传感器写时序,循环8次写完一个字节。在读64位序列号程序DXLH中,置内部RAM首地址为30H,置循环次数为8,调用读一个字节程序READ,将读取数据存放在内部RAM中。循环8次读完8个字节即64位序列号。读出的64位序列号将存放到内部RAM 30H ~ 37H单元中。读一个字节程序READ如下所示。
READ: MOV R6, #8 ; 循环次数为8
SETB DAT ; 读出一位程序,执行传感器读时序
NOP
NOP
RD11: CLR DAT
MOV R4, #4
NOP ; 持续低电平2us
SETB DAT ; 释放数据线
RD12: DJNZ R4, RD12 ; 等待8us
MOV C, DAT ; 读入一位
RRC A ; 将读入数据移入累加器A
MOV R5, #28
RD13: DJNZ R5, RD13 ; 保证一个读周期持续60us
DJNZ R6, RD11 ; 循环8次读一个字节
SETB DAT
RET
上述程序执行完毕,可将温度传感器的64位序列号存放在单片机内部RAM 30H ~ 37H单元中。
4.分布式测温系统中温度显示
分布式测温系统中,采用液晶显示可以实现房间号的显示,实际温度的显示,报警上限值的显示以及报警发生时的时间。还可以循环显示多个房间的实际温度和上限值。如图5所示。
图5 分布式测温系统中对应房间温度以及报警上限显示
5.结束语
正确读取多个单总线数字温度传感器DS18B20的温度在分布式测温系统中是非常重要的。由于在程序设计时必须根据严格的时序关系,因此本文作者创新点是详细阐述了初始化时序、读写时序等复杂逻辑关系,设计了正确的温度序列号读取程序和温度读写程序并能够进行液晶显示。由于单总线数字温度传感器DS18B20各个功能的实现是通过各种ROM命令与操作功能命令实现的,这些命令一环扣着一环,每个环都是一个时序的集合。在进行程序调试时,不能像调试其它程序一样用单步执行来进行跟踪,因此对错误查找和程序优化带来了很大的难度。在遇到程序运行出错时,只能够根据错误现象来分析、推测、修改和再运行来解决,而不能直接定位。文中所介绍的单总线数字温度传感器DS18B20程序设计思路与方法,目前已较好地应用于分布式测温系统中,并且满足一定精度要求。
参考文献
[1] 沙占友,智能化集成温度传感器原理与应用[M],机械工业出版社,2002
[2] 周月霞,孙传友,DS18B20硬件连接及软件编程 [J],传感器世界,2001.12
[3] Dallas Semiconductor. DS18B20 1-Wire Digital Thermometer [Z]. Dallas Semiconductor Co, 2002
[4] 徐维涛,郝晓弘,OCXO恒温槽温度控制系统控制方法研究[J],微计算机信息,2006年第 3 期