红外遥控你按一下会产生有很多个16个中断液伏,总时间大概是108ms左右。假设你在执行过程的时候,正好有一个中断进来,然后中断结束后出来继续执行DelayUs(400)这个函数,如果再这个函数还没有执行结束的时候又备拦进来了一个中断,i又加了1,等于是当执行完这仿埋胡个while(1)循环一次的时候可能中断已经产生2次或者几次了。所以到i的值就不是按照顺序显示了。因为可能I等于某个数的时候没有经历显示函数。
除非你把端口输出写在中断函数里面。主函数里while(1)函数里执行空函数就好了。
将if的所有语句放在中断函数唯碧数中做判断就好了。
#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int //宏定薯举义
char ii=0;
/*****n(us)延时子程序*****/
void DelayUs(uint N)
{
uint x ;
for(x=0;x<山粗=N;x++);
}
void int1() interrupt 2 //使用外部中断1
{
ii++;
if(ii%4==0)
{
P0=0x00;
P1=0x00;
DelayUs(400);
}
if(ii%4==1)
{
P0=0xff;
P1=0xff;
DelayUs(400);
}
if(ii%4==2)
{
P0=0x00;
P1=0xff;
DelayUs(400);
}
if(ii%4==3)
{
P0=0xff;
P1=0x00;
DelayUs(400);
}
}
void init()
{
EA = 1; //总中断
IT1 =1; //外部中断为边沿触发
EX1 = 1; //允许外部中断
}
void main(void) //主程序
{
init();
while(1)
{
;
}
}
/*****END*****/
while(1)
{
switch(ii%4)
{
case 0:
P0=0x00;
P1=0x00;
break;
case 1:
P0=0xff;
P1=0xff;
break;
case 2:
P0=0x00;
P1=0xff;
break;
case 3:
P0=0xff;
P1=0x00;
break;
}
DelayUs(400);
}
while(1)语句换陆没成镇侍这御悉吵样