一、發射部分的工作原理
發射系統開始運行時,單片機首先調用程序里面的按鍵掃描子程序,按鍵掃描子 程序不停的掃描 16 個按鍵,檢測是否有按鍵按下,無按鍵按下時,系統處于等待狀 態;一旦有按鍵按下時,單片機根據按鍵值,然后轉入發射子程序,發射子程序根據 預定的要求裝入不同的脈沖個數,然后調制成 40KHz 的載波信號,通過單片機的 P3.5 口發出,為了提高抗干擾和降低能耗,經過三極管放大后然后由紅外發射管想空中發射。
編碼方式是采用碼分編碼,通過不同的脈沖個數來編碼的。不同的脈沖個數代表 不同的編碼,按鍵 0 的編碼的脈沖個數是 2,按鍵1 是 3 個脈沖,依次類推,按鍵 15 是 17 個脈沖。為了接收可靠,第一位碼的碼寬我們設計成 3ms,其余的為 1ms,遙 控的數據幀間大于 10ms。 圖 4.1 P3-5 輸出口編碼波形圖
二、接收部分原理
系統上電初始化后,對單片機的 P3-1 口進行檢測,當紅外線接收管輸出脈沖數 據幀時,第一位碼是低電平時,單片機將啟動中斷程序,實時的接收數據幀,同時對 第一位碼的碼寬進行驗證,如果第一位碼的低電碼寬小于 2ms 時,單片機將作為錯誤處理,如果間隔位高電平脈寬大于 3ms,便結束接收。然后系統根據累加器中的脈沖個數,來執行相應的程序,操作單片機的各個輸出口,來控制小燈的亮滅和顯示發 射端的按鍵值和隊可控亮度小燈進行亮度控制和亮度值顯示。遙控系統的編碼及解碼 圖 4.2
第三節 遙控發射及接收控制程序流程圖
一、 遙控發射控制流程圖
圖 4.3 遙控發射程序控制流程圖 圖 4.3,左邊是發射部分的主程序,先進行初始化,然后執行鍵盤掃描。右邊是 按鍵掃描程序,先是程序不斷掃描鍵盤是否有按鍵按下,如果有按鍵按下,便調用發 射子程序和顯示子程序。
圖 4.4 遙控發射控制流程圖
圖 4.4 是發射過程,首先按照我們自己定義的協議,裝入脈沖個數,第一個脈沖 發送的是 3ms 的脈沖,方便接收端識別,然后發1ms 脈沖,停發是 1ms 脈沖,直到 發完所有的脈沖便結束這個過程
最全單片機紅外開關設計論文預覽:
單片機源程序如下:
- #include "reg51.h"
- #include "intrins.h" //_nop_();延時函數用
- #define uchar unsigned char
- #define uint unsigned int
- sbit remoteout=P3^5; // 遙控輸出口
- uchar temp,key;
- uint m;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- /***********延時化函數**********/
- void delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=120;j>0;j--);
- }
- /***********初始化函數**********/
- clearmen()
- {
- remoteout=0; //關遙控輸出
- IE=0x00; //IE 單片機寄存器 此句表示單片機復位
- IP=0x01; //開啟外部中斷 0
- TMOD=0x22; //單片機工作在方式2 即 8 位自動重裝 模式
- TH1=0xf3; //40KHZ 初值
- TL1=0xf3; //當 TF1 計數溢出時,常數 TH0
- 里的常數重裝入 TL1
- EA=1; //開總中斷
- }
- /***********按鍵顯示函數**********/
- void display(uchar num)
- {
- P0=table[num];
- }
- /**********發射函數************/
- sed()
- {
- ET1=1; //開計數器 1 中斷
- TR1=1; //開定時器 1
- delayms(3);
- ET1=0; //關
- TR1=0;
- remoteout=0; //40KHZ 發 3 毫秒
- for(m=key;m>0;m--)
- {
- delayms(1); //停 1 毫秒
- ET1=1; TR1=1; delayms(1);
-
-
- ET1=0; TR1=0;
- remoteout=0; //40KHZ 發 1 毫秒
- }
- delayms(10);
- }
- tx() //這個子函數是在發射脈沖個數,
- 不同的按鍵裝入不同的按鍵個數
- {
- switch(key)
- {
- case 0:key=key+1;sed();break; case 1:key=key+1;sed();break; case 2:key=key+1;sed();break; case 3:key=key+1;sed();break; case 4:key=key+1;sed();break; case 5:key=key+1;sed();break; case 6:key=key+1;sed();break; case 7:key=key+1;sed();break; case 8:key=key+1;sed();break; case 9:key=key+1;sed();break; case 10:key=key+1;sed();break; case 11:key=key+1;sed();break; case 12:key=key+1;sed();break; case 13:key=key+1;sed();break; case 14:key=key+1;sed();break; case 15:key=key+1;sed();break; default:break;
- }
- }
- /***********按鍵掃描函數**********/
- void matrixkeyscan()
- {
- P2=0xfe; temp= P2; temp=temp&0xf0; if(temp!=0xf0)
- {
- delayms(10);
- temp= P2; temp=temp&0xf0; if(temp!=0xf0)
- { temp=P2; switch(temp)
- {
- case 0xee: key=0;break; case 0xde: key=1;break; case 0xbe: key=2;break; case 0x7e: key=3;break;
- }
- while(temp!=0xf0)
- { temp=P2; temp=temp&0xf0;
- }
- display(key);
-
-
- tx();
- }
- }
- P2=0xfd; temp=P2; temp=temp&0xf0; if(temp!=0xf0)
- {
- delayms(10);
- temp=P2; temp=temp&0xf0; if(temp!=0xf0)
- { temp=P2; switch(temp)
- {
- case 0xed: key=4;break; case 0xdd: key=5;break; case 0xbd: key=6;break; case 0x7d: key=7;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;temp=temp&0xf0;
- }
- display(key);
- tx();
- }
-
- } P2=0xfb;temp=P2;temp=temp&0xf0; if(temp!=0xf0)
- { delayms(10);temp=P2;temp=temp&0xf0; if(temp!=0xf0)
- { temp=P2; switch(temp)
- {
- case 0xeb: key=8;break; case 0xdb: key=9;break; case 0xbb: key=10;break; case 0x7b: key=11;break;
- }
- while(temp!=0xf0)
- {
- temp=P2;temp=temp&0xf0;
- }
- display(key);
- tx();
- }
- } P2=0xf7;temp=P2;temp=temp&0xf0; if(temp!=0xf0)
- {
- delayms(10);
- temp=P2;
-
-
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P2;
- switch(temp)
- {
- case 0xe7: key=12;break; case 0xd7: key=13;break; case 0xb7: key=14;break; case 0x77: key=15;break;
- }
- while(temp!=0xf0)
- { temp=P2; temp=temp&0xf0;
- } display(key); tx();
- }
- }
- }
- /***********主函數**********/
- void main()
- {
- clearmen();
-
- while(1)
- {
- matrixkeyscan();
- }
- }
- /*********40KHZ 發生器***********/
- // 定時中斷 T1
- void time_intt1(void) interrupt 3
- {
- remoteout=~remoteout; //遙控開關取反
- }
- //*********************結束**************************//
- 接收端
- /*********************************************************************/
- /
- /*********************************************************************/
-
- // 接收端
-
- /*********************************************************************/
- //使用 AT89C52 單片機,12MHZ 晶振,
- //
- //#pragma src(E:\remote.asm)
- #include "reg51.h"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define disout P2 sbit dula=P3^7; uchar code table[]={
-
-
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- sbit sbit sbit
- remotein=P3^1; sin=P3^0; K1=P0^0;
- // 遙控輸入
- //基準正弦波相位輸入
- sbit
- K2=P0^1;
-
- sbit
- K3=P0^2;
-
- sbit
- K4=P0^3;
-
- sbit
- K5=P0^4;
-
- sbit
- K6=P0^5;
-
- sbit
- K7=P0^6;
-
- sbit
- K8=P0^7;
-
- uint i,j,m,n,k,s=1;
- uint keyvol; //值存放
- //
- /*********1 毫秒延時程序**********/
- delay1ms(uint t)
- {
- for(i=0;i<t;i++)
- for(j=0;j<120;j++);
- }
- /***********初始化函數**********/
- clearmen()
- { dula=0; EX0=1;
- EA=1; //開總中斷
- }
- //
-
- /**********函數************/
- loop()
- {
- switch(disout&0x07)
- {
- case 0:{s=1;break;}
- case 1:{s=2;break;} case 2:{s=3;break;} case 3:{s=4;break;} case 4:{s=5;break;} case 5:{s=6;break;} case 6:{s=7;break;} case 7:{s=8;break;} default:break;}
- }
- xianshi()
- {
- dula=1; P1=table[keyvol-2] ; dula=0;
- }
-
-
- //
- //
-
-
- /***********主函數***************/
- main()
- {
- clearmen(); //初始化
- loop();
- while(1)
- {
- while(sin==1); delay1ms(s); K8=0;delay1ms(1);K8=1;
- }
- }
- /************外中斷遙控接收函數**************/
- //外中斷 0
- void intt0(void) interrupt 0
- {
- EX0=0;keyvol=0;
- if(remotein==0)
- {delay1ms(1);
- if(remotein==0)
- {while(1)
- {while(remotein==0);
- keyvol++;k=0;
- while(remotein==1){delay1ms(1);k++;if(k>2){ xianshi();goto OOUUTT; xianshi();};}
- }
- OOUUTT:
- switch(keyvol)
- {
- case 2:{K1=~K1;break;}
- case 3:{K2=~K2;break;} case 4:{K3=~K3;break;} case 5:{K4=~K4;break;} case 6:{K5=~K5;break;} case 7:{K6=~K6;break;} case 8:{K7=~K7;break;}
- case 9:{if(disout==0x00){disout=0xff;}else{disout--;}loop();break;}
- default:break;
- }
- }
- }
- EX0=1;
- }
- //
- //*********************結束**************************//
復制代碼
完整的pdf格式文檔51黑下載地址(共62頁):
基于單片機的紅外遙控開關設計.pdf
(1.58 MB, 下載次數: 144)
2017-9-9 10:10 上傳
點擊文件名下載附件
單片機紅外開關設計
|