#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
sbit IRIN = P3^2; //紅外接收器資料線
sbit out1= P3^0;
sbit out2= P3^1;
//sbit out3= P3^2;
//sbit out4= P3^3;
////////////////////////////////////////////
//定義陣列IRCOM,分別裝解碼后得到的資料
//IRCOM[0] 低8位地址碼
//IRCOM[1] 高8位地址碼
//IRCOM[2] 8位資料碼
//IRCOM[3] 8位資料碼的反碼
/////////////////////////////////////////////
uchar m;
uchar data IRCOM[4]=0;
void IR_init(void);
void delay014ms(unsigned char x); //x*0.14MS
void delay014ms(unsigned char x) //x*0.14MS STC12C5410AD延時約0.15MS
{
unsigned char i ;
x--;
if(x>0)
{
for (i = 0; i<125; i++) //13
{;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
EA=1;
EX0=1; //允許總中斷中斷,使能 INT0 外部中斷
IT0=1; //觸發方式為脈沖負邊沿觸發
IRIN=1; //I/O口初始化
}
//////////
//解碼程序
//////////////
void IR_CODE(void) interrupt 0 using 2//在外部中斷子程式中解碼
{
unsigned char j,k;
unsigned int err,time=0,N=0;
EX0 = 0;
delay014ms(15);
if(IRIN==1)
{
EX0=1;
return;
} //確認IR信號出現
while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
{
delay014ms(1);
N++;
if(N>50)
{
EX0=1;
return;
}
}
N=0;
while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
{
delay014ms(1);
N++;
if(N>35)
{ EX0=1;
return;
}
}
N=0;
for (j=0;j<4;j++) //收集四組資料
{
for (k=0;k<8;k++) //每組資料有8位
{ err=10;
while ((IRIN==0)&&(err>0 ) ) //等 IR 變為高電平
{
delay014ms(1);
err--;
}
err=40;
while ((IRIN==1)&&(err>0) ) //計算IR高電平時長
{
delay014ms(1);
time++;
err--;
if (time>=30)
{
EX0=1;
return;
} //0.14ms計數過長自動離開。
} //高電平計數完畢
IRCOM[j]=IRCOM[j] >> 1; //資料最高位補"0"
if (time>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //資料最高位補"1"
time=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //不等的話表示解碼失敗
//if (IRCOM[0]=0x00ff&&IRCOM[2]!=~IRCOM[3]) //不等的話表示解碼失敗
{
IRCOM[4]=0;
EX0=1;
return;
}
m=IRCOM[2];
switch (m)
{
case 0x47:
out1=1;
break;
case 0x44:
out2=1;
break;
// case 0x16:
// out3=1;
// break;
// case 0x47:
// out4=1;
// break;
default:
break;
}
EX0=1;
return;
}
//主程式
void main(void)
{
out1= 0;
out2= 0;
// out3= 0;
// out4= 0;
IR_init( ); //初始化外部中斷0
TR1=1; //開定時器1
while(1) ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/125627.html
標籤:基礎類
上一篇:c++程式設計 日期與時間顯示
下一篇:一道筆試題目的疑問
