定时/计数器 第一部分


单片机内部设有 3 个 16 位可编程定时/计数器:T0,T1,T2。它们的本质其实是一个加 1 计数器,其控制电路受软件控制/切换。

 

与各定时/计数器相关联的特殊功能寄存器
来源寄存器 TH2 TL2   TH1 TL1   TH0 TL0
字节地址 CDH CCH 8DH 8BH 8CH 8AH
定时/计数器 T2 T1 T0
工作方式/控制寄存器 T2CON T2MOD TCON TMOD TCON TMOD
字节地址 C8H C9H 88H 89H 88H 89H

 

当定时器 T0/T1/T2 作为定时器工作是,计数器的加 1 信号是由振荡器的 12 分频信号产生,每经过 1 个机器周期,计数器增加 1, 直到计满溢出为止。

MCS-51采用定时控制方式,有固定的机器周期,规定一个机器周期的宽度为6个状态,并依次表示为S1-S6。由于一个状态包括两个节拍,因此一个机器周期总共有12个节拍,分别记作S1P1、S1P2、……、S6P2。因此一个机器周期就由12个振荡脉冲周期组成;

物体在 1 秒(s)内完成周期性变化的次数叫做频率,单位 Hz;

物体作规律往复运动或物理量作规律往复的变化时,重复一次运动/变化所经历的时间叫做周期

周期(T)与频率(f)成反比关系,即:T = 1s / f;

1KHz = 1000Hz,1MHz = 1,000,000Hz,1GHz = 1000MHz;

1 秒(s)= 1000 毫秒(ms) = 1,000,000 微秒(us)。

因为 1 个机器周期(Tm)等于 12 个振荡周期(T),那么 1 个振荡周期 T = (1 / 12) * Tm,如果晶振频率为 12MHz = 12 * 106Hz,而周期和频率成反比,所以可以得到:(1 / 12) * Tm = 1s / (12 * 106Hz), 最后可以得到一个机器周期的时间为 1us

1s = (1 / 12) * Tm * 12 * 106Hz = Tm * 106 = 1000ms = 1,000,000us

==> Tm = 1us

如果晶振频率为 11.0592MHz,则 (11.0592Hz / 12) * Tm = 1us ==> Tm = 1.0850694444444444444444444444444us,约等于 1.0851us

由于 16 位的计数器最多可计数 216 = 65536 次,即最大机器周期 Tmax = 65536us,也就是机器在经过 Tmax 的时间就会中断一次,但是,如果想要使用其它数值来进行中断操作,就需要设定计数器的初值(Tmin),也就是让计数器在初值的基础上进行加 1 操作,直到溢出为止。假如需要经过 Tx 次计数后就产生中断,即经过 Tx 微秒后就中断,那么可以得到:

Tmin = Tmax - Tx

在得到计数初值后,就可以把这个值 “填入” 对应计数器的高/低位寄存器(THx/TLx)了。当使用频率为 12MHz 的晶振,需要经过 1 毫秒就中断一次,那么此次需要 “填入” 的初值就是:

Tmin = 65536 - 1000us = 64536 = 11111100,00011000B = 0xFC18

所以计数器 Tx 的高位 THx = 0xFC,低位 TLx = 0x18。

当中断时间为 1 毫秒,而晶振频率为 11.0592MHz 时,由于机器周期(Tm)= 1.0851,而且 1000us = (65536 - Tmin) * Tm,所以此时的计数初值为:

Tmin = 65536 - 1000us / 1.0851us = 64614.425951525205050225785641876

≈ 64615 = 0xFC67

 所以此时 THx = 0xFC,低位 TLx = 0x67。

如果没有计算器的话,要把十进制数转化为十六进制数,还是比较麻烦的,那该怎么办呢?

THx = Tmin >> 8;

TLx = Tmin & 0xFF;

或者

THx = Tmin / 256;

TLx = Tmin % 256;


知识共享许可协议
《定时/计数器 第一部分》CRAFTOUR.COM 采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际 许可协议进行许可。