#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
sbit IRIN = P3^5; //紅外接收器資料線
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 IRCOM[4]=0;
//bit flag=0;
//bit flagcom=0; //串口發送標志
void delay014ms(unsigned char x); //x*0.14MS
void IR_init(void);
void delay014ms(unsigned char x)
{
unsigned char i;
while(x--)
{
for (i = 0; i<125; i++)
{;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
EA=1;
EX0=1; //允許總中斷中斷,使能 INT0 外部中斷
IT0=1; //觸發方式為脈沖負邊沿觸發
IRIN=1; //I/O口初始化
}
//////////
//解碼程序
//////////////
void IR_CODE(void) interrupt 0 //在外部中斷子程式中解碼
{
unsigned char j,k,m=0 ;
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=60;
while ((IRIN==0)&&(err>0 ) ) //等 IR 變為高電平
{
delay014ms(1);
err--;
}
err=500;
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;
}
EX0=1;
return;
}
//主程式
void main(void)
{
out1= 0;
out2= 0;
out3= 0;
out4= 0;
IR_init( ); //初始化外部中斷0
TR1=1; //開定時器1
if ( IRCOM[2]==0x0044)
{out1=1;
}
if ( IRCOM[2]==0x0007)
{out2=1;
}
if ( IRCOM[2]==0x0016)
{out3=1;
}
if ( IRCOM[2]==0x0047)
{out4=1;
}
}
想實作 紅外4個按鍵,按1,繼電器1動作其他不動作,松手繼電器1不動作,同理其他,我現在時間和中斷 弄得不對,請幫幫修改下 用紅顏色
uj5u.com熱心網友回復:
太專業。。。。。。uj5u.com熱心網友回復:
如果你沒寫錯,main()函式沒有主回圈,這個程式直接跑飛。uj5u.com熱心網友回復:
104W沒有定時器1轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90213.html
標籤:基礎類
上一篇:子執行緒在呼叫類函式時,為什么在執行緒中呼叫時,一運行到BscConnect( ncid )時就出錯,連接不上了。
下一篇:C/C++指標問題。
