也就是程序
#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亮200ms,灭800ms,如果我把200改成800,那么灭灯时间应该只有200ms了,如果改成900ms,那灭灯时间只有100ms了,可是实际情况不是这样,灭灯时间依然不变,亮灯时间拉长了而已,所以说我觉得似乎是再delay中 中断停了的感觉。
追答这个用眼睛是不好观察的,你可以再定义一个变量j,让j和i一起加,j的值在中断中判断。当j>=20的时候让另一个LED闪烁,这样观察起来就方便了
追问请看我更新了追问内容,谢谢!