单片机定时中断

fengleigood   2009-8-12 15:23 楼主
一段定时显示程序
void Time0()interrupt 1
{
unsigned idata i =1;
TR0 = 0;
TH0  = 0xB8; //20ms定时
TL0  = 0x00;
i++;
if(i==500)//10s
{
timing = 1;
}
TR0 = 1;
}


void main()
{
timing=0;
delayms(50);
VFD_init();
VFD_string(LOADING);//显示字符串
delayms(50);
TMOD = 0x01;
TH0  = 0xB8;
TL0  = 0x00;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
  if(timing == 1)
  disp();//显示函数
}
}

请问哪里有问题,这个一直停在显示字符串,不会进到显示函数里面。

回复评论 (4)

你的delay函数的定义去哪了?
点赞  2009-8-27 23:43
void Time0()interrupt 1
{
unsigned idata i =1; // 局部变量,每次进入ISR它会被初始化一次,变成1
TR0 = 0;
TH0  = 0xB8; //20ms定时
TL0  = 0x00;
i++;
if(i==500)//10s .....所以它永远到不了500(总是2)
{
timing = 1;
}
TR0 = 1;
}
点赞  2009-8-28 00:22
并且,一旦从ISR返回,你的i就结束的生存期,它的存储可能会被分配给其它变量
点赞  2009-8-28 00:25
对。首先是变量i的生存周期问题,可以把它声明成静态变量,即static unsigned idata i =1;
另外,timing 要声明成volatile
点赞  2009-8-28 06:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复