这是一个红外线接收程序。请问一下,为什么下降沿进入中断后要延时9.8ms?延时完了9.8ms后,红外线数据前的9ms低电平不是过去了吗?而且因为是9.8ms过去了,这个时候应该进行到4.5ms的高电平了吧?那么第一个if(IRIN==0)应该是不成立了啊?然后就是为什么是1000*10us=10ms?DelayMS(1);不是应该是1*0.14ms=0.14ms=140us在加上执行err--;和while语句的时间乘1000吗?希望能有人帮助我完整的理解一下,谢谢!万分感谢!

中断程序:
void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);//?????????????????????????????????????????????????????????????????0.14msx70=9.8ms
if(IRIN==0)//确认是否真的接收到正确的信号
{
err=1000;//1000*10us=10ms,超过说明接收到错误的信号
/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
侯,程序死在这里*/
while((IRIN==0)&&(err>0))//等待前面9ms的低电平过去
{
DelayMs(1);
err--;
}
if(IRIN==1)//如果正确等到9ms低电平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++)//共有4组数据
{
for(j=0;j<8;j++)//接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k表示第几组数据
if(Time>=10)//如果高电平出现大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0;//用完时间要重新赋值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}

中断程序:
void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);//?????????????????????????????????????????????????????????????????0.14msx70=9.8ms
if(IRIN==0)//确认是否真的接收到正确的信号
{
err=1000;//1000*10us=10ms,超过说明接收到错误的信号
/*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
侯,程序死在这里*/
while((IRIN==0)&&(err>0))//等待前面9ms的低电平过去
{
DelayMs(1);
err--;
}
if(IRIN==1)//如果正确等到9ms低电平
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++)//共有4组数据
{
for(j=0;j<8;j++)//接收一组数据
{
err=60;
while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k表示第几组数据
if(Time>=10)//如果高电平出现大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0;//用完时间要重新赋值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}