都说了你这不精确,前面说的那些情况你这根本处理不了,
看看INTEL自己是怎么处理的吧
以下代码是RTX51-TINY的代码,这个系统最早就是INTEL搞的,KEIL的前身就是源自INTEL的官方开发环境
; Update 8051 Interrupt Timer
CLR TR0
MOV A,TL0
ADD A,#LOW (?RTX_CLOCK + 7)
MOV TL0,A
MOV A,TH0
ADDC A,#HIGH (?RTX_CLOCK + 7)
MOV TH0,A
SETB TR0
这里其实最好是关中断,但RTOS要尽量减少关中断时间,所以这里没有关,在极限情况下可能也不准(被其它中断打断),一般情况也够了
另外一种不用判断的巧妙用法可以精心设计一个初值,让初值的低8位为0,这样可以只更新TH0。。。
TH0 = 0xXX;
//TL0 |= 0xXX;
再或者让低半字节为0,假设标准51,中断周期为10ms, 那么初值为65536-10000=55536=d8f0,重设初值的代码可以这样
TH0 = 0xd8;
TL0 |= 0xf0;
这样也是准确的,但也受更高级中断的影响 |