紅外線(xiàn)接收控制器的制作
在生活中,我們常用到紅外線(xiàn)控制各類(lèi)電器,如彩電、空調、電風(fēng)扇等,為我們帶來(lái)較多的方便,但有時(shí)我們仍感到不方便。如看完電視后,用遙控器只能關(guān)掉電視主電源,電視仍處于待機狀態(tài),使用者還得走到電視跟前,按下電視電源開(kāi)關(guān)方能放心。若想看電視,還得動(dòng)身開(kāi)電視,顯得很麻煩,尤其是冬天躺在床上看電視,上上下下,深感不便。本文以利用紅外遙控器來(lái)遙控風(fēng)扇的制作方法為例(可任選一只紅外線(xiàn)遙控器,能調速,軟件稍作改變,可增加定時(shí)功能等),來(lái)介紹紅外線(xiàn)接收控制器的制作方法,如果制作電視交流電源的開(kāi)、關(guān)控制器,可與電視共用一只遙控器,制作也較簡(jiǎn)單些。
本文引用地址:http://dyxdggzs.com/article/161614.htm制作思路
紅外遙控發(fā)射器是利用紅外線(xiàn)作載體傳送信息的,發(fā)射周期不等的經(jīng)過(guò)調制后串行碼,該串行碼一般由引導碼、用戶(hù)識別碼、操作碼組成。經(jīng)紅外接收頭解碼后得到一串周期不等的矩形波,如示意圖1。
不同型號的遙控發(fā)射器的波形寬度不同,即周期T1、T2……不同,在不知手頭遙控發(fā)射器的波形周期的情況下,首先要制作一個(gè)檢測紅外線(xiàn)周期的工具。根據測得的周期規律來(lái)制作紅外線(xiàn)接收控制器。
制作方法
檢測紅外周期的器件制作,見(jiàn)圖2。
當紅外接收頭沒(méi)有接收到發(fā)射器發(fā)送來(lái)的紅外線(xiàn),其輸出端輸出高電平(約+5V)。當接收到紅外線(xiàn),輸出端電平變低,送到單片機AT89C2051的外部中斷1口即INT1,使其發(fā)生中斷而進(jìn)入中斷服務(wù):?jiǎn)?dòng)定時(shí)器1并開(kāi)始計數,相當于在圖1的A點(diǎn),1個(gè)周期后即C點(diǎn),單片機第二次中斷,關(guān)定時(shí)器1,記下周期T1(實(shí)際上只記下TH1的數值,TL1的值可以丟棄),然后清TH1、TL1,再啟動(dòng)定時(shí)器1重新計數,第二個(gè)周期完后,同樣會(huì )引起單片機發(fā)生中斷,再記下周期T2……,如此記下40-50個(gè)周期(一般紅外編碼為4字節,即32BIT,之前還有引導碼,又因接收到的紅外數據不一定是從引導碼開(kāi)始,要分析一次完整的串行碼,應盡可能多記下紅外矩形波周期數),接收完后,通過(guò)按輕觸開(kāi)關(guān)將各記下的各周期的TH1在數碼管顯示出來(lái)以作分析(每按一次輕觸開(kāi)關(guān),顯示下一個(gè)周期數)。
編程方法
在main()中開(kāi)中斷,啟動(dòng)定時(shí)器1,即EA=1; EX1=1; IT1=1; TR1=1;
在外部中斷1的服務(wù)程序中編寫(xiě)如下語(yǔ)名:
#define CNT 50//預測50個(gè)紅外線(xiàn)周期
DATA Byte value_h[CNT];//記錄周期的變量(數組)
DATA Byte count=0;//接收到的周期數
void int1(void) interrupt 2
{
if(TH1==TL1TL1==0) //判斷是否是第一次接收到紅外數據
{
TR1=1;
} else{
TR1=0; value_h[count]=TH1; TH1=TL1=0; TR1=1; count++;
if(count==CNT)
{
EX1=0; count=0;
}
}
}
假設接收到的TH的數值為:
30,50, 04,08,08,08, 04,04,04,04, 04,08,08,08, 04,04,04,04, 08,04,04,08, 04,04,04,04,04, 04,08,08,04, 08,08,08,08,3f,50----
稍作分析可知,表示高低電平的有效數為:04,08。若將04定作低電平,08定作高電平,舍棄其他數據,得到4字節數據即:01110000,01110000 ,10010000,01101111。轉為十六進(jìn)制后得:70h,70h,90h,6fh,至此得到遙控發(fā)射器剛才按下的鍵值碼,用同樣的方法可以測得其他鍵鍵值碼。假設有:
70h,70h,0x90,0x6f, //0鍵
70h,70h, 0x00,0xff, //1鍵
……
70h,70h, 0xd0,0x2f //power 鍵
根據以上數據分析得,每鍵碼為4字節,前2字節固定不變,為用戶(hù)識別碼,后2字節均不同,是操作碼。將遙控器上的各鍵鍵值碼測出后,根據這些數據可以根據制作需要進(jìn)行編程了。因鍵值碼為4字節太長(cháng),不利于編程,需要將各鍵鍵值轉為相對應的1字節的數據,如:70h,70h,0x90,0x6f,對應于0 ,70h,70h, 0x00,0xff對應于1……
轉換方法:
建立一個(gè)數組,將上述測得的各鍵碼按順序放入數組中(去掉用戶(hù)識別碼)
code Byte arr[][2]=
{
0x90,0x6f, //0,盡可能按鍵0、鍵1……的先后順序放,以符合習慣
0x00,0xff, //1
……
0x10,0xef, //9
0xd0,0x2f //power 13
};
在接收紅外線(xiàn)的外部中斷1函數中編寫(xiě)如下的鍵碼轉換語(yǔ)句:
DATA Byte arrtmp[4];
DATA Byte Keytmp; //轉換后的鍵值寄存變量
DATA Byte Keyval=NOKEY;
bit KeyOk;// 鍵值轉換完成與否的標志
bit d_Ok;//接收到一個(gè)完整的鍵碼標志
void Ex_int(void) interrupt 2
{
Byte i;
Byte (*p)[2];
……
if(d_Ok) //若接收到完整的鍵碼
{
d_Ok=0; //清除
if(arrtmp[0]==0x70arrtmp[1]
==0x70){ //鍵碼轉換
for(p=arr,i=0;i14;i++,p++)
{ if(arrtmp[2]==*(*p+0)arrtmp[3]
==*(*p+1))
{ Keytmp=i; KeyOk=1; //鍵值
轉換成功標志
break;
} else {Keytmp=NOKEY; } //未
接收到完整的鍵值
}
}else { Keytmp=NOKEY; }
}
}
經(jīng)過(guò)轉換后的Keytmp為0、1、2……的整數,然后再編寫(xiě)主函數、調速函數(參源程序),來(lái)進(jìn)行電風(fēng)扇調速。
有關(guān)電路的一些解釋?zhuān)簡(jiǎn)纹瑱CU1(AT89C2051)P37腳輸出高低電平通過(guò)R13控制光耦可控硅MOC3041(參數可在《電子制作》網(wǎng)站查找)通斷,通過(guò)控制其通斷時(shí)間比來(lái)達到電風(fēng)扇調速。
評論