先在主程序中给TH1装入初值。
此后,定时(或计数),到了 TH1 TL0=0 时,就进入中断函数。
如果不重新装入初值,它将从 0 开始继续定时(或计数)。
从初值,定时(或计数),到 0,这才是人们期望的。
从 0 ,定时(或计数),到 0,这并不是所期望的。
因此,中断后,必须重新装入初值。
首先你要知道51定时器的原理 ,
定时器 类似于一个盒子里面能装 65535个球 ,每装一个球 是1us(12MHZ晶振) ,这样如果开始是空的 装满就是65535us 。
那么我想定时50ms 怎么办呢 那么我就预先在盒子中放65535-50000=15535个球 不求好了吗
这样就只能再往里面放50000个球了
TH1 TL1就相当于这个盒子 对吧
15535就相当于第一次放入初值
但是我不能只定时一次 50ms 吧 可是现在盒子已经满了 怎么办呢 ?由于盒子满了会发出报警 !
也就是中断请求 这时候我们需要把盒子中的求清空在放15535个球 也就是在中断中再次装入初值
这样应该能理解吧 我语文不好见谅
51单片机定时器 重装初值,是为了使定时器 每次 中断的间隔 时间 始终 是 自己需要的设置时间,
如果不重装初值,那么定时器 的 溢出中断 时间 为 65536 个机器周期(具体时间与晶振有关)
如果需要每次中断 50 mS (如晶振12MHz),则重装初值为 (65536-50000)
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
或者
MOV TH0, #HIGH NOT 50000
MOV TL0, #LOW NOT 50000
目的是为了得到每次中断间隔时间,是自己所需要的。
你说的应该是定时器方式1吧。
首先,你要明白,是在定时器从FFFF到0000时发生的中断,所以,你在进入中断时,定时器值必然是0002或再稍大。此时,不妨假设没有重装初值,那么定时器会继续往上计数,0003,0004,0005。。。。直至FFFF再次进入中断,也就是说,在进入下一次中断时间隔时间是65536个机器周期,哪怕你在主程序中已经装过了(那个值只对第一次中断起到作用)。
那么如果你给TH1,TL1重装了初值呢?从你重装初值的那一行代码起,你下一次进入中断的时间间隔就是65536-初值,因为中断发生的条件仅仅是溢出,而不管当前计数值。
主程序中装入初值,开始计时,计满清零,进入中断,只有再装初值才能重新计时。计满之后再次清零循环进入中断,直到满足if语句进入其中。