模式1下的Timer的特点
一,Timer工作在模式1时是一个16位定时/计数器,计数的初始值的低位和高位分别装载到Timer寄存器TLx和THx中。
二,Timer通过指令SETB将TRx置1启动。
三,当TFx=1,表明计数完成,使用指令“CLR TRx”和“CLR TFx”来关闭Timer。
四,想要重复Timer的计数过程,Timer寄存器中必须重新装载原来的计数的初始值,并将TFx位清0。
五,模式1的设置步骤:
(1)设置Timer的工作模式。程序中向定时/计数器模式控制寄存器TMOD中装载01H。
(2)往TLx和THx 中载入计数初始值 。
(3)启动 Timer。将TRx置1以启动Timer。
(4)检测 Timer 溢出标志TFx。
(5)关闭 Timer。
(6)清溢出标志TFx。
(7)重新装载。
六,Timer的计数时间与计数初始值
Timer寄存器的低位字节TLx和高位字节THx 中装载的是Timer的计数初始值,当Timer启动后,从这个初始值开始每过1个机器周期计数值增加1,直到计数到16位的Timer寄存器的最大值---FFFFH后溢出为止。
公式:
t=Val(FFFF-MMLL+1)*1/fc(MHz)*1/12us
其中MM是THx中的数值,LL是TLx中的数值。
例:
使用的晶振是12MHz,TH0和TL0中装载的计数初始值是EC78H,代入公式中得:
t=Val(FFFF-EC78+1)*1/12*1/12=Val(1388)*1=5000*1=5000us,
计算过程中,(FFFF-EC78+1)计算结果为1388(十六进制),使用科学计算器可以转换成十进制5000,然后再与单位时间相乘,最后结果为5000,即5ms.
七,如何选取Timer的计数初始值
例1:设计一个方波信号发生器,要求从P1.0口输出频率f=2KHz的方波,周期T=1/f=1/2*1000=500(us),所以P1.0口输出的高,低电平持续时间分别为250us.
例2:
250即Timer计数时间,称之为设计时间。计数初始值的步骤:
1)将设计时间(以us为单位,且小于65536)除以12/fc(MHz)。
2)用65536减去步骤1)得到的数。
3)用科学计数器步骤2)中的得数转换成十六进制数形式MMLL。如果转换结果<100H,则MM=0。
4)最后得计数初始值:THx=MM,TLx=LL.
根据这个步骤,假设晶振频率为12MHz,设计时间250us:(1)250us/1us=250;(2)65536-250=65286;(3)65286=FF06H;(4)THx=FF,TLx=06。所以Timer寄存器的计数初始值为FF06H。
八,如何利用Timer进行长时间定时
1)Timer的设计时间取决于两个因素:晶振频率,THx和TLx中装载的计数初始值。
2)硬件一旦完成,意味着晶振频率确定,Timer的设计时间就取决于THx和TLx中装载的计数初始值。
3)当MMLL=0000H时,设计时间t具有最大值,如果晶振频率为12MHz,设计时间最大值=65536,即65.356ms.这个时间连0.1秒都不到,无法满足需要长时间定时的场合.
★★★★★ 解决办法是多次重新装载计数初始值.★★★★★程序:
ORG 00H;
START:
MOV TMOD,#10H; 设置Timer1工作在模式1下
MOV R1,#50; R1为重复定时计数器
LOAD:
MOV TL1,#0E0H; 往TL1和TH1中载入计数的初始值B1E0H(45536十进制)
MOV TH1,#0B1H;
SETB TR1; 启动Timer1
CHECK:
JNB TF1,CHECK; 检测Timer1标志,当TF1=1,跳出执行下一行,否则返回CHECK
CLR TR1; TR1清0 关闭Timer1
CLR TF1; 将TF1清0
DJNZ R1,LOAD; 如果R1≠0,跳回LOAD重新装载计数初始值
;````````; 这里是所要处理的程序(如CLR P1.7;)
;````````;
JMP START; 循环
END; 程序结束(总延时1s)
|