资源描述
第 45 页 共 45 页
引言
随着“信息时代”的到来,作为获取信息的手段——传感器技术得到了显著的进步,其应用领域越来越广泛,对其要求越来越高,需求越来越迫切。传感器技术已成为衡量一个国家科学技术发展水平的重要标志之一。因此,了解并掌握传感器的基本结构、工作原理及特性是非常重要的。
为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。本文利用单片机结合传感器技术而开发设计了红外抄表系统。文中把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,以及实现红外数据传输的过程。
本设计应用性比较强,只要对电路部分稍加改装,就可以实现抄读其它的数字仪表设备:如数字电度表,数字水表等等。设计后的系统具有操作方便,控制灵活等优点。
其主要功能和指标如下:
1、利用温度传感器(DS18B20)测量某一点环境温度;
2、测量范围为-55℃~+99℃,精度为±0.5℃;
3、用4位数码管进行显示实际温度值显示;
4、手持端通过红外发射管发射测温信号;
5、测温端通过红外发射管发送到手持端;
6、手持端可以随时查看指定待测物体的温度值。
设计的核心是环境温度的测量以及红外数据的发射和接收,和温度的显示。文中对每个部分功能、实现过程作了详细地介绍。
1 方案选择
该系统主要由温度测量和数据采集和发送三部分组成。下面列举两种实现方案:
方案一:温度检测可以使用低温热偶或铂电阻,数据采集部分则使用带有A/D通道的单片机。考虑到一般的A/D输入通道都只能接收大信号,所以还要设计相应的放大电路。而模拟信号在长距离传输过程中,抗电磁干扰是令人伤脑筋的问题。此方案的软件简单,但硬件复杂,且检测点数追加时,各敏感元件参数的不一致性,都将会导致误差的产生,难以完全清除,而且成本会有较大增长幅度。
方案二:使用单片机和数字式单总线温度传感器构成。其具有下列特点:①具有高的测量精度和分辨率,测量范围大;②抗干扰能力强,稳定性好;③信号易于处理、传送和自动控制;④便于动态及多路测量,读数直观;⑤安装方便,维护简单,工作可靠性高。单总线温度传感器可以采用DALLAS公司生产的DS18B20系列,这类温度传感器直接输出数字信号,且多路温度传感器可以挂在1条总线上,共同占用单片机的1个I/O口即可实现。在提升单片机I/O口驱动能力的前提下,理论上可以任意扩充检测的温度点数。
比较两个方案后可以发现,方案二更适合于用作本系统的实施方案。尽管方案二不需要A/D,但考虑到系统扩充等因素,单片机可以选用AT98C2051。
2 硬件部分
采用方案二的硬件设计比较简单,系统构成如图1所示。
数码管
红外发射
AT89C51
DS18B20
红外接收
红外发射
数码管
AT89C51
图 1温度测试系统和手持接收系统组成框图
2.1 DS18B20介绍
DA
按键
LLAS公司的DS18B20单总线数字传感器工作温度
红外接收
范围是-55℃~125℃,在-30℃~85℃范围内温度测量精度为±0.5℃;具有温度报警功能,用户可设置最高和最低报警温度,且设置值掉电不丢失;采用DALLAS公司特有的单总线通信协议,只用一条数据线就可实现与MCU的通信;此外,DS18B20能够直接从数据线获得电源,无需外部电池供电。
DS18B20通过使用在板(on_board)温度测量专利技术来测量温度。其温度测量电路是通过计数时钟周期来实现的,DS18B20有两个温度系数振荡器,温度测量时对高温度系数振荡器产生的门开同期内,低温度系数振荡器经历的时钟周期的个数进行计数而得到的。
DS18B20数字温度传感器提供9位(二进制)温度读数,指示器件温度,所以无需A/D转换。信息经过单线接口送入DS18B20 或从DS18B20送出,因此从主机CPU到DS18B20仅需一条线连接,而且DS18B20的电源可由数据线本身提供(相对于外部电源,转换时间要延长)。因此每一个DS18B20在出厂时已经给定了唯一的序号因此从理论上说任意多个DS18B20可以连接在一条单线总线上。DS18B20的测量范围从-55℃到+125℃,增量为0.5℃(最高精度可达0.1℃),转换速度小于1s(典型值)。
AT89C51
DS18B20
而在本遥测系统中采用外部电源供电温度测量工作方式,其中电阻R是上拉电阻,使得单线总线的空闲状态是高电平。它与CPU(AT89C51)的接法如图2。
5 V
R
地
图 2 DS18B20与单片机的连接
由于DS18B20只有一根数据线。因此它和主机(单片机)通信是需要串行通信,而AT89C51有两个串行端口,所以可以不用软件来模拟实现。经过单线接口访问DC18B20必须遵循如下协议:初始化、ROM操作命令、存储器操作命令和控制操作。要使传感器工作,一切处理均从序列开始。
主机发送(Tx)--复位脉冲(最短为480μs的低电平信号)。接着主机便释放此线并进入接收方式(Rx)。总线经过4.7K的上拉电阻被拉至高电平状态。在检测到I/O引脚上的上升沿之后,DS18B20等待15-60μs,并且接着发送脉冲(60-240μs的低电平信号)。然后以存在复位脉冲表示DS18B20已经准备好发送或接收,然后给出正确的ROM命令和存储操作命令的数据。DS18B20通过使用时间片来读出和写入数据,时间片用于处理数据位和进行何种指定操作的命令。它有写时间片和读时间片两种。
写时间片:当主机把数据线从逻辑高电平拉至逻辑低电平时,产生写时间片。有两种类型的写时间片:写1时间片和写0时间片。所有时间片必须有60微秒的持续期,在各写周期之间必须有最短为1微秒的恢复时间。
读时间片:从DS18B20读数据时,使用读时间片。当主机把数据线从逻辑高电平拉至逻辑低电平时产生读时间片。数据线在逻辑低电平必须保持至少1微秒;来自DS18B20的输出数据在时间下降沿之后的15微秒内有效。为了读出从读时间片开始算起15微秒的状态,主机必须停止把引脚驱动拉至低电平。在时间片结束时,I/O引脚经过外部的上拉电阻拉回高电平,所有读时间片的最短持续期为60微秒,包括两个读周期间至少1μs的恢复时间。
一旦主机检测到DS18B20的存在,它便可以发送一个器件ROM操作命令。所有ROM操作命令均为8位长。
DS18B20的引脚定义和封装形式如图3所示。DQ为数字信号输入/输出端;GND为电源地;VDD为外接电源。
DS18B20的光刻ROM中存有64位序列号,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20拥有惟一的地址序列码,以确保在一根总线上挂接多个DS18B20。
所有的串行通讯,读写每一个bit位数据都必须严格遵守器件的时序逻辑来编程,同时还必须遵守总线命令序列,对单总线的DS18B20芯片来说,访问每个器件都要遵守下列命令序列:首先是初始化;其次执行ROM命令;最后就是执行功能命令(ROM命令和功能命令后面以表格形式给出)。
如果出现序列混乱,则单总线器件不会响应主机。当然,搜索ROM命令和报警搜索命令,在执行两者中任何一条命令之后,要返回初始化。
基于单总线上的所有传输过程都是以初始化开始的,初始化过程由主机发出的复位脉冲和从机响应的应答脉冲组成。应答脉冲使主机知道,总线上有从机,且准备就绪。
在主机检测到应答脉冲后,就可以发出ROM命令。这些命令与各个从机设备的唯一64 位ROM代码相关。在主机发出ROM命令,以访问某个指定的DS18B20,接着就可以发出DS18B20支持的某个功能命令。这些命令允许主机写入或读出DS18B20便笺式RAM、启动温度转换。软件实现DS18B20的工作严格遵守单总线协议:
(1)主机首先发出一个复位脉冲,信号线上的DS18B20器件被复位。
(2)接着主机发送ROM命令,程序开始读取单个在线的芯片ROM编码并保存在单片机数据存储器中,把用到的DS18B20的ROM编码离线读出,最后用一个二维数组保存ROM编码,数据保存在X25043中。
(3)系统工作时,把读取了编码的DS18B20挂在总线上。发温度转换命令,再总线复位。
(4)然后就可以从刚才的二维数组匹配在线的温度传感器,随后发温度读取命令就可以获得对应的温度值了。
在主机初始化过程,主机通过拉低单总线至少480us,来产生复位脉冲。接着,主机释放总线,并进入接收模式。当总线被释放后,上拉电阻将单总线拉高。在单总线器件检测到上升沿后,延时15~60us,接着通过拉低总线60-240us,以产生应答脉冲。
写时序均起始于主机拉低总线,产生写1时序的方式:主机在拉低总线后,接着必须在15us之内释放总线。产生写0时序的方式:在主机拉低总线后,只需在整个时序期间保持低电平即可(至少60us)。
在写字节程序中的写一个bit位的时候,没有按照通常的分别写0时序和写1时序,而是把两者结合起来,当主机拉低总线后在15us之内将要写的位c给DO:如果c是高电平满足15us内释放总线的要求,如果c是低电平,则DO
=c这条语句仍然是把总线拉在低电平,最后都通过延时58us完成一个写时序(写时序0或写时序1)过程。
每个读时隙都由主机发起,至少拉低总线1us,在主机发起读时序之后,单总线器件才开始在总线上发送0或1。所有读时序至少需要60us。
单片机通过命令实现对DS18B20的控制,其支持的主要命令如表1所示。
表 1 DS18B20主要命令及其功能说明
命令码
功能说明
命令码
功能说明
33H
读ROM中的64位地址序列码
BEH
读9字节暂存寄存器
55H
只有地址码匹配的DS18B2才能接收后续的命令
4EH
写入温度上/下限,紧随其后是2字节数据,对应上限和下限值
F0H
锁定总线上DS18B20的个数和识别其ROM中的64位地址序列码
48H
将9字节暂存寄存器的第3和4字节复制到EEPROM中
ECH
只有温度超过上限或下限的DS18B20才做出响应
B8H
将EEPROM的内容恢复到暂存寄存器的第3和4字节
44H
启动DS18B20进行温度转换,结果存入9字节的暂存寄存器
B4H
读供电模式,寄生供电时DS18B20发送0,外接电源时DS18B20发送1
CCH
忽略地址序列码,适合单片DS18B20
2.2 单片机的选择
(1)AT89C51的特性及引脚说明
①主要特性
·与MCS-51 兼容
·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24Hz
·三级程序存储器锁定
·128*8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路
AT89C51的引脚功能,图4所示:
图 4 AT89C51的引脚功能图
②管脚说明
—VCC:供电电压。
—GND:接地。
—P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。
—P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入“1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
—P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
—P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下所示:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 (外部中断0)
P3.3 (外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 (外部数据存储器写选通)
P3.7 (外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
—RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
—:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令时ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
—:外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期两次有效。但在访问外部数据存储器时,这两次有效的信号将不出现。
—:当保持低电平时,访问外部ROM;注意加密方式1时,将内部锁定为RESET;当端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
—XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
—XTAL2:来自反向振荡器的输出。
③内部结构框图如图5所示。
图5 AT89C51的内部结构框图
(2)AT89C51的基本操作
如图6所示,在X1和X2之间接一只石英振荡晶体构成了单片机的时钟电路,它还有另一种接法,是把外部振荡器的信号直接连接到XTAL1端,XTAL2端悬空不用。
AT89C51复位引脚RST/VP通过片内一个施密特触发器(抑制噪声作用)与片内复位电路相连,施密特触发器的输出在每一个机器周期由复位电路采样一次。当振荡电路工作,并且在RST引脚上加一个至少保持2个机器周期的高电平时,就能使AT89C51完成一次复位。
复位不影响RAM的内容。
复位后,PC指向0000H单元,使单片机从起始地址0000H单元开始重新执行程序。所以,当单片机运行出错或进入死循环时,可按复位键重新启动。
MCS-51单片机通常采用上电自动复位和按钮复位两种复位方式。上电复位利用电容器充电来实现。按钮复位又分为按钮电平复位和按钮脉冲复位。前者将复位端通过电阻与Vcc相接;后者利用RC微分电路产生正脉冲来达到复位目的。复位电路参数的选择应能保证复位高电平持续时间大于2个机器周期。本系统采用的是按键脉冲复位,具体电路和原理将在下面的章节介绍。
图 6 AT89C51基本操作电路
振荡器特性:
XTAL1、XTAL2为片内振荡器的反相放大器的输入和输出端。可采用石英晶体或陶瓷振荡器组成时钟振荡器,如需从外部输入时钟AT89C51,时钟信号从XTAL1输入,XTAL2应悬空。由于输入到内部电路是经过一个2分频触发器,所以输入的外部时钟信号无需特殊要求,但它必须符合电平的最大和最小值及时序规范。
2.3 其它元器件的选择
除了测温芯片DS18B20以及单片机AT89C51以外,在电源输入部分还选用了L7805CV稳压芯片和滤波电容,以及用于红外部分的4011四与非门逻辑芯片,当然还有红外发射和接收管,这里接收管采用TO-92三脚封装的一体化接收头,显示不分采用了12PIN的数码管LDS-5461AH,总共可以显示四位数据和小数点,其位选部分使用了NPN三极管来进行位扫描。具体功能及细节详见电路原理部分。
2.4 电路设计
由于是基于单片机实现,硬件电路就相对简单很多,只需要设计一下电源稳压电路、键盘电路、显示电路、测温电路、红外发射和接收电路以及它们与单片机的连接即可。
(1)单片机工作部分
由图6已知AT89C51的基本操作电路。但其中的一些参数还得依据具体要求来设计。具体接几兆晶体是基于机器周期考虑。一个机器周期由6个状态(S1-S6)组成,每个状态又持续两个振荡周期(分为P1和P2)。这样,一个机器周期由12个振荡周期组成,由S1P1(状态1节拍1)到S6P2(状态6节拍2)。若是采用12MHz的晶体振荡器,则每个周期恰好为1us,如此对于编程而言相对容易些。因而选择12MHz的晶体振荡器。
此外在两引脚之间加入一个20pF的小电容是为了使系统更稳定,避免杂音干扰而关机。
(2)电源部分
如图7所示,电源接入采用5V的直流电对整个系统供电,使用了L7805CV芯片来对输入电压进行稳压,在芯片旁边设计了三个电容,它们的目的是虑除外界对电路的干扰,使电路得到一个稳定线性的直流电压。为了确认电路进入工作状态,还在设计时加入了一个发光二极管,用于显示电源是否正常工作,如果电路处于接电状态,二极管就会导通而发光。
图 7 电源接入部分
(3)显示部分的设计
由LED组成的7段发光管显示器是不太复杂的单片机应用系统常用外部设备之一,在这里我们就选用一个4数码管一体化来显示温度值,当测得的温度是大于零时(正温度)显示两位整数和两位小数,当温度是小于零时(零下)第一位自动显示“-”号,后三位显示两位整数和一位小数。
①7段发光管显示器由7段发光线段组成,并按“日”字形排列,每一段都是一个发光二极管,如图8所示。图中将7个LED的阴极连在一起,称之为共阴极接法。反之为共阳极接法。
②如果将公共阴极接地,而在a~g各段的阳极加上不同的电压,就会使各段的发光情况不同,形成不同的发光字符。加在7段阳极上的电压可以用数字量表示,如果某一段的阳极为数字量1,则这个段就发光;如为0,则不发光。数字量与段的对应关系如表2所示。
表2 七段LED字形码
显示字符
共阳极
字符码
共阴极
字符码
0
3FH
C0H
1
06H
F9H
2
5BH
A4H
3
4FH
B0H
4
66H
99H
5
6DH
92H
6
7DH
82H
7
07H
F8H
8
7FH
80H
9
6FH
90H
图 8 七段结构及外形图
在这次电子日历时钟的设计中使用了四个7段LED显示器,而多位显示器连用有两种方法。
其一,每一位都用各自的8位输出口控制,在显示某字符时,相应的段恒定发光或不发光。这种显示方法属于静态显示。显然,静态显示需占用较多的I/O口线。
其二,是动态显示。即将多个7段LED的段选端复接在一起,只用一个8位输出口控制段选,段选码同时加到各个7段LED显示器上,通过控制各个显示器公共阳极轮流接高电平的办法,逐一轮流地启动各个LED。在这种方法中,只要恰当地选择点亮时间和间隔时间,就会给人以这样一种假相:似乎各位LED是“同时”显示的。动态显示法是目前各种单片机采用的流行方法。其优点是硬件简单,“动态”由软件实现。因而我选用动态显示的方法。
(4)LED驱动电路的设计
LED是电流控制的显示器件,若想使LED发光则必须保证有足够大的电流流过LED的各段。流过LED的电流大时,LED发光亮度高;流过LED的电流小时,LED发光亮度就低,为了使LED 能够长期可靠地工作应使流过LED的电流为其额定电流。为LED显示器提供电流的电路称为LED的驱动电路。由于显示部分选择了动态显示,因此驱动电路也选择动态驱动。
动态显示电路的驱动电路分为段驱动电路和位驱动电路两种。段驱动电路考虑到所有的段电流均流过位选线,因此位驱动电路的驱动能力应为段驱动能力的8倍(最严重情况八段全亮)。
图9为动态显示时的驱动电路原理图,图中采用了达林顿复合驱动电路。
驱动电路可采用分立元件电路,也可采用集成驱动电路,此外有些硬件译码电路本身包括驱动电路。由于这里采用动态输出,且单片机的内部结构决定了数码管可以直接由单片机驱动。因此采用分立元件的显示驱动电路也很简单,如图10所示。
限流电阻
段码a~g
段驱动电路
位选线
位驱动电路
图 9 动态驱动电路
图 10 位选控制电路
具体显示部分电路如图11所示。它是4位LED动态显示接口电路。LED显示器为共阳极,字段线并联,共用AT89C51的P0口(输出字段码),每位LED的公共端由89C51的P2口控制,即由P2口输出位码,经过开关三极管控制位选。显然图中各显示位不可能同时显示不同的数字或符号,只有采用动态的方法轮流使每位显示器显示,并保留一段时间,通常保留时间为10ms。由于LED具有余辉性以及人眼视觉的惰性,虽然每位显示器的显示是分时段性,但只要适当选取扫描频率,人眼的视觉就是连续的。
图 11 四位动态LED显示器接口电路
(5)键盘电路的设计
这里设计键盘的功能是清零,启动和单片机复位键,所以手持端只需三个键测温端只需一个键即可完成。
单片机系统所用的键盘有编码键盘和非编码键盘两种。
①编码键盘本身除了按键之外,还包括产生键码的硬件电路。只要按下编码键盘的某一个键,它就能产生这个键的代码,并称为键码,与此同时还产生一个脉冲信号,以通知CPU接收键码,编码键盘的优点是使用比较方便,亦不需要编写太复杂的程序。其缺点是使用的硬件较复杂。
②非编码键盘的按键是排列成行、列矩阵形式的。按键的作用只是简单地实现接点的接通或断开,因此必须有一套相应的程序与之配合,才能产生相应的键码,非编码键盘几乎不需要附加什么硬件电路。因此为了简洁电路,我使用非编码键盘。但使用非编码键盘需要通过软件来解决按键的识别、防抖动以及如何产生键码的问题。
基于键数少的原因我采用独立式键盘接口与单片机相连接,因为它占用的I/O口不多。图中每个按键占用一个口,彼此独立,互不影响。上拉电阻保证按键没被按下时,I/O口输入高电平。
独立式键盘可工作在查询方式下,通过I/O口读入键状态,当有键被按下时I/O口变为低电平,而未被按下的键对应为高电平,这样通过读电平状态可判断是否有键按下和哪个键被按下。
(6)红外发射与接收
利用单片机异步通讯口,用红外光发射管和一体化接收管来实现接收和发送点信号的功能。通讯距离约3-10米,异步通讯波特率1200。
图 12 红外发射和接收电路
电路原理:红外发送电路由4011MOS与非门和38KHz振荡器组成,串口发送控制门电路和红外光发射管驱动输出电路组成。单片机串口发送TXD端为‘0’时,红外光发射管发出38KHz调制红外光线。TXD端为‘1’时,发射管就不发光。见上图12。红外接收电路为红外接收专门集成电路,当收到38KHz调制红外光线时,输出端为‘0’,平时为‘1’。正可与单片机串口发送接收端RXD配接。
(7)实际电路
最终通过Protel 99 SE软件将以上各个部分电路及元器件组合在一起,得到一个完整的电路图,如图13和图14。然后对各个元器件进行合理的封装,对封装后的PCB进行排版以得到最好的布局,为接下来焊接元器件有一定的帮助,而且合理的布局也能使完成后的实物更美观。
由于本设计两部分电路都有红外发射和接收部分,而区别在于远端有一个测温电路而手持端没有,所以在设计电路图时将两部分设计成一样的结构,即在手持端也有设计了测温芯片的接口,只要对手持端的程序稍加修改也能实现测温的功能。这样在后期制作时便于对电路的安装与调试,而且也有利于电路的功能扩展。
下面给出了两部分的电路图。
图 13 测温端电路图
图 14 手持端电路图
3 软件部分
软件用C语言进行编程,采用模块化设计方法。
开始
开始
发送信号
接收信号
接收数据
测温
显示
显示
发送数据
图 15 手持端与测温端的框图
3.1 软件模块的划分
该系统的控制软件主要可以分为测温和红外两个大的部分,其中具体有单片机初始化程序、定时中断服务程序、DS18B20接口程序、红外发射编码和红外接收解码程序等模块。
3.1.1 定时/计数器应用
(1)定时/计数器功能简介
AT89C51单片机内部设有两个16位可编程的定时/计数器,简称定时器0和定时器1,分别用T0和T1表示。其功能同一般定时计数器,主要作用是:第一,作为一段特定时间长短的定时;第二,可以计算由T1或T0引脚输入的脉冲数,前者在应用上可以产生正确的时间延迟及定时去执行中断服务程序,而后者则是计数器或者计频器的设计。在本设计中这两种作用都用到了。
这两个定时器本身有四种工作模式可供使用,如表3所示。
表3 四种工作模式
M1 MO
工作方式
功能说明
0 0
模式0
13位计数器
0 1
模式1
16位计数器
1 0
模式2
8位自动重装计数器
1 1
模式3
定时器0:分成两个8位计数器
定时器1:停止计数
(2)定时器相关的控制寄存器
TMOD为模式控制寄存器,主要用来设置定时/计数器的操作模式;TCON为控制寄存器,主要用来控制定时器的启动与停止。两个16位的定时/计数器T0和T1均可以分成2个独立的8位计数器即TH0、TL0、TH1、TL1,它们用于存定时或计数的初值。
①模式控制寄存器--TMOD
TMOD是一个专用寄存器,用于控制T1和T0的操作模式及工作方式,其各位定义如下:
D7
D6
D5
D4
D3
D2
D1
D0
GATE
C/
M1
M0
GATE
C/
M1
M0
定时器1 定时器0
· GATE:门控位。当GATE=0,定时器只由软件控制位TR0或TR1来控制启停。位为1,定时器启动开始工作;为0时,定时器停止工作。当GATE=1时,定时器的启动要由外部中断引脚和位共同控制。只有当外部中断引脚或为高时,置1才能启动定时器工作。
·C/:功能选择位。当C/=O时设置为定时器工作方式;计数脉冲由内部提供,计数周期等于机器周期。当C/=1时设置为计数器工作方式,计数脉冲为外部引脚T0或T1的引入的外部脉冲信号。
·M1、M0:操作模式控制位,2位可形成4种编码,对应于4种操作模式。
TMOD模式控制寄存器不能进行位寻址,只能用字节传送指令设置定时器的工作方式及操作模式,低4位用于定义定时器0,高4位用于定义定时器1。系统复位时TMOD所有位均为0。
模式控制字的设置举例:
若设置定时器1为定时器工作方式,由软件启动,选择操作模式2;定时器0为计数方式,由软件启动,选择操作模式1。则TMOD各位设置为:
0 0 l 0 0 1 O l 25H
用MOV TMOD,#25H指令写入TMOD中。
②控制寄存器--TCON
TCON的作用是用于控制定时器的启动、停止及定时器的溢出标志和外部中断触发方式等。
各位定义如下:
8FH
8EH
8DH
8CH
8BH
8AH
89H
88H
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
·TF1和TF0;分别为定时器1和定时器0溢出标志。当定时器计满产生溢出时,由硬件自动置“1”,并可申请中断。进人中断服务程序后,由硬件自动清0。这两位也可作为程序查询的标志位,在查询方式下应由软件来清0。
·TR1和TR0:为定时器1和定时器0的启动控制位。当由软件使清0而停止定时器的工作。定时器启动时该位应置“1”。
定时器的启动与门控位和外部中断引脚有关。当GATE设置为0,定时器的启动由=1控制;而当GATE设置为1时,定时器启动除了=1外,还要求外部中断引脚=1时定时器方可启动工作。
·IE1和IE0:为外部中断1和外部0的中断请求标志位。当外部中断源有请求时其对应的中断标志位置“1”。其复位由触发方式来设置。
·IT1和IT0:为外部中断1和外部中断0的触发方式选择位。设置为“0”时为电平触发方式;设置为“1”时为边沿触发方式。
TCON中低4位是与外部中断有关的位,高4位为定时器控制位。它是一个可以进行位寻址的寄存器。当系统复位时所有位均为0。若要启动定时器可以使用位操作指令SETB 来启动。
(3)定时计数器的操作模式
①模式0
模式0是一个13位的定时/计数器,16位的寄存器只用了高8位()和低5位(的D4-D0位),的高3位未用。
计时工作脉冲
定时器的工作时钟可以由内部或是外部来提供,由C/位来决定,当C/=1时,由外部引脚T0来供给,作为计数器使用,当C/=0时,则由内部时钟来提供,作为一般的定时器使用,而定时器的时钟为系统工作时钟除以12,在AT89C51中,石英振荡晶体使用11.0592MHz,所以定时器每一个计数时间脉冲宽为:
12/11.0592MHz=1.085us (3.1.1)
若石英振荡晶体改为12MHz,定时器每一个计数时间脉冲宽为:
12/12MHz=1.0us (3.1.2)
激活定时器
定时器动作的必要条件有:
·GATE=0时,TR0=1,定时器0就会工作;
·GATE=1时,除了TR0=1,INT0还须是高电平。
若使用定时器内部时钟工作C/=0,GATE=0,在模式0操作下,用命令:
MOV TMOD,#00H
便可设置定时器0 于模式0做计时工作,将TR0设为1,定时器便会开始工作了。
定时时间长短设置
在模式0 工作下,计数器最多可计数个数为M==8192,由0到8192便产生溢出而引发中断信号,引起定时器0的中断(TF0=1)。可能只要计数100个脉冲便产生中断,只要将初值8092(8192-100)加载计数器即可,一旦激活计数器后,计数变为8093、8094、……一直到8192则产生中断,这样就计数100次了,而时间长度为:
1.085us*100=108.5us (3.1.3)
也就是经过108.5us后就产生中断了。
在定时器0中,加载定时器的初值,汇编语言指令为:
TL0=(8192-C).MOD.32 (3.1.4)
TH0=(8192-C)/32 (3.1.5)
其中C为所要计数的值,“MOD”为取余数的运算,除以32后取余数部分。“/”为除法运算,在做完除法后取整数部分。
计时溢出
当计时终了产生溢出,定时器应用两种方法可知道系统产生定时器中断了:
·检查其中断控制寄存器TCON中的TF0及TF1,若为1则表示产生计时溢出了。
·执行对应的中断服务程序。
②模式1
在模式1 工作下,计数器最多可计数个数为 M==65536,计时时间最长为
1.085us*65536=72ms (3.1.6)
而计数初值的加载方法为:
TL0=(65536-C).MOD.256 (3.1.7)
TH0=(65536-C)/256 (3.1.8)
其中C为所要计数的值,计数时间长度为:
1.085us*C (3.1.9)
③模式2
模式2有自动重新加载初值的功能,使定时器做更精确的计时。在模式2 工作下,计数器最多可计数个数为M==256,计时时间最长为:
1.085us*256=0.28ms (3.1.10)
而计数初值的加载方法为:
TH0=256-C (3.1.11)
其中C为所要计数的值,计数时间长度为:
1.085us*C
展开阅读全文