紅外線遙控是目前使用最廣泛的一種通信和遙控手段,。工業(yè)設(shè)備中,,在高壓、輻射,、有毒氣體,、粉塵等環(huán)境下,采用紅外線遙控不僅完全可靠而且能有效地隔離電氣干擾,。
1.紅外遙控系統(tǒng)
通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,,使用編/解碼專用集成電路芯片來進(jìn)行控制操作。發(fā)射部分包括鍵盤矩陣,、編碼調(diào)制、LED紅外發(fā)射器,;接收部分包括光,、電轉(zhuǎn)換放大器、解調(diào),、解碼部分電路,。
2.遙控發(fā)射器及其編碼
下面以日本NEC的uPD6121G組成發(fā)射電路為例說明編碼原理。當(dāng)發(fā)射器按鍵按下后,,有遙控碼發(fā)出,,所按的鍵不同遙控編碼也不同。這種遙控碼具有以下特征:
采用脈寬調(diào)制的串行碼,,以脈寬為0.565ms,、間隔0.56ms、周期為1.125ms的組合表示二進(jìn)制的“0”,;以脈寬為0.565ms,、間隔1.685ms,、周期為2.25ms的組合表示二進(jìn)制的“1”,其”0”,、“1”定義波形如圖2所示,。
上述“0”和“1”組成的32位二進(jìn)制碼經(jīng)38kt_{z的載頻進(jìn)行二次調(diào)制以提高發(fā)射效率,達(dá)到降低電源功耗的目的,。然后再通過紅外發(fā)射二極管產(chǎn)生紅外線向空間發(fā)射,,如圖3所示為最終發(fā)射出去的紅外信號波形。
uPD6121G產(chǎn)生的遙控編碼是連續(xù)的32位二進(jìn)制碼組,,其中前16位為用戶識別碼,,能區(qū)別不同的電器設(shè)備,防止不同機(jī)種遙控碼互相干擾,。該芯片的用戶識別碼固定為十六進(jìn)制0仆1.,;后16位為8位操作碼(功能碼)及其反碼。UPD6121G最多額128種不同組合的編碼,。遙控器在按鍵按下后,,周期性地發(fā)出同一種32位二進(jìn)制碼,周期約為108ms,。一組碼本身的持續(xù)時間隨它包含的二進(jìn)制“0”和“1”的個數(shù)不同而不同,,大約在45~63ms之間,圖4為發(fā)射波形圖,。
當(dāng)一個鍵按下超過36ms,,振蕩器使芯片激活,將發(fā)射一組108ms的編碼脈沖,,這108ms發(fā)射代碼由一個起始碼(9ms),,一個結(jié)果碼(4.5ms),低8位地址碼(9ms~18ms),,高8位地址碼(9ms~18ms),。8位數(shù)據(jù)碼(9ms~18ms)和這8位數(shù)據(jù)的反碼(9ms~18ms)組成。如果鍵按下超過108ms仍未松開,,接下來發(fā)射的代碼(連發(fā)代碼)將僅由起始碼(9ms)和結(jié)束碼(2.5ms)組成,。
3.接收頭及解碼
一體化紅外線接收頭是一種集紅外線接收和放大于一體,不需要任何外接元件,,就能完成從紅外線接收到輸出與TTL電平信號兼容的所有工作,,而體積較小,很多家電中都采用此類紅外接收頭,,它適合于各種紅外線遙控和紅外線數(shù)據(jù)傳輸,,如圖1左下角所示為增強(qiáng)型51實(shí)驗(yàn)板上的一體化紅外線接收頭。
下面我們就來一起看一下增強(qiáng)型51實(shí)驗(yàn)板是如何來解uPD6121紅外線編碼及如何使用紅外線來進(jìn)行各式各樣的控制,。
學(xué)習(xí)了紅外發(fā)射原理后,,可以想到解碼的關(guān)鍵是如何識別“0”和“1”,,從位的定義我們可以發(fā)現(xiàn)”0”、“1”均以0.56ms的低電平開始,,不同的是高電平的寬度不同,,“0”為0.56ms,“1”為1.68ms,,所以必須根據(jù)高電平的寬度區(qū)別“0”和“1”,。如果從0.56ms低電平過后,開始延時,,0.56ms以后,,若讀到的電平為低,說明該位為”0”,,反之則為“1”,,為了可靠起見,延時必須比0.56ms長些,,但又不能超過1.12ms,,否則如果該位為”0”,讀到的已是下一位的高電平,,因此?。?.12ms+0.56ms)/2=0.84ms最為可靠,一般取0.84ms左右均可,。同時,,我們還應(yīng)注意的是,根據(jù)碼的格式,,應(yīng)該等待9ms的起始碼和4.5ms的結(jié)果碼完成后才能讀碼,。
學(xué)習(xí)板上的一體化紅外接收頭一共有3個腳,分別是“地”,、“電源”,、“數(shù)據(jù)”,其“數(shù)據(jù)”腳與51單片機(jī)的“INTO”腳,,整個過程可以分成兩步,,第一步是讀取并判斷引導(dǎo)碼是否正確,,如果不是則直接返回并初始化檢測參數(shù),;第二步是連續(xù)4次,按照每次8bit讀取4個字節(jié)的后續(xù)數(shù)據(jù),,其中,,檢測過程里對”0”和“1”的判斷必須是在開啟計時之后,以減少因?yàn)槌绦驁?zhí)行而導(dǎo)致的測量時間長度上誤差,。
解碼過程關(guān)鍵是使用單片機(jī)的定時器,,我們可以用引導(dǎo)碼的下降沿來觸發(fā)單片機(jī)的定時器開始計時處理,,這樣就可以獲得電平的時間長度了,一般的遙控器編碼在長按按鍵的時候,,會連續(xù)發(fā)數(shù)據(jù),,可能是同樣的數(shù)據(jù),也有可能是個特定的所謂的重復(fù)幀,,但大致上15ms之內(nèi)沒有信號收到就表示當(dāng)前的數(shù)據(jù)幀已經(jīng)接收完畢,。
解碼部分程序代碼如下:
unsignedcharuPD6121_read_code_8(void){unsignedchartemp=0;unsignedchari,;for(i=0,;<8;i++){temp=temp》1:
while(ir_receive==0),;//等待高電平測試結(jié)束TR1=0,;//高電平測試結(jié)束,停止計時high_level_time=TH1*256+TL1,;//保存高電平的數(shù)據(jù)TH1=0,;TL1=0;TR1=1,;//啟動對低電平的測試while(ir_receive==1){if(TH1>0x4e){decode_error=1,;return0;}//超時出錯,,返回}
TR1=0,;//低電平測試結(jié)束Iow_level_time=TH1*256+TL1;//保存低電平的數(shù)據(jù)TH1=0,;TL1=0,;TR1=1;//如果電平長度不在合理的范圍內(nèi),,則認(rèn)為出錯if((high_level_time<400)II(high_level_time>700)II(Iow_level_time<400)II(Iow_level—time>1900)){decode_error=1,;returnO;}
if((Iow_level_time>400)&&(Iow_level_time<700))temp=temp&0x7f,;if((Iow_level_time>1400)&&(Iow_level_time<1900))temp=temp1ox80,;} returntemp;}nsignedcharuPD6121_decode(void)//解碼出錯返回1,,對則返回OTR1=1://開始測量引導(dǎo)碼(或重復(fù)碼)的高電平寬度while(ir_receive==0),;//等待電平變高,不需要超時監(jiān)測TR1=0,;//高電平(對發(fā)射電路而言)測試結(jié)束high_level_time=TH1*256+TL1://保存高電平的數(shù)據(jù)//————————————————————TH1=0,;TL1=0;TR1=1,;//啟動對低電平的測試while(ir_receive==1)//在對高電平進(jìn)行查詢時,,計超時,。大于20ms出錯{if(TH1>0x4e)return1://測試超時后直接初始化相關(guān)變量,開始下次測試}
TR1=0://低電平(對發(fā)射電路而言)測試結(jié)束Iow_level_time=TH1*256+TL1:
//保存低電平的數(shù)據(jù)TH1=0,;TL1=0,;TR1=1;//為增加計時的準(zhǔn)確性,,數(shù)據(jù)的處理都是在計時過程里//判斷引導(dǎo)碼(或重復(fù)碼)是否正確,,如果不正確,則設(shè)置出錯標(biāo)志位,,并退出中斷程序if((high_level_time<8500)II(high_level_time>9500)II(Iow_level_time<1000)II(Iow_level_time>5000)){return1://因是引導(dǎo)碼出錯,,所以直接初始化后重新開始測試}
//——————————————————//對是引導(dǎo)碼還是重復(fù)碼進(jìn)行判斷。如果是重復(fù)碼,,就跳過后面數(shù)據(jù)的讀取if((Iow_level—time>1000)&&(Iow_level_time<3500))repeat_code_detected=1:
if((Iow_level_time>4000)&&(Iow_level_time<5000))Ioad_code_detected=1,;if(repeat_code_detected==1)return1;//直接結(jié)束,,temp1=uPD6121_read_code_8(),;//讀后面的系統(tǒng)、按健等數(shù)據(jù),,temp2=uPD6121_read_code_8(),;teMP3=uPD6121_read_code_8();temp4=uPD6121_read_code_8(),;TR1=0:
if(decode_error==1)return1://無論是哪部分解碼出錯,,都是重新開始if((temp1!=Ntemp2)II(temp3!
=~temp4)){return1;}
sys_code=temp1:
key_code=temp3,;data_available=1,;return0:
如圖5所示,是我們完成紅外線實(shí)驗(yàn)所必需的設(shè)備,,準(zhǔn)備好硬件設(shè)備后,,我們將紅外線解碼控制程序通過A51編程器燒入AT89S51單片機(jī)芯片,然后將芯片插到增強(qiáng)型51實(shí)驗(yàn)板上通電運(yùn)行即可,。
圖6為增強(qiáng)型51實(shí)驗(yàn)板做紅外解碼電路,,從而進(jìn)行數(shù)碼管顯示的實(shí)驗(yàn)電路板。
最后,,要提醒大家一下,,在做紅外實(shí)驗(yàn)需要注意的是:不同的紅外線遙控器編碼方式可能不同,你可能會發(fā)現(xiàn)有很多紅外線遙控器的外表幾乎都一樣,。
但對于同一電器設(shè)備卻有些能用,,有些不能用,,這就是因?yàn)檫b控器內(nèi)部使用了不同的編碼芯片的原因,,或許你會想到用家中的電視機(jī)或空調(diào)的遙控器來完成紅外線解碼的實(shí)驗(yàn),,但你必須得事先知道該遙控器的紅外線編碼芯片是什么類型的,否則就比較麻煩了,,而現(xiàn)在眾多紅外線遙控器廠商為了保護(hù)自己的知識產(chǎn)權(quán)已將編碼芯片打磨,,這對我們DIY愛好者來說就不太有利了。圖5中的紅外線遙控器為uPD6121紅外編碼芯片,。