定时/计数器的功能
MCS-51单片机内共有两个可编程的定时/计数器T0和T1。它们都是十六位加法计数器结构,分别由TH0、TL0和TH1、TL1四个8位计数器组成,每个定时/计数器都具有定时和计数两种功能。
计数功能
对外来脉冲进行计数。计数脉冲的输入端来自单片机的两个信号引脚T0(P3.4)和T1(P3.5)外部输入的脉冲在负跳变时有效,计数脉冲的频率最高为振荡频率的1/24。
定时功能
定时功能也是通过计数器的计数来实现的,不过这时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲。因此,计数频率为振荡频率的1/12。这样,不但可以根据计数器的预置值计算出定时时间,也可以反过来按定时时间的要求,计算出计数器的预置值。
与定时/计数器有关的寄存器
定时器控制寄存器(TCON)
该寄存器既参与中断控制又参与定时控制。其主要功能是:定时器在溢出时,设定标志位(TFx),并控制定时器的运行或停止等(TRx)。
8F 8E 8D 8C 8B 8A 89 88
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
定时器方式寄存器(TMOD)
用于控制两个定时/计数器的工作方式,高4位定义T1,低4位定义T0,字节地址为89H。
格式:
GATE C/T M1 M0 GATE C/T M1 M0
T1 T0
GATE:门控位
GATE=0,以运行控制位TRx启动定时器
GATE=1,以外中断请求信号(INT1或INT0)启动定时器。
C/T:定时或计数方式选择位:
C/T=0,定时工作方式
C/T=1,计数工作方式。
M1M0:工作方式选择位:
M1M0=00,方式0:13位计数(TL0-4、TH0-7)
M1M0=01,方式1:16位计数
M1M0=10,方式2:8位计数,有自动装入功能。
M1M0=11,方式3:T0分为两个8位计数器,TL0允许作为定时或计数方式,TH0只能作为定时方式
定时/计数器工作方式
方式0
方式0是13位结构的工作方式,其计数器由TH1的全8位和TL1的低5位构成。TL1的高3位弃之不用。
计数方式:计数值的范围为:1~8192(2^13)
定时方式:定时时间T的计算公式为:
T=(2^13-计数初值x)晶振周期/12
或 T=(2^13-计数初值x)机器周期
启动的条件是:(TRx=1) AND (GATE=0 OR INTx=1)
方式0应用举例:
设单片机晶振频率fosc=6MHz,使用定时器1以方式0产生周期为500us的方波,并由P1.0输出。以查询或中断方式完成。
解:
计算定时初值x
欲产生500us的方波,只需在P1.0端以250us为周期交替输出高低电平即可实现。为此,定时时间应为250us。晶振为6MHz,则1个机器周期为2us。
则: (2^13-x)*2uS=250uS, x=8067=1111110000011B
即: TH1=0FCH,TL1=03H。
TMOD寄存器初始化
定时器1,M1M0=00H(方式0),C/T=0(定时),GATE=0(以软件启动定时器),不用的位设定为0,最后得TMOD应初始化00H。
用TCON寄存器的TR1位来启动(=1)或停止(=0)定时器。
查询方式程序:
MOV TMOD,#00H ;T1工作在方式0
SETB TR1 ;启动T1工作
LOOP: MOV TL1,#03H
MOV TH1,#0FCH ;置定时初值
WAIT: JNB TF1,WAIT ;定时未到,循环等待
CLR TF1 ;定时到,清TF1
CPL P1.0 ;由P1.0输出,信号取反
SJMP LOOP ;循环输出方波
中断方式程序:
ORG 8000H
MOV TMOD,#00H ;T1工作在方式0
MOV TL1,#03H
MOV TH1,#0FCH ;置定时初值
SETB EA ;开中断
SETB ET1 ;允许T1中断
LOOP: SETB TR1 ;启动T1工作
WAIT: SJMP WAIT ;等待中断
AJMP LOOP
ORG 001BH ;T1中断入口
LJMP SUB ;跳至中断服务程序SUB
ORG 8100H ;中断服务程序
SUB: CPL P1.0 ;输出信号取反
MOV TL1,#03H
MOV TH1,#0FCH ;重置定时初值
RETI ;中断返回
方式1
其逻辑电路和工作情况与方式0完全相同。所不同的只是组成计数器的位数为16位。
7 0 7 0
TL1 TH1 TF1
计数值的范围为: 1~65536(2^16)
定时时间的计算公式与方式0类似。即:
T=(2^16-计数初值x)晶振周期/12
或 T=(2^16-计数初值x)机器周期
方式2
方式2具有自动重新加载功能,即自动加载计数初值。该方式把16位计数器分为两部分,既以TL1作计数器,以TH1作预置计数器,初始化时把计数初值分别装入TL1和TH1中。
当计数溢出后,由预置寄存器TH1,以硬件方法自动给计数器TL1重新加载。
最大计数值只能到255。这种工作方式非常适用于循环定时或循环计数应用。
方式2应用举例:
设单片机晶振频率fosc=6MHz,使用T0以方式2产生周期为200us的方波,并由P1.0输出。以查询或中断方式完成。
解:
计算计数初值x
晶振为6MHz,则1个机器周期为2us。则:
(2^8-x)*2=100,x=206=CEH
即 TH0=0CEH,TL0=0CEH。
TMOD寄存器初始化
定时器0,M1M0=10H(方式2),C/T=0(定时), GATE=0(以软件启动定时器),不用的位设定为0,最后得TMOD应初始化为02H。
用TCON寄存器的TR0位来启动(=1)或停止(=0)定时器。
查询方式程序:
MOV TMOD,#02H ;T0工作在方式2
MOV TL0,#0CEH
MOV TH0,#0CEH ;置定时初值
SETB TR0 ;启动T0工作
WAIT: JNB TF0,WAIT ;定时未到, 循环等待
CLR TF0 ;定时到,清TF0
CPL P1.0 ;由P1.0输出,信号取反
SJMP WAIT ;循环输出方波
中断方式程序:
MOV TMOD,#02H ;T0工作在方式2
MOV TL0,#0CEH
MOV TH0,#0CEH ;置计数初值
SETB EA ; 开中断
SETB ET0 ; 允许T0中断
LOOP: SETB TR0 ;启动T0工作
WAIT: SJMP $ ;等待中断
CLR TF0 ;计数溢出标志位TF0清0
AJMP LOOP
ORG 000BH ;中断服务程序
CPL P1.0 ;由P1.0输出,信号取反
RETI ;中断返回
方式3
在工作方式3下,T0被拆成两个独立的8位计数器。其中TL0既可以作计数器使用,又可以作定时器使用,其功能和操作方式与方式0或方式1完全相同。而TH0只能作8位定时器使用,并占用了T1的中断资源TR1和TF1。
如果T0已工作在方式3下,则T1只能工作在方式0-2下,用于任何不需要中断控制的场合,或用作串行口的波特率发生器。通常只有当T1用作串行口的波特率发生器时,T0才被定义为方式3,以增加一个8位计数器。这时,只要设置好工作方式,T1便可自动运行。如要停止工作,只需送入一个把它设为方式3的控制字即可这时T1直接把溢出标志TF1送给串行口。
相关文章