|
本帖最后由 PROTUSE 于 2018-6-24 19:20 編輯
本設計采用51單片機作為遙控發射接收芯片,HS003B作為紅外一體化接收發射管,在此基礎上設計了一個簡易的智能紅外遙控系統。系統包括接收和發射兩大部分,發射部分有16個按鍵,接收部分含有8盞彩色LED燈、一片二位數碼管和蜂鳴器系統。發射部分通過鍵盤掃描判斷哪個鍵被按下,經過單片機編碼程序進行編碼,控制紅外發射電路發送信號。接收部分解碼信號,實現相應的輸出。本設計方案結合紅外遙控設計簡單、作方便、成本低廉等特點。 總體方案
紅外遙控系統由紅外發射裝置和紅外接收設備兩大部分組成。紅外發射裝置又由鍵盤電路、紅外編碼芯片、電源和紅外發射電路組成。紅外接收設備可由紅外接收電路、紅外解碼芯片、電源和應用電路組成。 紅外接收端主要包括紅外接收模塊和解調單片機。其中,紅外線接收模塊包括光電轉換放大器和解調電路。
軟件設計
遙控碼的發射
當某個操作按鍵按下時,單片機先讀出鍵值,然后根據鍵值設定遙控碼的脈沖個數,再調制成38kHz方波由紅外線發光管發射出去。
通常,紅外遙控是將遙控信號(二進制脈沖碼)調制在38KHz的載波上,經緩沖放大后送至紅外發光二極管,轉化為紅外信號發射出去的。為了提高抗干擾性能和降低電源消耗,將上述的遙控編碼脈沖對頻率為38KHz(周期為26us)的載波信號進行脈幅調制(PAM),再經緩沖放大后送到紅外發光管,將遙控信號發射出去。
紅外信號發射過程:首先發射9ms高電平和4.5ms低電平的引導碼,再發送16位地址碼的前8位,16位地址碼的后8位,8位按鍵數據和8位按鍵數據反碼。
在實踐中,采用紅外線遙控方式時,由于受遙控距離,角度等影響,使用效果不是很好,如采用調頻或調幅發射接收碼,可提高遙控距離,并且沒有角度影響。
發射控制程序由主程序和鍵掃描程序、編碼發送程序組成,在主程序中,采用鍵掃描子程序完成各個按鍵的功能,遙控發射主程序的流程圖 紅外接收
紅外遙控解碼程序主要工作為等待紅外線信號出現,并跳過引導信號,搜集連續32位的編碼數據,并存入內存的連續空間。其位信號判別的原則是:以判斷各個位的波寬信號來決定高低信號(0或1)。
位解碼原理如下: 1)解碼為0:高電平寬度0.56ms+低電平寬度0.56ms。 2)解碼為1:高電平寬度0.56ms+低電平寬度1.68ms。
編碼數據讀取后,經過單片機將編碼數據與鍵盤代碼進行比對,即可解調出具體的按鍵值,便可知按下哪個鍵,而做出相應的控制處理,完成紅外遙控的動作。 發射程序
附上proteus仿真工程 程序 論文
單片機源程序如下:
- #include <REG51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SBM 0x80
- #define m9 (65536-9000)
- #define m4_5 (65536-4500)
- #define m1_6 (65536-1630)
- #define m_65 (65536-580)
- #define m_56 (65536-560)
- #define m40 (65536-40000)
- #define m56 (65536-56000)
- #define m2_25 (65536-2250)
- sbit IR = P3^6;
- sbit LED = P3^7;
- uchar KEY(void);
- void SanZhuan(void);
- void ZZ(uchar x);
- void Z0(uchar temp);
- void TT0(bit BT,uint x);
- void YS(uchar time);
- void main(void)
- { TMOD = 0x01;
- IR=1;
- while(1)
- {SanZhuan();}
- }
- uchar KEY(void)
- {uchar H,L;
- H=0;
- L=0;
- P1 = 0xf0;
- if(P1!= 0xf0)
- { YS(10);
- if(P1!=0xf0)
- {H = P1&0xf0;
- P1 = 0x0f;
- L = P1&0x0f;
- }
- return (H+L);
- }
- return 0;
- }
- void SanZhuan(void)
- { uchar v;
- v = KEY();
- switch(v)
- {case 0x77:ZZ(0x01);v=0;break;
- case 0xb7:ZZ(0x02);v=0;break;
- case 0xd7:ZZ(0x03);v=0;break;
- case 0xe7:ZZ(0x04);v=0;break;
- case 0x7b:ZZ(0x05);v=0;break;
- case 0xbb:ZZ(0x06);v=0;break;
- case 0xdb:ZZ(0x07);v=0;break;
- case 0xeb:ZZ(0x08);v=0;break;
- case 0x7d:ZZ(0x09);v=0;break;
- case 0xbd:ZZ(0x10);v=0;break;
- case 0xdd:ZZ(0x11);v=0;break;
- case 0xed:ZZ(0x12);v=0;break;
- case 0x7e:ZZ(0x13);v=0;break;
- case 0xbe:ZZ(0x14);v=0;break;
- case 0xde:ZZ(0x15);v=0;break;
- case 0xee:ZZ(0x16);v=0;break;
- default:v=0;
- }
- }
- void ZZ(uchar x)
- { TT0(1,m9);
- TT0(0,m4_5);
- Z0(SBM);
- Z0(~SBM);
- Z0(x);
- Z0(~x);
- TT0(1,m_65);
- TT0(0,m40);
- while(KEY())
- { TT0(1,m9);
- TT0(0,m2_25);
- TT0( 1,m_56);
- TT0(0,m40);
- TT0(0,m56);
- LED = !LED;
- }
- LED = 1;
- }
- void Z0(uchar temp)
- { uchar v;
- for (v=0;v<8;v++)
- { TT0(1,m_65);
- if(temp&0x01) TT0(0,m1_6);
- else TT0(0,m_56);
- temp >>= 1;
- }
- }
- void TT0(bit BT,uint x)
- {
- TH0 = x>>8;
- TL0 = x;
- TF0=0;
- TR0=1;
- if(BT == 0) while(!TF0);
- else while(1)
- {
- IR = 0;
- if(TF0)break;
- if(TF0)break;
- IR = 1;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- }
- TR0=0;
- TF0=0;
- IR =1;
- }
- void YS(uchar time)
- { uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
- 接收程序
- #include<reg51.h>
- sbit IRIN=P3^2;
- sbit SPK=P0^0;
- sbit RELAY=P2^7;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- unsigned char IRDATA[7];
- unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90};
- unsigned char X1,X2;
- void IRZ();
- void XSQ();
- void main()
- { EA=1;
- EX0=1;
- IT0=1;
- P1=0xff;
- P2=0xc0;
- P3_0=0;
- P3_1=0;
- SPK=1;
- IRIN=1;
- IRZ();
- XSQ();
- }
- void delay(unsigned char x)
- { unsigned char i;
- while(x--)
- {for(i=0;i<10;i++){}}
- }
- void fs_d()
- {unsigned char i;
- for(i=0;i<100;i++)
- {delay(4);
- SPK=~SPK;
- }
- SPK=1;
- }
- void IR_IN() interrupt 0 using 0
- { unsigned char j,k,n=0;
- EX0=0;
- delay(20);
- if(IRIN==1)
- {EX0=1;
- return;
- }
- while(!IRIN){delay(1);}
- for(j=0;j<4;j++)
- {for(k=0;k<8;k++)
- {while(IRIN) {delay(1);}
- while(!IRIN) {delay(1);}
- while(IRIN)
- {delay(1);
- n++;
- if(n>=30)
- { EX0=1;
- return;}
- }
- IRDATA[j]=IRDATA[j]>>1;
- if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
- n=0;}
- }
- if(IRDATA[2]!=~IRDATA[3])
- {EX0=1;
- return;
- }
- else {}
- fs_d();
- EX0=1;
- }
- void XSQ()
- { while(1)
- { X1 =IRDATA[2]/16;
- X2 =IRDATA[2]%16;
- P3_0=1;P3_1=1;P2=tab[X1];P3_0=1;delay(200);
- P3_0=1;P3_1=0;P2=tab[X2];delay(200);
- }
- }
- void IRZ()
- { while(1)
- {
- switch(IRDATA[2])
- { case 0x01:{P1=0xee;break;}
- case 0x02:{P1=0xdd;break;}
- case0x03:{P1=0xbb;break;}
- case 0x04:{P1=0X77;break;}
- case0x05:{P1=0xf0;break;}
- case0x06:{P1=0x0f;break;}
- case 0x07:{P1=0xaa;break;}
- case 0x08:{P1=0x55;break;}
- case0x09:{P1=0xe7;break;}
- case 0x10:{P1=0xdb;break;}
- case0x11:{P1=0xbd;break;}
- case 0x12:{P1=0x7e;break;}
- case0x13:{P1=0xc3;break;}
- case0x14:{P1=0x3c;break;}
- case0x15:{P1=0x00;break;}
- case0x16:{P1=0xff;break;}
- }
- X1 = IRDATA[2]/16;
- X2 = IRDATA[2]%16;
- P2=tab[X2];P3_1=1;delay(10);P3_1=0;
- P2=tab[X1];P3_0=1;delay(10);P3_0=0;
- }
- }
復制代碼
|
-
總電路.jpg
(370.81 KB, 下載次數: 76)
下載附件
2018-6-14 14:29 上傳
-
解壓.jpg
(232.13 KB, 下載次數: 86)
下載附件
2018-6-14 14:31 上傳
-
-
紅外遙控控制電路設計.rar
2018-6-24 19:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
389.12 KB, 下載次數: 79, 下載積分: 黑幣 -5
評分
-
查看全部評分
|