确定定时器的初值是为了让定时器按照自己的意思(自己规定的秒数)去产生中断。由于定时器计数是用两个8位寄存器结合为一个16位去递加:
2^16次方 = 65536(机器周期)
而定时器的默认中断方式是当16位寄存器递增至满(共计65536个机器周期)后,溢出便产生中断。
现在我想让定时器在50ms之后产生中断,则只需要让计数器从TH0TL0初值开始计数,刚刚好50ms之后就溢出,这样便可以控制定时器产生中断。
那么, TH0TL0这个初值是多少呢? 求这个初值只需要 65536 - (50ms内的机器周期数) 现在我们来看看,50ms内的机器周期有多少个:
假设晶振为 11.0592MHz
11.0592MHz => 11059200Hz / 12 = 921600个/秒 (也就是说1秒能运行921600个机器周期)
换算一下, 921600个/秒 = 921.6个/毫秒 = 46080个/50ms
2^16次方 = 65536(机器周期)
而定时器的默认中断方式是当16位寄存器递增至满(共计65536个机器周期)后,溢出便产生中断。
现在我想让定时器在50ms之后产生中断,则只需要让计数器从TH0TL0初值开始计数,刚刚好50ms之后就溢出,这样便可以控制定时器产生中断。
那么, TH0TL0这个初值是多少呢? 求这个初值只需要 65536 - (50ms内的机器周期数) 现在我们来看看,50ms内的机器周期有多少个:
假设晶振为 11.0592MHz
11.0592MHz => 11059200Hz / 12 = 921600个/秒 (也就是说1秒能运行921600个机器周期)
换算一下, 921600个/秒 = 921.6个/毫秒 = 46080个/50ms
好了,现在我们计算出了50ms内能运行46080个机器周期,
那么按上述求初值的方法: 初值 = 65536 - 46080 = 19456个。
那么按上述求初值的方法: 初值 = 65536 - 46080 = 19456个。
最后,总结一下,我们想要让定时器经过50ms后产生中断,只需要给定时器设置一个初值,值为19456 = 0x4c00 即可。
赋值TH0 TL0时也有技巧,就是高位除 /,低位取余 %。
TH0 = 19456/256; // TH0是8位,2^8 = 256
TL0 = 19456%256; // TL0是8位,2^8 = 256
另外,对于精确计算,若想要1秒产生一次中断,只需要50ms中断的定时器产生20次即可得到1秒中断了。
赋值TH0 TL0时也有技巧,就是高位除 /,低位取余 %。
TH0 = 19456/256; // TH0是8位,2^8 = 256
TL0 = 19456%256; // TL0是8位,2^8 = 256
另外,对于精确计算,若想要1秒产生一次中断,只需要50ms中断的定时器产生20次即可得到1秒中断了。