你应该把led点亮的控制语句放在中断里。
你放在主程序中,是把delay(200);执行完了才判断i是否满足条件,肯定不读对了。
大概明白你的意思了……你可以这样,在你的定时器中断里开始你要做的任务,并且点亮LED,任务肯定是1秒内完成的,并且在完成后关闭LED,那就这样:
void timer0() interrupt 1
{
TH0=(65535-50000)/256;//55535/256
TL0=(65535-50000)%256;//55535%256
i++;
if(i==20){i=0;flag=1;}
}
在主程序中:
while(1)
{
if(flag==1) {flag=0;TASK();}
}
任务:
TASK()
{
led=1; //点亮LED
。。。。。。 //任务内容,小于一秒就可以
led=0; // 关闭LED
}
ms级别的 最好用示波器查看波形,这样你可以确定他开关时间到底是多少
可以确定的是delayms()函数是不会影响中断程序的执行的
或者你可以换种方式 在定时器达到计数20 之后 也就是你程序进入那个if之后把定时器给关了,然后点灯延时200ms,之后关灯 然后再开启计数, 这样的话就需要你计数时间刚好是800ms
这个时间值你最好用示波器查看确认
if (i>=20)// 这个计数需要你计算 确认你计数20是800ms左右
{
TR0=0;//关闭定时器计数
i=0;
led1=0;
delay(200);
led1=1;
TR0=1;//开启定时器计数
}
中断程序当然在继续执行的。不太明白你说的“可是如果我把200mS变大后,后边停顿的时间依然固定”的意思
中断独立于主函数,delay不会影响中断计数