3.6.6 定时器/计数器的计数初值C的计算和装入

3.6.6 定时器/计数器的计数初值C的计算和装入

8XX51定时器/计数器不同工作方式最大计数值不同,即其模值不同。由于采用加1计数,为使计满回零,计数初值应为负值。计算机中负数是用补码表示的,求补码的方法是模减去该负数的绝对值。

计数初值(C)的计算如下。

计数方式:   计数初值C=模-X(其中X为要计的脉冲的个数)

定时方式:     计数初值C=[t/MC]=模-[t/MC]

式中:t为欲定时时间;MC为8XX51的机器周期,MC=12/fsys

当采用12 MHz晶振时,MC=1μs;当采用6 MHz晶振时,MC=2μs。

1)定时器操作时的计数初值

作为定时器操作时,对机器周期脉冲进行计数。当晶振频率为12 MHz,计数频率为1 MHz时,对于不同的模式,定时器最大时间间隔不同。

(1)模式0。

模式0为13位定时器。它的最大时间间隔=213×1μs=8.192 ms,即定时器在工作方式0下可提供的最长定时间隔为8.192 ms。当需要定时的时间为y ms时,计数寄存器的初值x按下面的公式计算:

(213-x)×1=y×1000  (3.1)

式中:右边的单位为μs。得到的x值高8位赋给TH0,低5位赋给TL0。

例如,在模式0下,要求用定时器/计数器0产生定时2 ms,求计数寄存器的初值。

代入式(3.1),有

(213-x)×1=2×1000

求得x=6192=1100000110000B。高8位赋给TH0,低5位赋给T L0。最后计数寄存器中的初值为:TH0=0C1H,TL0=10H。

(2)模式1。

模式1为16位定时模式。它的最大定时间隔=216×1μs=65.536 ms,即定时器在模式1下可提供的最长定时间隔为65.536 ms。当需要定时的时间为y时,计数寄存器的初值x按下面的公式计算:

(216-x)×1=y×1000  (3.2)

式中:右边的单位为μs。得到的x值高8位赋给TH0,低8位赋给TL0。

例如,在模式1下,要求用定时器/计数器0产生定时1 ms,求计数寄存器的初值。

代入式(3.2),有

(216-x)×1=1×1000

求得x=64536=0FC18H。高8位赋给TH0,低8位赋给TL0。最后计数寄存器中的初值为TH0=0FCH,TL0=18H。

(3)模式2。

模式2是8位定时器自动重装载模式,最大定时间隔=28×1μs=256μs,即定时器在模式2下可提供的最长定时间隔为256μs。用TL进行计数,用TH保存初值。当需要定时的时间为y时,计数寄存器的初值x按下面的公式计算:

(28-x)×1=y  (3.3)

式中:右边的单位为μs。得到的x值放到TH中,以便自动重载。

例如,在模式2下,要求用定时器/计数器1产生50μs定时间隔,求计数寄存器的初值。

代入式(3.3),有

(28-x)×1=50

求得x=0CEH,将其放入TH1以便自动重载。在程序的开始,第一次计算前对TL1也应放入同样的值。

(4)模式3。

模式3是把定时器0分成两个8位定时器/计数器的操作模式。计数器初值的计算和模式2的基本类似,只是定时器/计数器工作方式不同。

2)计数器操作时的计数初值

(1)模式0。

13位计数器,满计数值=213=8192,即最多计数8192个外部脉冲。

(2)模式1。

16位计数器,满计数值=216=65536,即最多计数65536个外部脉冲。

(3)模式2。

8位计数器,满计数值=28=256,即最多计数256个外部脉冲。

(4)模式3。

8位计数器,满计数值=28=256,即最多计数256个外部脉冲。

例如,在模式2下,要求定时器/计数器0计数100个脉冲后送出中断信号,求计数初值。

设计数初值为x,则有

28-x=100

求得x值为9CH,故计数寄存器TH1和T L1的初值应为9CH。

例如,要求定时器T0在模式1下定时50 ms,系统时钟为12 MHz。

定时器TO在模式1时为16位定时器/计数器,TH0和TL0各有8位,最大计数次数为216-1(从000000000000 0000B计数到1111111111111111B),如果要溢出,则计数次数为(216-1)+1=216

系统时钟频率fsys=12 MHz,系统周期Tsys=1/fsys=1/12μs;机器周期T=12/Tsys=1μs。

定时功能时计数器每一个机器周期计1次数,则

最大溢出时间=216次×1 μs/次=216 μs=65536μs

如果要定时50 ms,计满50 ms要溢出一次,50 ms=50000μs<65536μs,所以我们可以先设定一定的初值。50 ms=50000μs=50000次×1μs/次,因此,初值=(65536-50000)次。

机器周期:T=12/Tsys=1μs。

应计脉冲个数:50 ms/1μs=50×103(μs)/1(μs)=50000=C350H。

求补:(C350H)=10000H-C350H=3CB0H。

将这个初值分别装在THO和TLO中,则

65536-50000=15536=001111001011 0000B

初值分布如图3.32所示,即

如果还是用定时器T0在模式1下定时50 ms,但是系统时钟改为6 MHz,则初值如何计算呢?

图3.32 初值分布图

通过对比,系统时钟变了,机器周期也就随之改变。机器周期T=12Tsys=2μs,50 ms=50000μs=50000次×2μs/次,所以,初值=(65536-25000)次,即(按十进制装载)

TH0=(65536-25000)/256,TL0=(65536-25000)%256

如果定时时间为500 ms,又该如何?

虽然500 ms=500000μs>65536μs,但是可以将500 ms看成10个50 ms,设一个变量记录500 ms溢出的次数,当溢出次数等于10次时,500 ms定时时间到。这就是长时间定时的解决方法。