单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在中断函数timer0中又要初始化??

#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar temp,t0;
void init();

void mian()
{
init()
while(1)
{
}
}
void init()
{
temp=0xfe;
p1=temp;
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;

}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if (t0=10)
{
t0=0;
temp=_crol_(temp,1);
p=temp;
}
}
程序代码如下 ,说为什么要在mian函数中初始化TH0和TL0,在中断函数中又一次赋值,mian函数中的赋值是否可以去掉

因为定时器计数溢出时才产生中断,th0tl0全等于0。这种定时工作方式不会自动重装定时初值,所以中断子函数中要人工装载。主函数中如果省去初值,那就是从0开始计数,第一次进入中断的时间会有误差,所以不能省。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-17
我谈谈我的看法吧:
首先,我们需要知道的是TH0和TL0寄存器在未赋值的时候都保持默认00H
其次,如果是加基数的话那么到IE开启的时候就要等待一段时间才中断(选择的模式的最大值)如果是减计数的话那么到IE开启的时候就会立即执行定时器中断(如果没有更高优先级的话),所以如果不设置初始值的话会造成一些误差,特别是在使用16位定时器的时候。其他倒是没有什么影响。
再次,楼主可以从程序上看到main()中的定时器只执行了一次而已,然而每次进入定时器都进行了赋值,所以主程序里面的赋值是否需要要根据实际情况定,如果需要大致精确的话,还是赋值比较好。

不好意思我单片机已经很久不玩了,不知道理解是否有偏差,如有请大家指证。
第2个回答  2011-11-16
中断里的叫重装初值,定时器有三种模式,13位模式,8位模式(自动重装初值,就是初始化后,中断里无需给定时器高低位赋值),16位模式;13位模式和16位模式需要重装追问

两次初值有什么联系?例如去掉mian函数的初值有什么影响?定时在TR0=1时候打开,TH0,TL0是在mian初值开始减还是从中断函数开始减啊?

第3个回答  2011-11-17
两者都是对TH0,TL0两个寄存器中的值进行修改,去掉main中的赋值的话,他会计时65536微秒,然后进入定时器中断服务程序,在TR0=1时,定时器才开始工作。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网