主函数中是初始化,中断服务程序中赋值,是因为溢出申请中断时,寄存器的值已经为0了,必须重新赋值才能保持定时时间。
8051定时器只有方式二为自动重载,意思进中断后出去会自动重新开始计数,如果你使用的是方式二,那么就不用重新赋值。
如果你采用的是其它方式,如:方式三的16位模式。在开始时,定时器减去初始装载值然后刚好达到需要的时间便溢出(这时候已经从65535跳为0了)进入中断。
那么进入中断后TH0和TL0已经不是你在外面赋的初值了,出去计算重新从0开始,这样会大大影响精度,所以需要在中断里重新赋初始值,保证出去后以你出去后从上次的地方开始计数,这样就保证了精度。
举个例子:你有一个计数器,从0~100s的,只有归0后才会响。但是你想设置10s就响一次,那么你并不需要从0~100s这么长的时间,这个时候就需要给它一个初值了,设置从90s开始计数,达到100s后刚刚好为10s,这个时候计数器会响一次,但是响完后它已经是0了,想要重新响需要100s后才能响,所以,最好的办法就是响铃后重新给它定一个90s开始的计数,这样就能实现每10s响一次了。
定时器的原理也是如此。
欢迎关注CSDN阿维啊的博客。