|
單片機用紅外線來遙控一個開關實驗的仿真原理圖(proteus工程文件可到本帖附件下載):
0.png (22.49 KB, 下載次數: 109)
下載附件
2017-3-29 23:03 上傳
單片機源程序:
- //----------------------------------------------------------------------------------------------------------------------------------
- //程序名: HW6-3.c
- //程序功能:紅外線遙控開關程序
- // --------------------------------------------------------------------------------------------------------------------------------
- #include<reg51.h> //頭文件
- sbit IRIN=P3^2; //定義紅外IR信號輸入位
- sbit SPK=P0^0; //定義蜂鳴器接口
- sbit RELAY=P2^7; //定義繼電器接口
- unsigned char IRDATA[7]; //定義數組,存儲紅外接收到的數據
- void delay(unsigned char x);
- void fs_d ( );
- //-------------------------------------- 主函數 --------------------------------------
- void main()
- {
- EA=1; // 允許總中斷
- EX0=1; // 允許外部中斷INT0中斷
- IT0=1; // 外部中斷INT0采用脈沖觸發方式
- SPK=1; // 設置SPK初始值
- IRIN=1; // IR 輸入位設置為高電平
- while(1); // 無限循環
- }
- //--------------------------------------- 延時函數 ------------------------------------
- void delay(unsigned char x) //延時約x*0.1ms
- {
- 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 //外部中斷INT0函數
- {
- unsigned char j,k,n=0; //先定義變量,且n=0
- EX0=0; //暫時先關中斷
- delay(20); //延時0.10ms*20=2ms
- if(IRIN==1) //如果IRIN出現高電平,是干擾信號
- {
- EX0=1;
- return; //返回
- }
- while(!IRIN){delay(1);} //避開9ms前導低電平信
- for(j=0;j<4;j++) //一共有4組數據
- {
- for(k=0;k<8;k++) //每組數據有8位
- {
- while(IRIN){delay(1);} // 避開4.5ms高電平
- while(!IRIN){delay(1);}
- // 開始接收數據
- while(IRIN)
- {
- delay(1); //延時0.1ms
- n++; //每過0.1ms時n就加1
- if(n>=30) //如果超過30,放棄
- {
- EX0=1;
- return;} //返回
- }
-
- IRDATA[j]=IRDATA[j]>>1; //右移1位
- if(n>=8){IRDATA[j]=IRDATA[j]|0x80;}
- n=0; //n清0
- }
- }
- //檢查接收的數據和數據反碼是否相反
- if(IRDATA[2]!=~IRDATA[3]) //判斷數據碼和數據反碼是不是相反
- { //否則就放棄
- EX0=1;
- return;
- }
- //執行語句
- if(IRDATA[2]==0x01) RELAY=0; //接通繼電器
- fs_d ( );
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (51.18 KB, 下載次數: 91)
下載附件
2017-3-29 23:07 上傳
該系列源碼包含有很多非常經典,代碼風格十分規范,而且注釋詳細的單片機例程,還帶仿真,對于MCU學習特別是初學者是很有幫助的,全部源碼下載(共25個項目):http://www.zg4o1577.cn/bbs/dpj-79328-1.html
本例程下載(含proteus仿真工程文件與源碼):
6-3單片機紅外線遙控開關實驗.rar
(74.52 KB, 下載次數: 105)
2017-3-29 23:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|