設計一個基于單片機的嵌入式系統(tǒng),要求具備以下功能:
紅外數據的接收及解碼,紅外發(fā)色電路
數碼管的顯示驅動控制
將接收到的紅外數據進行實時顯示(限于動態(tài)掃描方法)
請根據以上功能要求,進行硬件系統(tǒng)設計,編寫軟件程序并畫出流程圖。
利用單片機進行遙控系統(tǒng)的應用設計,相較于市面上遙控集成電路受功能鍵數及應用范圍限制,具有編程靈活多樣、操作碼個數可隨意設定的優(yōu)點。本設計利用AT89C52制作紅外遙控系統(tǒng),使用Keil軟件編寫程序,在Proteus軟件中采用IRLINK模塊用于接收并解調紅外信號,進行程序的仿真。設計中,矩陣鍵盤充當遙控器,當我們按下某一個鍵時,經單片機識別,CPU向接有紅外發(fā)射管的端口發(fā)射一定頻率的脈沖,該脈沖與38KHz左右的載波脈沖進行調制,然后將已調制的脈沖進行緩沖放大,激勵紅外發(fā)光二極管將電能轉化為光能,使得紅外發(fā)光二極管發(fā)射出一定頻率的紅外線,當接收控制系統(tǒng)接收到該紅外光后,由單片機內定時/計數器得到該紅外光的頻率,然后將該頻率送往CPU,由CPU對該信號進行反編碼,識別出控制信號,控制LED燈亮,蜂鳴器發(fā)聲,并從數碼管顯示出按鍵值,同時示波器顯示紅外發(fā)射及接受端的脈沖波形,實現紅外數據的接收解碼與動態(tài)顯示。
以下為發(fā)射程序,接收見附件。信號波形解碼顯示都沒問題,LED燈和蜂鳴器設計是有點問題的,可以刪掉不用不影響。
自動的是壓縮包里第二個文件的程序,其他包里有額外的參考資料,可借鑒。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (55.26 KB, 下載次數: 74)
下載附件
2020-7-7 19:30 上傳
51hei.png (42.1 KB, 下載次數: 57)
下載附件
2020-7-7 19:30 上傳
95TBRJ33Y8[J@WJOGT8~93D.png (35.07 KB, 下載次數: 58)
下載附件
2020-7-6 20:18 上傳
紅外波形圖:
51hei.png (109.77 KB, 下載次數: 69)
下載附件
2020-7-7 19:31 上傳
單片機源程序如下:
- #include <REG51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SBM 0xFF //用戶識別碼
- #define m9 (65536-9000) //約9mS
- #define m4_5 (65536-4500) //約4.5mS
- #define m1_6 (65536-1630) //約1.65mS
- #define m_65 (65536-580) //約0.65mS
- #define m_56 (65536-560) //約0.56mS
- #define m40 (65536-40000) //約40mS
- #define m56 (65536-56000) //56mS
- #define m2_25 (65536-2250) //約2.25mS
- sbit IR = P3^6; //定義發(fā)射引腳(接PNP三極管基極)
- sbit LED = P3^7; //發(fā)射指示燈
- 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; //T0 16位工作方式
- IR=1; //發(fā)射端口常態(tài)為高電平
- while(1)
- {
- SanZhuan();
- }
- }
- /***************************************************************
- 函數功能: 4×4矩陣鍵盤
- 鍵值
- P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
- │ │ │ │ │ │ │ │ ┃
- │ │ │ └────13 14 15 16 ┃
- │ │ └─────────9 10 11 12 ┃
- │ └──────────────5 6 7 8 ┃
- └────────────────────1 2 3 4 ┃
- ***************************************************************/
- uchar KEY(void)
- {
- uchar H,L; //行值,列值
- H=0;
- L=0;
- P1 = 0xf0; //將鍵盤端口行值設為1,列值設為0
- if(P1!= 0xf0) //檢測是否有按鍵按下,如果有則hangval必不為0x0f
- {
- YS(10); //按鍵去抖動,延時10毫秒
- if(P1!=0xf0) //確實有按鍵按下
- {
- H = P1&0xf0; //按鍵后得到按鍵的行標志位,將行標志位賦值給hangval
- 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;
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:發(fā)送主程序
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void ZZ(uchar x)
- {
- TT0(1,m9); //高電平9mS
- TT0(0,m4_5); //低電平4.5mS
- /*┈ 發(fā)送4幀數據 ┈*/
- 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);
-
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:單幀發(fā)送程序
- 入口參數:1幀數據
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Z0(uchar temp)
- {
- uchar v;
- for (v=0;v<8;v++) //循環(huán)8次移位
- {
- TT0(1,m_65); //高電平0.65mS
- if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
- else TT0(0,m_56);
- temp >>= 1; //右移一位
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數功能:38KHz脈沖發(fā)射 + 延時程序
- 入口參數:(是否發(fā)射脈沖,延時約 x (uS))
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void TT0(bit BT,uint x)
- {
- TH0 = x>>8; //輸入T0初始值
- TL0 = x;
- TF0=0; //清0
- TR0=1; //啟動定時器0
- if(BT == 0) while(!TF0); //BT=0時不發(fā)射38KHz脈沖只延時;BT=1發(fā)射38KHz脈沖且延時;
- else while(1) //38KHz脈沖,占空比5:26
- {
- 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; //關閉定時器0
- TF0=0; //標志位溢出則清0
- IR =1; //脈沖停止后,發(fā)射端口常態(tài)為高電平
- }
- /***************************************************************
- 函數功能:按鍵消抖 延時程序
- 入口參數:1ms×time (晶振=12MHz)
- ***************************************************************/
- void YS(uchar time)
- {
- uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
復制代碼
51hei.png (16.87 KB, 下載次數: 69)
下載附件
2020-7-7 19:32 上傳
全部資料51hei下載地址:
紅外遙控帶原理圖.rar
(2.78 MB, 下載次數: 219)
2020-7-7 11:40 上傳
點擊文件名下載附件
紅外遙控 下載積分: 黑幣 -5
|