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