void ReadIr() interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);
if(IRIN==0) //確認(rèn)是否真的接收到正確的信號(hào)
{
err=1000; //1000*10us=10ms,超過(guò)說(shuō)明接收到錯(cuò)誤的信號(hào)
while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過(guò)去
{
DelayMs(1);
err--;
}
if(IRIN==1) //如果正確等到9ms低電平
{
DelayMs(20);
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過(guò)去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++) //共有4組數(shù)據(jù)
{
for(j=0;j<8;j++) //接收一組數(shù)據(jù)
{
err=60;
while((IRIN==0)&&(err>0))//等待信號(hào)前面的560us低電平過(guò)去
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //計(jì)算高電平的時(shí)間長(zhǎng)度。
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
return;
}
}
IrValue[k]>>=1; //k表示第幾組數(shù)據(jù)
if(Time>=8) //如果高電平出現(xiàn)大于565us,那么是1
{
IrValue[k]|=0x80;
}
Time=0; //用完時(shí)間要重新賦值
}
}
}
while(IRIN==1);
if((~IrValue[2]==IrValue[3])&&(~IrValue[0]==IrValue[1]))
TabHL1[0]=IrValue[2];
else
return;
}
}
|