51单片机 delay函数过程中,定时器中断是否还在记数?

也就是程序
#include <reg52.H>
#define uint unsigned int#define uchar unsigned char
sbit ledlk=P1^0;
sbit smglk=P1^1;
sbit smgbitlk=P1^2;
sbit led1=P2^0;
uchar i;
void delay(uint ms)
{
uint i,j;
for (j=0;j<ms;j++)
for (i=0;i<120;i++);
}

void delayus(uint us)
{
uint i,j;
for (j=0;j<us;j++)
for (i=0;i<12;i++);
}

void main()
{
smglk=0;
smgbitlk=0;
ledlk=1;

EA=1; //中断总开关
TMOD=0X01;
ET0=1; //T0定时器中断开关
TR0=1; //启用T0定时器/计数器
i=0;
TH0=(65535-50000)/256;//55535/256
TL0=(65535-50000)%256;//55535%256
while(1)
{
if (i>=20)
{
i=0;
led1=0;
delay(200);
led1=1;
}
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;//55535/256
TL0=(65535-50000)%256;//55535%256
i++;
}

上边程序中,如果程序进入delayms()函数,下边中断是否还在继续?
我这边做出来为什么似乎中断在进入delayms()之后就暂停了呢?
我做的一个LED等闪烁的效果来判断出来的。
想要的是亮0.2秒,停0.8秒。可是如果我把200mS变大后,后边停顿的时间依然固定。所以我觉得中断停了,希望高手给解读一下。
其实我要达到的效果是:比如:1秒钟1个周期,每个周期做一系列计算、动作,做完就等待下一个周期(也就是下一秒的到来),也许做的计算、动作有多有少,但是一定是一个秒一个周期。如果计算动作用了200ms,那么等待时间就是800ms,如果计算动作用了600ms,那么等待时间就相应变成400ms,而我上边代码中,我如果吧delay时间改小到100,或者增大到900,灯点亮的周期肯定不同,100ms也许眼睛分辨不出来,800ms还是非常明显的。

你应该把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

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-26
ms级别的 最好用示波器查看波形,这样你可以确定他开关时间到底是多少
可以确定的是delayms()函数是不会影响中断程序的执行的

或者你可以换种方式 在定时器达到计数20 之后 也就是你程序进入那个if之后把定时器给关了,然后点灯延时200ms,之后关灯 然后再开启计数, 这样的话就需要你计数时间刚好是800ms
这个时间值你最好用示波器查看确认
if (i>=20)// 这个计数需要你计算 确认你计数20是800ms左右
{
TR0=0;//关闭定时器计数
i=0;
led1=0;
delay(200);
led1=1;
TR0=1;//开启定时器计数
}追问

请看我更新了追问内容,谢谢!

第2个回答  2013-03-26
中断程序当然在继续执行的。不太明白你说的“可是如果我把200mS变大后,后边停顿的时间依然固定”的意思追问

就是说本来应该是LED亮200ms,灭800ms,如果我把200改成800,那么灭灯时间应该只有200ms了,如果改成900ms,那灭灯时间只有100ms了,可是实际情况不是这样,灭灯时间依然不变,亮灯时间拉长了而已,所以说我觉得似乎是再delay中 中断停了的感觉。

追答

这个用眼睛是不好观察的,你可以再定义一个变量j,让j和i一起加,j的值在中断中判断。当j>=20的时候让另一个LED闪烁,这样观察起来就方便了

追问

请看我更新了追问内容,谢谢!

第3个回答  2016-05-30
中断独立于主函数,delay不会影响中断计数
第4个回答  2013-03-26
如果使用 PROTEUS 软件仿真,相差零点几秒的亮、灭的时间,再用肉眼来观察,是不准确的。
这并不是眼睛的问题,而是软件显示的问题。

还是 PROTEUS 中的示波器来观察吧。
在这里面看,时间间隔的大小,要比它的 LED 显示,精确多的多了。