IR(Infrared Radiation)通用紅外遙控系統由發射和接受兩大部分組成,應用編/解碼專用集成電路芯片來進行控制操作。發射部分包括鍵盤矩陣,編碼調制,LED紅外線發射。接受部分包括光,電轉化放大器,解調,解碼電路。接收電路可以使用一種集紅外線接受和放大于一體的一體化紅外接收器,不需要任何外接元件,就能完成從紅外線接受到輸出與TTL電平信號兼容的所有工作,而體積和普通的塑料三極管大小一樣。它適合于各種紅外線遙控和紅外線數據傳輸。接收器對外只有3個引腳OUT,GND,VCC與單片機接口非常方便。 發射碼的格式: 遙控器輸出波形: 接受到的波形和發送的波形正好是反向,比如發送的是一高電平然后一低電平,接受的會是一低電平和一高電平。 外部中斷觸發方式:低電平和下降沿。 下面這段代碼的作用是用遙控器向單片機發送數據,單片機響應并改變數碼管上的數據。 這段代碼仍然有問題,正在調試中,路過的大牛希望給與指導: #include <reg52.h> #define uint unsigned int #define uchar unsigned char uint irtime,startflag,i,bitnum,decodeok,receiveok; uchar irdata[33],disp[8],vcode[4]; unsigned char code duan[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char code wei[]={ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void delay(int k){ int i,j; for(i = 0; i < k; i++) for(j = 0; j < 0xff; j++) ; } void Time0_Init(){ EA = 1; ET0 = 1; TH0 = 0x00; TL0 = 0x00; TMOD = 0x02; TR0 = 1; } void Int0_Init(){ EA = 1; IT0 = 1; EX0 = 1; } void Irpro(){ disp[0] = vcode[0] / 16; //把十六進制的數轉化成兩位顯示 disp[1] = vcode[0] % 16; disp[2] = vcode[1] / 16; disp[3] = vcode[1] % 16; disp[4] = vcode[2] / 16; disp[5] = vcode[2] % 16; disp[6] = vcode[3] / 16; disp[7] = vcode[3] % 16; } void display(){ for(i = 0; i < 8; i++){ P1 = wei[ i]; P2 = duan[disp[ i]]; delay(1); } } void decode(){ uint k,i,j; uchar value; j = 1; for(k = 0; k < 4; k++){ value = 0; for(i = 0; i < 8; i++){ if(irdata[j]>6) //如果大于6個irtime是高電平 value |= 0x01 << i; j++; } vcode[k] = value; } decodeok = 1; } void main(){ Time0_Init(); //對定時器中斷進行初始化 Int0_Init(); //對下降沿中斷進行初始化 while(1){ if(receiveok == 1){ //如果接受成功進行解碼 receiveok = 0; decode(); } if(decodeok == 1){ //如果解碼成功,轉換一下格式準備顯示 decodeok = 0; Irpro(); } display(); } } void time0() interrupt 1{ //由于是模式2,8位自動重裝,所以一個irtime為256us irtime++; } void int0() interrupt 0{ if(startflag){ if(irtime > 32){ //如果是引導信息,則bitnum清零 bitnum = 0; } irdata[bitnum] = irtime; //裝載數據,包括1位引導位,16位用戶碼,8位數據碼和8位數據碼反碼 irtime = 0; bitnum++; if(bitnum == 33){ //裝載數據完成 bitnum = 0; receiveok = 1; } } else{ startflag = 1; //遇到第一個下降沿讓irtime為0,遇到第二個時計算用了多少個irtime irtime = 0; } } 李萬鵬 |