第6章-AT89S51单片机的定时器计数器.ppt
- 文档编号:30761826
- 上传时间:2023-08-22
- 格式:PPT
- 页数:65
- 大小:1.28MB
第6章-AT89S51单片机的定时器计数器.ppt
《第6章-AT89S51单片机的定时器计数器.ppt》由会员分享,可在线阅读,更多相关《第6章-AT89S51单片机的定时器计数器.ppt(65页珍藏版)》请在冰豆网上搜索。
第6章AT89S51单片机的定时器/计数器,1,AT89S51单片机片内两个可编程的定时器/计数器T1、T0结构与功能两种工作模式和4种工作方式TMOD和TCON各位的定义及其编程编程应用案例,2,内容概要,6.1定时器/计数器的结构定时器/计数器结构如图6-1,定时器/计数器T0由特殊功能寄存器TH0、TL0构成,定时器/计数器T1由特殊功能寄存器TH1、TL1构成。
图6-1定时器/计数器结构框图,3,两种工作模式(定时器、计数器);4种工作方式(方式0、方式1、方式2和方式3)。
TMOD用于选择定时器/计数器T0、T1的工作模式和工作方式。
TCON用于控制T0、T1的启动和停止计数,同时包含了T0、T1的状态。
4,5,T0、T1不论是工作在定时器模式还是计数器模式,实质都是对脉冲信号进行计数,只不过是计数信号的来源不同。
计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数(见图6-1);定时器工作模式是对系统的时钟振荡器信号经片内12分频后的内部脉冲信号计数。
由于时钟频率是定值,所以12分频后的脉冲信号周期也为定值,所以可根据对内部脉冲信号的计数值计算出定时时间。
计数器的起始计数都是从计数器的初值开始。
单片机复位时计数器的初值为0,也可用指令给计数器装入一个新的初值。
AT89S51的定时器/计数器属于增1计数器。
6.1.1工作方式控制寄存器TMODAT89S51单片机的定时器/计数器工作方式寄存器TMOD用于选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能位寻址,其格式如图6-2所示。
图6-2TMOD格式8位分为两组,高4位控制T1,低4位控制T0。
TMOD各位功能。
(1)GATE门控位。
0:
仅由运行控制位TRx(x=0,1)来控制定时器/计数器运行。
1:
用外中断引脚INT0*(或INT1*)上的电平与运行控制位TRx来共同控制定时器/计数器运行。
7,
(2)M1、M0工作方式选择位M1、M0共4种编码,4种工作方式选择,见表6-1。
8,9,(3)C/T*计数器模式和定时器模式选择位0:
定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。
1:
计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。
6.1.2定时器/计数器控制寄存器TCON字节地址为88H,可位寻址,位地址为88H8FH。
格式见图6-3。
图6-3TCON格式,
(1)TF1、TF0计数溢出标志位。
当计数器计数溢出时,该位置“1”。
使用查询方式时,此位作为状态位供CPU查询,但应注意查询有效后,应使用软件及时将该位清“0”。
使用中断方式时,此位作为中断请求标志位,进入中断服务程序后由硬件自动清“0”。
(2)TR1、TR0计数运行控制位。
TR1位(或TR0位)=1,启动定时器/计数器工作的必要条件。
TR1位(或TR0位)=0,停止定时器/计数器工作。
该位可由软件置“1”或清“0”。
11,6.2定时器/计数器的4种工作方式4种工作方式如下。
6.2.1方式0M1、M0=00时,被设置为工作方式0,等效逻辑结构框图见图6-4(以定时器/计数器T1为例,TMOD.5、TMOD.4=00)。
12,图6-4定时器/计数器方式0逻辑结构框图13位计数器,由TLx(x=0,1)低5位和THx高8位构成。
TLx低5位溢出则向THx进位,THx计数溢出则把TCON中的溢出标志位TFx置“1”。
13,图6-2的C/T*位控制的电子开关决定了定时器/计数器的两种工作模式。
(1)C/T*=0,电子开关打在上面,T1(或T0)为定时器模式,把时钟振荡器12分频后的脉冲作为计数信号。
(2)C/T*=1,电子开关打在下面,T1(或T0)为计数器模式,计数脉冲为P3.4(或P3.5)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1。
GATE位状态决定定时器/计数器的运行控制取决TRx一个条件还是TRx和INTx*(x=0,1)引脚状态两个条件。
14,
(1)GATE=0,A点(见图6-4)电位恒为1,B点电位仅取决于TRx状态。
TRx=1,B点为高电平,控制端控制电子开关闭合,允许T1(或T0)对脉冲计数。
TRx=0,B点为低电平,电子开关断开,禁止T1(或T0)计数。
(2)GATE=1,B点电位由INTx*(x=0,1)的输入电平和TRx的状态这两个条件来确定。
当TRx=1,且INTx*=1时,B点才为1,控制端控制电子开关闭合,允许T1(或T0)计数。
故这种情况下计数器是否计数是由TRx和INTx*两个条件来共同控制。
6.2.2方式1当M1、M0=01时,定时器/计数器工作于方式1,这时定时器/计数器的等效电路逻辑结构见图6-5。
方式1和方式0的差别仅仅在于计数器的位数不同,方式1为16位计数器,由THx高8位和TLx低8位构成(x=0,1),方式0则为13位计数器,有关控制状态位的含义(GATE、C/T*、TFx、TRx)与方式0相同。
17,图6-5定时器/计数器方式1逻辑结构框图,6.2.3方式2方式0和方式1的最大特点是计数溢出后,计数器清0。
因此在循环定时或循环计数应用时就存在用指令反复装入计数初值的问题。
这不仅影响定时精度,也给程序设计带来麻烦。
方式2就是针对此问题而设置的。
当M1、M0为10时,定时器/计数器处于工作方式2,这时定时器/计数器的等效逻辑结构如图6-6(以定时器T1为例,x=1)。
图6-6方式2逻辑结构框图,方式2为自动恢复初值(初值自动装入)的8位定时器/计数器。
TLx(x=0,1)作为常数缓冲器,当TLx计数溢出时,在溢出标志TFx置“1”的同时,还自动将THx中的初值送至TLx,使TLx从初值开始重新计数。
定时器/计数器的方式2工作过程见图6-7。
图6-7方式2工作过程该方式可省去用户软件中重装初值的指令执行时间,简化定时初值的计算方法,可相当精确地确定定时时间。
21,6.2.4方式3为增加一个8位定时器/计数器而设,使AT89S51单片机具有3个定时器/计数器。
方式3只适用于T0,T1不能工作在方式3。
T1处于方式3时相当于TR1=0,停止计数(此时T1可用来作为串行口波特率产生器)。
1工作方式3下的T0TMOD的低2位为11时,T0被选为方式3,各引脚与T0的逻辑关系如图6-8。
定时器/计数器T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位C/T*、GATE、TR0、TF0,,而TH0被固定为一个8位定时器(不能作为外部计数模式),并使用定时器T1的状态控制位TR1和TF1,同时占用定时器T1的中断请求源TF1。
2T0工作在方式3时T1的各种工作方式一般情况下,当T1用作串行口的波特率发生器时,T0才工作在方式3。
T0处于工作方式3时,T1可定为方式0、方式1和方式2,用来作为串行口的波特率发生器,或不需要中断的场合。
图6-8定时器/计数器T0方式3的逻辑结构框图,24,
(1)T1工作在方式0T1的控制字中M1、M0=00时,T1工作在方式0,工作示意如图6-9。
图6-9T0工作在方式3时T1为方式0的工作示意图,25,
(2)T1工作在方式1当T1的控制字中M1、M0=01时,T1工作在方式1,工作示意图如图6-10所示。
26,图6-10T0工作在方式3时T1为方式1的工作示意图,(3)T1工作在方式2当T1的控制字中M1、M0=10时,T1的工作方式为方式2,工作示意图如图6-11所示。
27,图6-11T0工作在方式3时T1为方式2的工作示意图,(4)T1设置在方式3当T0设置在方式3,再把T1也设成方式3,此时T1停止计数。
6.3对外部输入的计数信号的要求当定时器/计数器工作在计数器模式时,计数脉冲来自外部输入引脚T0或T1。
当输入信号产生负跳变时,计数器的值增1。
每个机器周期的S5P2期间,都对外部输入引脚T0或T1进行采样。
如在第一个机器周期中采得的值为1,而在下一个机器周期中采得的值为0,则在紧跟着的再下一个机器周期S3P1期间,计数器加1。
由于确认一次负跳变要花2个机器周期,因此外部输入的计数脉冲的最高频率为系统振荡器频率的1/24。
例如,选用6MHz频率的晶体,允许输入的脉冲频率最高为250kHz。
如果选用12MHz频率的晶体,则可输入最高频率为500kHz的外部脉冲。
对于外部输入信号的占空比并没有什么限制,但为了确保某一给定电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期。
故对外部输入信号的要求如图6-12所示,图中Tcy为机器周期。
30,图6-12对外部计数输入信号的要求,6.4定时器/计数器的编程和应用4种方式,方式0与方式1基本相同,只是计数位数不同。
方式0初值计算复杂,一般不用方式0,而用方式1。
6.4.1方式1的应用【例6-1】假设系统时钟频率采用6MHz,在P1.0引脚上输出一个周期为2ms的方波,如图6-13。
31,图6-13要求P1.0引脚输出的波形,基本思想:
方波周期T0确定,T0每隔1ms计数溢出1次,即T0每隔1ms产生一次中断,CPU响应中断后,在中断服务子程序中对P1.0取反。
为此要做如下几步工作:
(1)计算计数初值X机器周期=2s=2106s设需要装入T0的初值为X,则有(216X)2106=1103。
216X=500,X=65036。
X化为16进制数,即:
65036=FE0CH。
T0的初值为TH0=FEH,TL0=0CH。
32,
(2)初始化程序设计采用定时器中断方式工作。
包括定时器初始化和中断系统初始化,主要是对寄存器IP、IE、TCON、TMOD的相应位进行正确的设置,并将计数初值送入定时器中。
(3)程序设计中断服务子程序除了完成所要求的产生方波的工作之外,还要注意将计数初值重新装入定时器,为下一次产生中断做准备。
33,参考程序如下:
34,程序说明:
当单片机复位时,从程序入口0000H跳向主程序MAIN处执行。
其中调用了T0初始化子程序PT0M0。
子程序返回后,程序执行“AJMPHERE”指令,则循环等待。
当响应T0定时中断时,则跳向T0中断入口,再从T0中断入口跳向IT0P标号处执行T0中断服务子程序。
35,当执行完中断返回的指令“RETI”后,又返回断点处继续执行循环指令“AJMPHERE”。
在实际的程序中,“AJMPHERE”实际上是一段主程序。
当下一次定时器T0的1ms定时中断发生时,再跳向T0中断入口,从而重复执行上述过程。
如CPU不做其他工作,也可用查询方式进行控制,程序要简单得多。
36,查询程序虽简单,但CPU必须要不断查询TF0标志,工作效率低。
【例6-2】系统时钟为6MHz,编写定时器T0产生1s定时的程序。
基本思想:
采用定时器模式。
因定时时间较长,首先确定采用哪一种工作方式。
时钟为6MHz的条件下,定时器各种工作方式最长可定时时间:
方式0最长可定时16.384ms;方式1最长可定时131.072ms;方式2最长可定时512s。
由上可见,可选方式1,每隔100ms中断一次,中断10次为1s。
37,
(1)计算计数初值X因为(216X)2106=101,所以X=15536=3CB0H因此TH0=3CH,TL0=B0H。
(2)10次计数的实现对于中断10次的计数,采用B寄存器作为中断次数计数器。
(3)程序设计参考程序如下:
38,39,程序说明:
不论1s定时时间是否已到,都返回到“SJMPHERE”指令处。
“SJMPHERE”指令实际是一段主程序。
在这段主程序中再通过对F0标志的判定,可知1s定时是否到,再进行具体处理。
6.4.2方式2的应用是可自动重新装载初值的8位计数器/定时器,省去重装初值指令。
当某个定时器/计数器不使用时,可扩展一个负跳沿触发的外部中断源。
【例6-3】扩展一个负跳沿触发的外部中断源,把定时器/计数器T0脚作为外部中断请求输入端,溢出标志TF0作为外中断请求标志。
基本思想:
设为方式2(自动装入常数方式)计数模式,TH0、TL0初值均为0FFH。
当T0脚发生负跳变时,T0计数溢出,TF0置“1”,单片机发出中断请求。
40,程序说明:
当连接在P3.4(T0脚)的外部中断请求输入脚电平发生负跳变时,TL0加1,产生溢出,TF0置“1”,向单片机发出中断请求,同时TH0的内容0FFH送TL0,即TL0恢复初值0FFH。
P3.4脚相当于一个负跳沿触发的外中断请求源输入。
【例6-4】当T0(P3.4)引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。
开始从P1.0脚上输出一个周期为1ms的方波,如图6-14(系统时钟6MHz)。
41,设计思想:
T0设为方式1计数,初值为FFFFH。
当外部计数输入端T0(P3.4)发生一次负跳变时,T0加1且溢出,溢出标志TF0置“1”,向CPU发出中断请求,此时T0相当于一个负跳沿触发的外部中断源。
进入T0中断程序后,F0标志置“1”,说明T0引脚上已接收过负跳变信号。
T1定义为方式2定时。
在T0引脚产生一次负跳变后,启动T1每500s产生一次中断,在中断服务子程序中对P1.0求反,使P1.0产生周期1ms方波。
由于省去重新装初值指令,所以可产生精确的定时。
42,43,图6-14负跳变触发输出一个周期为1ms的方波,
(1)计算T1的初值设T1的初值为X,则(28X)2106=5104X=28250=6=06H
(2)程序设计参考程序:
44,45,程序说明:
当单片机复位时,从0000H跳向主程序MAIN处执行程序。
其中调用了对T0,T1初始化子程序PT0M2。
子程序返回后执行标号LOOP处指令,循环等待T0引脚上负脉冲的到来。
由于负脉冲到来的标志位F0的复位初始值为0,所以程序就在标号LOOP处循环等待。
当T0(P3.4)脚发生负跳变时,由于T0计数溢出,则跳向T0中断服务子程序。
此时停止T0计数,并把T0引脚接收过负脉冲的标志F0置1。
46,47,当中断返回时,由于F0已被置1,则程序跳出LOOP处的循环等待。
此时执行指令来允许T1中断,并启动T1定时,然后执行“AJMPHERE”指令,循环等待,等待T1的500s定时中断到来。
当T1的500s定时中断产生时,则进入T1的中断服务子程序IT1P,把P1.0脚电平取反。
由于自动装初值,省去对T1重装初值指令。
中断返回后,到“AJMPHERE”处等待T1的500s定时中断。
如此重复,即得到图6-14波形。
【例6-5】利用定时器T1的方式2计数,每计满100个数,将P1.0取反。
本例是方式2计数模式的应用举例。
(1)选择工作方式外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器便加1,每输入100个脉冲,计数器将产生溢出中断,在中断服务程序中将P1.0取反一次。
T1工作在方式2的控制字TMOD=60H。
不使用T0时,TMOD低4位任取,但不能使T0为方式3,这里取全0。
(2)计算T1的初值X=28100=156=9CHTL1的初值为9CH,重装初值寄存器TH1=9CH。
(3)参考程序,48,49,说明:
由于T1的中断服务子程序只有两条指令,不超过8字节,所以进入T1中断服务程序入口后,没有选择再跳转。
6.4.3方式3的应用方式3下的T0和T1大不相同。
T0工作在方式3,TL0和TH0被分成两个独立的8位定时器/计数器。
其中,TL0可作为8位的定时器/计数器,而TH0只能作为8位的定时器。
此时T1只能工作在方式0、1或2。
一般情况下,当T1用作串行口波特率发生器时,T0才设置为方式3。
此时,常把定时器T1设置为方式2,用作波特率发生器。
50,【例6-6】假设某AT89S51单片机应用系统的两个外部中断源已被占用,设置T1工作在方式2,用作波特率发生器。
现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz(周期为200s)的方波。
设时钟为6MHz。
基本思想:
设置TL0工作在方式3计数模式,TL0的初值设为0FFH,当检测到T0脚信号出现负跳变时,TL0溢出,同时向CPU申请中断,这里T0脚作为一个负跳沿触发的外部中断请求输入端。
在中断处理子程序中,启动TH0,TH0事先被设置为方式3的100s定时,从而控制P1.0输出周期为200s的方波信号,如图6-15。
51,52,图6-15定时器P1.0输出的方波信号,
(1)初值X计算TL0的初值设为0FFH。
5kHz方波的周期为200s,因此TH0的定时时间为100s。
初值X计算:
(28X)2106=1104X=28100=156=9CH
(2)程序设计,53,54,6.4.4门控制位GATEx的应用测量脉冲宽度介绍门控制位GATE的具体应用,测量INT1*(P3.3)引脚上正脉冲的宽度。
【例6-7】门控位GATE1可使T1的启动计数受INT1*的控制,当GATE1=1,TR1=1时,只有INT1*引脚输入高电平时,T1才被允许计数。
可测量引脚(P3.3)上正脉冲的宽度。
其方法如图6-16。
55,图6-16利用GATE位测量正脉冲的宽度,56,执行以上程序,使INT1*引脚上出现的正脉冲宽度以机器周期数的形式显示在显示器上。
57,6.4.5实时时钟的设计介绍使用定时器/计数器实现时钟。
1实现实时时钟的基本思想最小计时单位是秒,如何获得1s的定时时间呢?
从前面介绍知,定时器方式1,最大定时时间也只能131ms。
可将定时器的定时时间定为100ms,中断方式进行溢出次数的累计,计满10次,即得秒计时。
而计数10次可用循环程序的方法实现。
初值的计算如例6-2。
片内RAM规定3个单元为秒、分、时单元:
42H:
“秒”单元;41H:
“分”单元;40H:
“时”单元,58,从秒到分,从分到时是通过软件累加并比较来实现。
要求每满1秒,则“秒”单元42H中的内容加1;“秒”单元满60,则“分”单元41H中的内容加1;“分”单元满60,则“时”单元40H中的内容加1;“时”单元满24,则将42H、41H、40H的内容全部清“0”。
2程序设计
(1)主程序设计进行定时器T0的初始化,并启动T0,然后反复调用显示子程序,等待100ms中断到来。
流程如图6-17。
(2)中断服务程序的设计功能是实现秒、分、时的计时处理。
流程如图6-18。
60,图6-17时钟主程序流程,61,图6-18中断服务程序流程,参考程序:
62,63,64,本章结束,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AT89S51 单片机 定时器 计数器