- /********************************************************************************
- * 描述: *
- * 數碼管顯示 遙控鍵值讀取器 *
- * 遙控器接p3.2 *
- * *
- * *
- * *
- *******************************************************************************/
- #include <reg51.h>
- #include <intrins.h>
- #define NOP() _nop_() /* 定義空指令 */
- //譯碼器管腳定義
- sbit LS138A=P2^2; //管腳定義
- sbit LS138B=P2^3;
- sbit LS138C=P2^4;
- sbit RELAY= P2^0; //繼電器驅動線
- sbit RELAY1= P2^1; //繼電器驅動線
- sbit RELAY2= P2^5; //繼電器驅動線
- sbit RELAY3= P2^6; //繼電器驅動線
- sbit RELAY4= P2^7; //繼電器驅動線
- unsigned char Y0;
- //此表為 LED 的字模, 共陰數碼管 0-9 -
- unsigned char code Disp_Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
- unsigned long LedOut[5],LedNumVal;
- extern unsigned char IRCOM[7];
- void delay(unsigned int i); //函數聲名
- void display(unsigned char Key_Val);
- extern void IRInit(); //extern 是引用IR.C中的函數
- main()
- {
- IRInit();
- while(1)
- {
- //顯示紅外鍵碼
- display(IRCOM[2]);
- }
-
- }
- void delay(unsigned int i)
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
- void display(unsigned char Key_Val)
- {
- unsigned char i;
- /********以下將鍵值送到LED數碼管顯示*************/
- LedNumVal=Key_Val; //把鍵值送到LedNumVal變量中
- LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
- LedOut[1]=Disp_Tab[LedNumVal%1000/100];
- LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[3]=Disp_Tab[LedNumVal%10]; //個位
-
- for(i=0; i<4; i++)
-
-
-
- {
- P0 = LedOut[i] ;
-
- switch(i)
- { //138譯碼
- case 3:LS138A=0; LS138B=0; LS138C=0; break;
- case 2:LS138A=1; LS138B=0; LS138C=0; break;
- case 1:LS138A=0; LS138B=1; LS138C=0; break;
- case 0:LS138A=1; LS138B=1; LS138C=0; break;
- }
-
- delay(100);
- }
- P0 = 0;
- Y0=0;
- switch(IRCOM[2])
- {
- case 0x16: Y0=0x01; break;
- case 0x0c: Y0=0x02; break;
- case 0x08: Y0=0x03; break;
- case 0x42: Y0=0x04; break;
- case 0x18: Y0=0x05; break;
- case 0x1B: Y0=0x06; break;
- case 0x11: Y0=0x07; break;
- case 0x15: Y0=0x08; break;
- case 0x17: Y0=0x09; break;
- case 0x13: RELAY=1; break;
- case 0x14: RELAY=1; break;
- case 0x51: RELAY=0; break;
- }
-
-
-
- if(Y0==0x01)RELAY=0;//打開繼電器
- else RELAY=1;
- if(Y0==0x02)RELAY1=0;
- else RELAY1=1; //關閉繼電器
- if(Y0==0x03)RELAY2=0;
- else RELAY2=1;
- if(Y0==0x04)RELAY3=0;
- else RELAY3=1;
- if(Y0==0x05)RELAY4=0;
- else RELAY4=1;
- }
復制代碼
- /********************************************************************************
- * 描述: *
- * 數碼管顯示 遙控鍵值讀取器 *
- * 遙控器接p3.2 *
- * 現象:當按遙控器時,按下事 數碼管會有閃爍,為什么會閃爍呢 *
- * *
- * 連接方法:使用紅外功能時 J1跳線短接 *
- *****************************************************************************8**/
- #include <reg51.h>
- sbit IRIN = P3^2; //紅外接收器數據線
- void IRdelay(char x); //x*0.14MS
- void beep();
- unsigned char IRCOM[7];
- extern unsigned char Y0;
- extern void display(unsigned char Key_Val);
- /*******************************************************************/
- void IRInit()
- {
- IE |= 0x81; //允許總中斷中斷,使能 INT0 外部中斷
- TCON |= 0x01; //觸發方式為脈沖負邊沿觸發
-
- IRIN=1; //I/O口初始化
- }
- /**********************************************************/
- void IR_IN(void) interrupt 0
- {
- unsigned char j,k,N=0;
- EX0 = 0;
-
- IRdelay(5);
- if (IRIN==1)
- { EX0 =1;
- return;
- }
- //確認IR信號出現
- while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。
- {IRdelay(1);}
- for (j=0;j<4;j++) //收集四組數據
- {
- for (k=0;k<8;k++) //每組數據有8位
- {
- while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
- {IRdelay(1);}
- while (!IRIN) //等 IR 變為高電平
- {IRdelay(1);}
- while (IRIN) //計算IR高電平時長
- {
- IRdelay(1);
- N++;
- if (N>=30)
- { EX0=1;
- return;} //0.14ms計數過長自動離開。
- } //高電平計數完畢
- IRCOM[j]=IRCOM[j] >> 1; //數據最高位補“0”
- if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //數據最高位補“1”
- N=0;
- }//end for k
-
- }//end for j
-
- if (IRCOM[2]!=~IRCOM[3])
- { EX0=1;
- return;
-
- }
- EX0 = 1;
- }
- /**********************************************************/
- void IRdelay(unsigned char x) //x*0.14MS
- {
- unsigned char i;
- while(x--)
- {
- for (i = 0; i<13; i++) {}
- }
- }
復制代碼 |