void IR_IN() interrupt 0 using 0 //采用12MHz晶振
{
unsigned char j,k,N=0;
EX0 = 0; //初始化,關(guān)閉外中斷
delay(15);
if (IRIN==1) //沒有脈沖到來高電平
{ EX0 =1; //默認(rèn)狀態(tài)下開中斷,尋找9ms引導(dǎo)脈沖
return;
}
//確認(rèn)IR信號出現(xiàn)
while (!IRIN) //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。
{delay(1);} //單片機(jī)接收電平與遙控器電平完全相反,delay(1)延時(shí)0.14ms
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while (IRIN) //等 IR 變?yōu)榈碗娖剑^4.5ms的前導(dǎo)高電平信號。
{delay(1);}
while (!IRIN) //等 IR 變?yōu)楦唠娖剑?.56ms)
{delay(1);}
while (IRIN) //計(jì)算IR高電平時(shí)長
{
delay(1);
N++;
if (N>=14) //大于1.685ms高電平長度,為了保證可靠性N=14
{ EX0=1; //(2.25/0.14=16,1.685/0.14=12,0.565/0.14=4)
return;} //0.14ms計(jì)數(shù)過長自動(dòng)離開,重新判斷。
} //高電平計(jì)數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
if (N>=6) {IRCOM[j] = IRCOM[j] | 0x80;} //大于0.565ms高電平長度,N=6,7,8(1.685/2)都行,判斷為“1”,數(shù)據(jù)最高位補(bǔ)“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) 數(shù)據(jù)碼與數(shù)據(jù)反碼相反,繼續(xù)執(zhí)行,否則,數(shù)據(jù)出錯(cuò)。返回,重新判斷。
{ EX0=1;
return; }
IRCOM[5]=IRCOM[2] & 0x0F; //取鍵碼的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位變?yōu)榈退奈?/div>
if(IRCOM[5]>9)
{ IRCOM[5]=IRCOM[5]+0x37;} //轉(zhuǎn)換成相應(yīng)的ASCII碼,送1602顯示。
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
lcd_pos(0x4b);
lcd_wdat(IRCOM[6]); //第一位數(shù)顯示
lcd_pos(0x4c);
lcd_wdat(IRCOM[5]); //第二位數(shù)顯示
beep();
EX0 = 1; //開中斷,繼續(xù)判斷
}