/************* 本程序功能說明 **************
單片機型號:STC89C52
晶振頻率 :11.0592MHz
復位電路 :內部復位電路
功能描述 :演示紅外接收點亮LED。
LED對應IO口:P1.0-P3.7-P3.6-P3.5-P3.4-P3.3-P3.2-P3.1
******************************************/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit IR_INPUT=P3^2; //紅外接收引腳
bit IRflag=0; //紅外接收結束標志
uchar IRcode[4]; //紅外代碼接收緩沖區
void Initinfrared();
void main()
{
Initinfrared();
while(1)
{
switch(IRcode[2])
{
case 0x15:P1=0x7f;break;
case 0x07:P1=0xbf;break;
default:P1=0xff;break;
}
}
}
void Initinfrared()
{
IR_INPUT=1;
TMOD=0x01;
EA=1;
ET0=0; //打開T0中斷
EX0=1; //打開外部中斷0
IT0=1; //下降沿觸發
}
/*獲取當前高電平的結束時間*/
unsigned int GetHighTime()
{
TH0=0;
TL0=0;
TR0=1;
while(IR_INPUT)
{
if(TH0>=0x40) // 12/11.0592*16384≈18mS
break;
}
TR0=0;
return(TH0*256+TL0);
}
/*獲取當前低電平的結束時間*/
unsigned int GetLowTime()
{
TH0=0;
TL0=0;
TR0=1;
while(!IR_INPUT)
{
if(TH0>=0x40)
break;
}
TR0=0;
return(TH0*256+TL0);
}
void EXINT1_ISR() interrupt 0 // 外部中斷服務程序
{
uchar i,j;
uchar buf;
uchar time;
time=GetLowTime();
if((time<7833)||(time>8755)) // 引導碼9ms判斷 12/11.0592*X≈8500 (8.5ms~9.5ms之間)
{
EX0=1;
return;
}
time=GetHighTime();
if((time<3686)||(time>4608)) // 引導碼頭4.5ms判斷 12/11.0592*X≈4000 (4ms~5ms之間)
{
EX0=1; // 打開外部中斷0
return; // 返回
}
for(i=0;i<4;i++) // 接收4個字節處理程序
{
for(j=0;j<8;j++) // 接收8個位/字節,處理程序
{
time=GetLowTime();
if((time<313)||(time>718)) // 判斷560us低電平 12/11.0592*X≈560us (500us~600us之間)
{
EX0=1;
return;
}
time=GetHighTime();
if((time>313)&&(time<718)) // 判斷560us高電平 12/11.0592*X≈560us (500us~600us之間)
{
buf>>=1;
} // 當確認是0時,把變量buf循環右移,將低位移到高位
else if((time>1345)&&(time<1751)) // 判斷1.68ms高電平 12/11.0592*X≈1680us (1.46ms~1.9ms之間)
{
buf>>=1; // 當確認是1時,右移1位
buf|=0x80;
}
else
{
EX0=1;
return;
}
}
IRcode[i]=buf; // 接收完數據后把數據傳給數組對應的位置。
}
IRflag=1; // 將結束標志位置1,代表接收完成,中斷返回。
EX0=1;
}
|