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定时时间到。这就是长时间定时的解决方法。