AT89S52定时器计数器.docx
《AT89S52定时器计数器.docx》由会员分享,可在线阅读,更多相关《AT89S52定时器计数器.docx(25页珍藏版)》请在冰豆网上搜索。
AT89S52定时器计数器
第6章 AT89S52定时器/计数器
本章要点:
掌握定时器/计数器的定义
理解定时器/计数器的内部结构
掌握4种工作方式的初始化编程方法
学会使用定时器/计数器编写计数、定时应用程序的方法
AT89S52单片机内部有三个16位可编程的定时器/计数器,即定时器T0、定时器T1和定时器T2。
它们既可用作定时器方式,又可用作计数器方式,且都有4种工作方式可供选择。
但T0、T1与T2的4种工作方式不同,将在本节内详细介绍。
6.1 定时器/计数器的结构与功能
主要介绍定时器0(T0)和定时器1(T1)的结构与功能。
图6.1是定时器/计数器的结构框图。
由图可知,定时器/计数器由定时器0、定时器1、定时器方式寄存器TMOD和定时器控制寄存器TCON组成。
定时器0,定时器1是16位加法计数器,分别由两个8位专用寄存器组成:
定时器0由TH0和TL0组成,定时器1由TH1和TL1组成。
图6.1 定时器/计数器结构框图
TL0、TL1、TH0、TH1的访问地址依次为8AH8DH,每个寄存器均可单独访问。
定时器0或定时器1用作计数器时,对芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲计数,每输入一个脉冲,加法计数器加1;其用作定时器时,对内部机器周期脉冲计数,由于机器周期是定值,故计数值确定时,时间也随之确定。
TMOD、TCON与定时器0、定时器1间通过内部总线及逻辑电路连接,TMOD用于设置定时器的工作方式,TCON用于控制定时器的启动与停止。
6.1.1 计数功能
计数方式时,T的功能是计来自T0(P3.4)T1(P3.5)的外部脉冲信号的个数。
输入脉冲由1变0的下降沿时,计数器的值增加1直到回零产生溢出中断,表示计数已达预期个数。
外部输入信号的下降沿将触发计数,识别一个从“1”到“0”的跳变需2个机器周期,所以,对外部输入信号最高的计数速率是晶振频率的1/24。
若晶振频率为6MHz,则计数脉冲频率应低于1/4MHz。
当计数器满后,再来一个计数脉冲,计数器全部回0,这就是溢出。
脉冲的计数长度与计数器预先装入的初值有关。
初值越大,计数长度越小;初值越小,计数长度越大。
最大计数长度为65536(216)个脉冲(初值为0)。
6.1.2 定时方式
定时方式时,T记录单片机内部振荡器输出的脉冲(机器周期信号)个数。
每一个机器周期使T0或T1的计数器增加1,直至计满回零自动产生溢出中断请求。
定时器的定时时间不仅与定时器的初值有关,而且还与系统的时钟频率有关。
在机器周期一定的情况下,初值越大,定时时间越短;初值越小,定时时间越长。
最长的定时时间为65536(216)个机器周期(初值为0)。
6.2 定时器/计数器控制寄存器
与对定时器/计数器有关的控制寄存器共有4个:
TMOD、TCON、IE、IP。
IE、IP已在中断一节中介绍,这里不再赘述。
6.2.1 定时器/计数器控制寄存器TCON
特殊功能寄存器TCON用于控制定时器的操作及对定时器中断的控制。
其各位定义格式如下。
其中D0~D3位与外部中断有关,已在中断系统一节中介绍。
TF0和TF1:
定时器/计数器溢出标志位。
当定时器/计数器0(或定时器/计数器1)溢出时,由硬件自动使TF0(或TF1)置1,并向CPU申请中断。
CPU响应中断后,自动对TF1清零。
TF1也可以用软件清零。
TR0和TR1:
定时器/计数起运行控制位。
TR0(或TR1)=0,停止定时器/计数器0(或定时器/计数器1)工作。
TR0(或TR1)=1,启动定时器/计数器0(或定时器/计数器1)工作。
可由软件置1(或清0)来启动(或关闭)定时器/计数器,使定时器/计数器开始计数。
用指令SETB(或CLR)使运行控制位置1(或清0)。
6.2.2 工作方式寄存器TMOD
TMOD用于控制定时器/计数器的工作方式。
字节地址为89H,不可位寻址,只能用字节设置其内容。
其格式如下:
定时器/计数器1
定时器/计数器0
位序
D7
D6
D5
D4
D3
D2
D1
D0
位标志
GATE
C/
M1
M0
GATE
C/
M1
M0
其中,低4位用于T0,高4位用于T1的。
GATE:
门控位。
GATE=0,只要用软件使TR0(或TR1)置1就能启动定时器/计数器0(或定时器/计数器1);
GATE=1,只有在
(或
)引脚为高电平的情况下,且由软件使TR0(或TR1)置1时,才能启动定时器/计数器0(或定时器/计数器1)工作。
不管GATE处于什么状态,只要TR0(或TR1)=0定时器/计数器便停止工作。
C/
:
定时器/计数器工作方式选择位。
C/
=0,为定时工作方式;
C/
=1,为计数工作方式。
M0、M1:
工作方式选择位,确定4种工作方式。
如表6.1所示。
表6.1 定时器/计数器工作方式选择
M1
M0
工作方式
功能说明
0
0
1
13位计数器
0
1
2
16位计数器
1
0
3
自动再装入8位计数器
1
1
4
定时器0:
分成两个8位计数器定时器1:
停止计数
【例6.1】设置定时器1工作于方式1,定时工作方式与外部中断无关,则M1=0,M0=1,GATE=0,因此,高4位应为0001;定时器0未用,低4位可随意置数,但低两位不可为11(因方式3时,定时器1停止计数),一般将其设为0000。
因此,指令形式为:
MOV TMOD,#10H
6.3 定时器/计数器工作方式与程序设计
通过对特殊功能寄存器TMOD中的设置M1、M0两位的设置来选择四种工作方式,定时器/计数器0、1和2的工作方式相同,方式3的设置差别较大。
6.3.1 工作方式0
工作方式寄存器TMOD中的M1M0为:
00。
定时器/计数器T0工作在方式0时,16位计数器只用了13位,即TH0的高8位和TL0的低5位,组成一个13位定时器/计数器。
当TL0的低5位计满溢出时,向TH0进位,TH0溢出时,对中断标志位TF0置位,向CPU申请中断。
定时器/计数器0方式0的逻辑结构如图6.2所示。
1.工作在定时方式
C/
=0,定时器对机器周期计数。
定时器在工作前,应先对13位的计数器赋值,开始计数时,在初值的基础上进行减1计数。
定时时间的计算公式为:
定时时间=(213–计数初值)×晶振周期×12
或 定时时间=(213–计数初值)×机器周期
若晶振频率为12MHz,则最短定时时间为
[213-(213-1)]×(1/12)×10-6×12=1μs
最长定时时间为
(213-0)×(1/12)×10-6×12=8192μs
2.工作在计数方式
C/
=1,13位计数器对外部输入信号进行加1计数。
利用
由0变为1时,开始计数,
由1变为0时,停止计数,可以测量在
端出现的正脉冲的宽度。
计数值的范围是1~213=8192(个外部脉冲)。
【例6.2】假设AT89S52单片机晶振频率为12MHz,要求定时时间8ms,使用定时器T0,工作方式0,计算定时器初值X。
解:
∵t=(213–X)×机器周期
当单片机晶振频率为12MHz时,机器周期=1μs
∴8×103=(213–X)×1
X=8192-8000=192
转换成二进制数为:
11000000B
【例6.3】假设AT89S52单片机晶振频率为12MHz,所需定时时间为250μs,当T0工作在方式0时T0计数器的初值是多少?
解:
∵t=(213–X)×机器周期
当单片机晶振频率为12MHz时,机器周期=1μs
∴250=(213–X0)×1
X0=8192-250=7942
转换成二进制数为:
1111100000110B
【例6.4】利用T0方式0产生1ms的定时,在P1.2引脚上输出周期为2ms的方波。
设单片机晶振频率fosc=12MHz。
解:
(1)解题思路
要在P1.2引脚输出周期为2ms的方波,只要使P1.2每隔1ms取反一次即可。
执行指令为CPL P1.2。
(2)确定工作方式:
方式0 TMOD=00H
C/
=0:
T0为定时功能;(D2位)
GATE=0,只要用软件使TR0(或TR1)置1就能启动定时器T0(或T1);
M1M0=00,工作方式0
∴TMOD的值为=00H
TMOD.4~TMOD.7可取任意值,因T1不用,这里取0值。
使用MOV TMOD,#00H即可设定T0的工作方式
(3)计算1ms定时时T0的初值
机器周期 T=1/fosc×12=1μs
计数个数:
X=1ms/lμs=1000
设T0的计数初值为x0,则x0=(213一X)s
=8192—1000
=7192D
转换成二进制数为:
11100000 11000B
高8位 低5位
将高8位11100000=0E0H装入TH0
将低5位11000=18H装入TL0
1 1
EA=1,CPU开放中断;
ET0=1,允许T0中断;
(4)编程
可采用中断和查询两种方式编写程序。
方法一:
中断方式
ORG 0000H
AJMP MAIN ;转主程序MAIN
ORG 000BH
AJMP IT0P ;转T0中断服务程序IT0P
ORG 1000H
MAIN:
MOV SP,#60H ;设堆栈指针
MOV TH0,#0E0H ;给定时器T0送初值
MOVTMOD,#00H ;设置T0为方式0,定时
MOV TL0,#18H ;送定时初值
MOVTH0,#0E0H
SETB EA ;CPU开中断
SETB ET0 ;T0允许中断
SETBTR0 ;启动T0定时
HERE:
SJMP HERE ;等待中断
中断服务程序:
IT0P:
ORG 1200H ;T0中断入口
MOV TL0,#18H ;重新装入计数初值
MOV TH0,#0E0H
CPL P1.2 ;输出方波
RETI ;中断返回 END
方法二:
查询方式
MOV TMOD,#00H ;设置T0为方式0,定时
MOV TL0,#18H ;送初值
MOV TH0,#0E0H
SETB TR0 ;启动T0定时
LOOP:
JBC TF0,NEXT ;查询定时时间到否?
SJMP LOOP
NEXT:
MOV TL0,#18H ;重新装入计数初值
MOVTH0,#0E0H
CPL P1.2 ;输出方波
SJMP LOOP ;重复循环
6.3.2 工作方式1
工作方式寄存器TMOD中的M1M0为:
01。
定时器T0工作方式1与工作方式0类同,差别在于其中的计数器的位数。
工作方式1以16位计数器参与计数。
定时器/计数器0方式1的逻辑结构如图6.3所示。
1.工作在定时方式
C/
=0,定时器对机器周期计数。
定时时间的计算公式为:
定时时间=(213–计数初值)×晶振周期×12
或 定时时间=(213–计数初值)×机器周期
若晶振频率为12MHz,则最短定时时间为
[216-(216-1)]×(1/12)×10-6×12=1μs
最长定时时间为
(216-0)×(1/12)×10-6×12=65536μs=65.5ms
2.工作在计数方式
C/
=1,16位计数器对外部输入信号进行加1计数。
计数值的范围是1~216=65536(个外部脉冲)。
【例6.5】假设AT89S52单片机晶振频率为12MHz,所需定时时间为10ms,当T0工作在方式1时T0计数器的初值是多少?
解:
∵t=(216–X0)×机器周期
当单片机晶振频率为12MHz时,机器周期=1μs
∴10×103=(213–X0)×1
X=65536-10000=55536
转换成二进制数为:
1101100011110000B=0D8F0H
【例6.6】假设AT89S52单片机晶振频率为12MHz,定时器T0的定时初值为9800,计算T0工作在方式1时的定时时间。
解:
∵t=(216–X0)×机器周期
当单片机晶振频率为12MHz时,机器周期=1μs
∴t=(216–9800)×1
t=65536-9800=55736μs
【例6.7】用定时器T0产生50HZ的方波。
由P1.0输出此方波(设时钟频率为12MHZ)。
采用中断方式。
解:
50HZ的方波周期T为 T=1/50=20ms
可以用定时器产生10ms的定时,每隔10ms改变一次P1.0的电平,即可得到50HZ的方波。
定时器T0应工作在方式1。
(1)工作在方式1时的T0初值,根据下式计算:
t=(216–X)×机器周期
时钟频率为12MHz,则机器周期=1µs
10×103=(216–X)×1
X=65536–10000=55536
转换为二进制数:
11011000 11001100B
高8位 低8位
高8位=0D8H装入TH0,低8位=0CCH装入TL0。
(2)程序
ORG 0000H
AJMP MAIN
ORG 000BH ;T0的中断入口地址
AJMP T0INT
ORG 0100H
MAIN:
MOV TMOD,#01H ;设置T0为工作方式1
MOV TH0,#0D8H ;装入定时器初值
MOV TL0,#0CCH
SETB ET0 ;设置T0允许中断
SETB EA ;CPU开中断
SETB TR0 ;启动T0
SJMP $ ;等待中断
中断服务程序;
ORG 0300H
T0INT:
CPL P1.0 ;P1.0取反
MOV TH0,#0D8H;重新装入定时初值
MOV TL0,#0CCH
RETI
注:
SETB ET0 ;设置T0允许中断
SETB EA ;CPU开中断
这两条指令可以等效为 MOV IE,#82H。
6.3.3 工作方式2
定时器/计数器0方式2的逻辑结构如图6.4所示。
工作方式寄存器TMOD中的M1M0为:
10
定时器/计数器在工作方式2时,16位的计数器分成了两个独立的8位计数器TH和TL。
此时,定时器/计数器构成了一个能重复置初值的8位计数器。
其中,TL用作8位计数器,TH用来保存计数的初值。
每当TL计满溢出时,自动将TH的初值再次装入TL。
1.工作在定时方式
C/
=0,定时器对机器周期计数。
定时时间的计算公式为:
定时时间=(28–计数初值)×晶振周期×12
或 定时时间=(28–计数初值)×机器周期
若晶振频率为12MHz,则最短定时时间为
[28-(28-1)]×(1/12)×10-6×12=1μs
最长定时时间为
(28-0)×(1/12)×10-6×12=256μs
2.工作在计数方式
C/
=1,8位计数器对外部输入信号进行加1计数。
计数值的范围是1~28=256(个外部脉冲)。
【例6.8】利用T0方式2实现以下功能:
当T0(P3.4)引脚每输入一个负脉冲时,使P1.0输出一个500μs的同步脉冲。
设晶振频率为6MHz,请编程实现该功能。
其波形如图6.5所示。
图6.5 例6.6波形图
(1)确定工作方式
首先选T0为方式2,外部事件计数方式。
当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500μs定时工作方式,并使P1.0输出由1变为0。
T0定时到产生溢出,使P1.0引脚恢复输出高电平。
T0先计数,后定时,分时操作。
根据题目要求方式控制字TMOD是:
计数时:
(TMOD)=00000110B=06H
定时时:
(TMOD)=00000010B=02H
(2)计算初值
机器周期T=12/fosc=12/6MHZ=2μs
计数时:
计数个数 X=1
计数初值=(256﹣X)=(256﹣1)=255=0FFH,(TH0)=(TL0)=0FFH
定时时:
计数个数 X=Т/Tm=500μs/2μs=250
定时初值=256﹣X=256﹣250=6,
(TH0)=(TL0)=06H
(3)编程方法
采用查询方法
START:
MOV TMOD,#06H ;T0方式2,外部计数方式
MOV TH0,#0FFH ;T0计数初值
MOV TL0,#0FFH
SETB TR0 ;启动T0计数
LOOPl:
JBC TF0,PTF01 ;查询T0溢出标志,TF0=1时转移,
且TF0=0(查P3.4负跳变)
SJMPLOOPl
PTF01:
CLRTR0 ;停止计数
MOV TMOD,#02H ;T0方式2,定时
MOV TH0,#06H ;T0定时500μs初值
MOV TL0,#06H
CLR P1.0 ;P1.0清0
SETB TR0 ;启动定时500μs
LOOP2:
JBC TF0,PTF02 ;查询溢出标志,定时到TF0=l转移,
且TF0=0(第一个500μs到否?
)
SJMP LOOP2
PTF02:
SETB P1 ;P1.0置1(到了第一个500μs)
CLR TR0 ;停止计数
SJMP START
6.3.4 工作方式3
工作方式寄存器TMOD中的M1M0为:
11。
工作方式3仅对定时器/计数器0有效,此时,将16位的计数器分为两个独立的8位计数器TH0和TL0。
当定时器/计数器0工作在方式3时,定时器/计数器1只能工作在方式0~2,并且工作在不需要中断的场合。
在一般情况下,当定时器/计数器1用作串行口波特率发生器时,定时器/计数器0才设置为工作方式3。
此时常把定时器/计数器1设置为方式2,用作波特率发生器。
定时器/计数器0在方式3下的逻辑结构如图6.6所示。
【例6.9】设某用户系统中已使用了两个外部中断源,并置定时器T1工作在方式2,作串行口波特率发生器用。
现要求再增加一个外部中断源,并由P1.0引脚输出一个5kHz的方波。
fosc=12MHz。
(1)确定工作方式
T0方式3下,TL0作计数用,而TH0可用作8位的定时器,定时控制P1.0引脚输出5kHz的方波信号。
T1为方式2,定时。
TMOD是:
00100111B=27H
(2)计算初值
TL0初值:
FFH,TH0初值X0计算如下:
∵P1.0的方波频率为5kHz,故周期
T=1/(5kHz)=0.2ms=200μs
∴用TH0定时100μs时,
X0=256﹣100×12/12=156
(3)程序如下:
MOV TMOD,#27H ;T0为方式3,计数;T1为方式2,定时
MOV TL0,#0FFH ;置TL0计数初值
MOV TH0,#156 ;置TH0计数初值
MOV THl,#data ;data是根据波特率要求设置的常数(即初值)
MOV TLl,#data
MOV TCON,#55H ;外中断0,外中断1边沿触发,启动T0,T1
MOVIE,#9FH ;开放全部中断
TL0溢出中断服务程序(由000BH转来)
TL0INT:
MOVTL0,#0FFH ;TL0重赋初值(中断处理)
RETI
TH0溢出中断服务程序(由001BH转来)
TH0INT:
MOVTH0,#156 ;TH0重新装入初值
CPL P1.