#include 'reg51.H' #define uchar unsigned char #define uint unsigned int sbit IRIN = P3^5; //紅外接收器數(shù)據(jù)線 sbit out1= P3^0; //四個輸出口控制繼電器 sbit out2= P3^1; sbit out3= P3^2; sbit out4= P3^3; //////////////////////////////////////////// //定義數(shù)組IRCOM,,分別裝解碼后得到的數(shù)據(jù) //IRCOM[0] 低8位地址碼 //IRCOM[1] 高8位地址碼 //IRCOM[2] 8位數(shù)據(jù)碼 //IRCOM[3] 8位數(shù)據(jù)碼的反碼 ///////////////////////////////////////////// uchar IRCOM[4]=0; //bit flag=0; //bit flagcom=0; //串口發(fā)送標(biāo)志 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<> {;} } } /////////////// //初始化 //////////// void IR_init(void) { EA=1; EX0=1; //允許總中斷中斷,使能 INT0 外部中斷 IT0=1; //觸發(fā)方式為脈沖負(fù)邊沿觸發(fā) 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; } //確認(rèn)IR信號出現(xiàn) while (!IRIN) //等IR變?yōu)楦唠娖?,跳過9ms的前導(dǎo)低電平信號,。 { delay014ms(1); N++; if(N>50) { EX0=1; return; } } N=0; while (IRIN) //等 IR 變?yōu)榈碗娖?,跳過4.5ms的前導(dǎo)高電平信號,。 { delay014ms(1); N++; if(N>35) { EX0=1; return; } } N=0; for (j=0;j<4;j++) >4;j++) > { for (k=0;k<8;k++) >8;k++) > { err=60; while ((IRIN==0)&&(err>0 ) ) //等 IR 變?yōu)楦唠娖?br> { delay014ms(1); err--; } err=500; while ((IRIN==1)&&(err>0) ) //計(jì)算IR高電平時長 { delay014ms(1); time++; err--; if (time>=30) { EX0=1; return; } //0.14ms計(jì)數(shù)過長自動離開,。 } //高電平計(jì)數(shù)完畢 IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)'0' if (time>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)'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; } } 想實(shí)現(xiàn) 紅外4個按鍵,,按1,繼電器1動作其他不動作,,松手繼電器1不動作,,同理其他,我現(xiàn)在時間和中斷 弄得不對,,請幫幫修改下 用紅顏色 |
|