定时/计数器 第一部分
单片机内部设有 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 国际 许可协议进行许可。