定时器/计数器的初始化:
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始货的步骤一般如下:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚步加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
下面介绍一下确定时时/计数器初值的具体方法。
因为在不同工作方式下计数器位数不同,因而最大计数值也不同。
现假设最大计数值为M,那么各方式下的最大值M值如下:
方式0:M=213=8 192
方式1:M=216=65 536
方式2:M=28=256
方式3:定时器0分成两个8位计数器,所以两个M均为256。
因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:
X=M-计数值
下面举例说明初值的确定方法。
例1、选择T1方式0用于定时,在P1.1输出周期为1ms方波,晶振fosc=6MHz。
解:根据题意,只要使P1.1每隔500us取反一次即可得到1ms的方波,因而T1的定时时间为500us,因定时时间不长,取方式0即可。则M1 M0=0;因是定时器方式,所以C/T=0;在此用软件启动T1,所以GATE=0。T0不用,方式字可任意设置,只要不使其进入方式3即可,一般取0,故TMOD=00H。系统复位后TMOD为0,可不对TMOD重新清0。
下面计算500us定时T1初始值:
机器周期T=12/fosc=12/(6×106)Hz=2μs
设初值为X,则:
(1013-X)×2×10-6s=500×10-6s
X=7942D=1111100000110B=1F06H
因为在作13位计数器用时,TL1的高3位未用,应填写0,TH1占用高8位,所以X的实际填写应为:
X=111100000000110B=F806H
结果:TH1=F8H,TL1=06H
源程序如下:
ORG 2000H
MOV TL1,#06H ;给TL1置初值
MOV TH1,#0F8H ;给TH1置初值
SETB TR1 ;启动T1
LP1:JBC TF1,LP2 ;查询计数溢出否?
AJMP LP1
LP2:MOV TL1,#06H ;重新设置计数初值
MOV TH1,#0F8H
CPL P1.1 ;输出取反
AJMP LP1 ;重复循环
定时器/计数器的四种工作方式:
定T0或T1无论用作定时器或计数器都有4种工作方式:方式0、方式1、方式2和方式3。除方式3外,T0和T1有完全相同的工作状态。下面以T1为例,分述各种工作方式的特点和用法。
工作方式0: 13位方式由TL1的低5位和TH1的8位构成13位计数器(TL1的高3位无效)。工作方式0的结构见下图:
为定时/计数选择:C/T=0,T1为定时器,定时信号为振荡周期12分频后的脉冲;C/T=l,T1为计数器,计数信号来自引脚T1的外部信号。
定时器T1能否启动工作,还受到了R1、GATE和引脚信号INT1的控制。由图中的逻辑电路可知,当GATE=0时,只要TR1=1就可打开控制门,使定时器工作;当GATE=1时,只有TR1=1且INT1=1,才可打开控制门。GATE,TR1,C/T的状态选择由定时器的控制寄存器TMOD,TCON中相应位状态确定,INT1则是外部引脚上的信号。
在一般的应用中,通常使GATE=0,从而由TRl的状态控制Tl的开闭:TRl=1,打开T1;TRl=0,关闭T1。在特殊的应用场合,例如利用定时器测量接于INT1引脚上的外部脉冲高电平的宽度时,可使GATE=1,TRl=1。当外部脉冲出现上升沿,亦即INT1由0变1电平时,启动T1定时,测量开始;一旦外部脉冲出现下降沿,亦即INT1由l变O时就关闭了T1。
定时器启动后,定时或计数脉冲加到TLl的低5位,从预先设置的初值(时间常数)开始不断增1。TL1计满后,向THl进位。当TL1和THl都计满之后,置位T1的定时器回零标志TFl,以此表明定时时间或计数次数已到,以供查询或在打开中断的条件下,可向CPU请求中断。如需进一步定时/计数,需用指令重置时间常数。
方式0是13位计数结构的工作方式,其计数器由TH0全部8位和TL0的低5位构成。当TL0的低5
位计数溢出时,向TH0进位,而全部13位计数溢出时,则向计数溢出标志位TF0进位。
在方式0下,当为计数工作方式时,计数值的范围是: 1~8192(213)
当为定时工作方式时,定时时间的计算公式为:
(213-计数初值)×晶振周期×12 或 (213-计数初值)×机器周期
其时间单位与晶振周期或机器周期相同(ms)。
例题1:当某 单片机 系统的外接晶振频率为6MHz,该系统的最小定时时间为:
[213-(213-1)]×[1/(6×106)]×12=2×10-6=2(ms)
最大定时时间为:
(213-0)×[1/(6×106)]×12=16384×10-6=16384(ms)
或:最小定时单位×1013=16384(ms)
例题2: 设某 单片机 系统的外接晶振频率为6MHz,使用定时器1以方式0产生周期为500ms的等宽正方波连续脉冲,并由P1.0输出。
以查询方式完成。
⑴ 计算计数初值
欲产生500ms的等宽正方波脉冲,只需在P1.0端以250ms为周期交替输出高低电平即可实现,为此定时时间应为250ms。使用6MHz晶振,根据上例的计算,可知一个机器周期为2ms。方式0为13位计数结构。设待求的计数初值为X,则:
(213-X)×2×10-6=250×10-6
求解得:
X=213-(250÷2)=8067。
二进制数表示为1111110000011。十六进制表示,高8位为FCH,放入TH1,即TH1=FCH;低5位为03H。放入TL1,即TL1=03H。
⑵ TMOD寄存器初始化
为把定时器/计数器1设定为方式0,则M1M0=00;为实现定时功能,应使C/T=0;为实现定时器/计数器1的运行控制,则GATE=0。定时器/计数器0不用,有关位设定为0。因此TMOD寄存器应初始化为00H。
⑶ 由定时器控制寄存器TCON中的TR1位控制定时的启动和停止 TR1=1启动,TR1=0停止。
⑷ 程序设计:
MOV TMOD,#00H ;设置T1为工作方式0
MOV TH1,#OFCH ;设置计数初值
MOV TL1,#03H
MOV IE,#00H ;禁止中断
LOOP:
SETB TR1 ;启动定时
JBC TF1,LOOP1 ;查询计数溢出
AJMP LOOP
LOOP1:
MOV TH1,#FCH ;重新设置计数初值