紅外遙控器的發(fā)送裝置和接收裝置以及關于載波等一些原理大家可參看《手把手教你學51單片機》文檔第16章知識內(nèi)容,這里筆者只簡單說明如何運用該模塊并講解代碼的實現(xiàn)。
1.接收裝置
HS0038這個元器件是用來接收紅外遙控器發(fā)送來的信號做處理的,我們知道紅外遙控器有21個按鍵,按下不同的按鍵,HS0038的信號引腳就會產(chǎn)生不同的時序,我們解析這些時序就可以判斷按下的是什么按鍵。
比如我們用紅外遙控器對準開發(fā)板上的接收裝置HS0038,按下左上角的按鍵,那么HS0038的信號引腳就會產(chǎn)生一系列的變化如下:
首先是引導碼,也就是一開始HS0038信號引腳會拉低信號線9ms左右的時間,然后是4.5ms的高電平時間,這段時序叫做發(fā)送端的引導碼。
接著HS0038信號引腳會接收到用戶碼,只要信號線被拉低560us之后又拉高560us的時間,那么我們就認為這段時序是這種字節(jié)的一位,為0。
如果信號線被拉低560us之后又拉高1.68ms的時間,那么這段時序就是代表1。
比如信號線的時序如下
這樣我們就知道接收到的字節(jié)為0x0C。
0x0C是某個按鍵所發(fā)送的字節(jié),我們要知道按鍵的發(fā)送有5個階段,分別為:引導碼、用戶碼、用戶反碼、按鍵數(shù)據(jù)碼、按鍵數(shù)據(jù)反碼。
引導碼已經(jīng)說明過它的時序。
然后是用戶碼,用戶碼一直是0x00,也就是HS0038信號引腳是如下所示
接著用戶反碼就是0xFF。
按鍵數(shù)據(jù)碼如果是0x0C,那么按鍵數(shù)據(jù)反碼就是0xF3。
0x0C:00001100
0xF3:11110011
2.代碼的實現(xiàn)原理
在第八章第11講我們已經(jīng)學過輸入捕獲,那么解析紅外遙控就是使用這種方式,看到宋老師的例程lesson16_1里面的函數(shù)“void EXINT1_ISR() interrupt 2”。
在main.c中“InitInfrared();”就是為輸入捕獲做好設置,只要信號引腳被拉低就會進入外部中斷函數(shù)。
當我們在遙控器上按下某個按鍵時,信號引腳首先接收到的是引導碼,也就是9ms的低電平+4.5ms的高電平,由于一開始接收到低電平所以就會進入“void EXINT1_ISR() interrupt 2”函數(shù),函數(shù)里就是一關關的判斷是否一開始接收到9ms低電平,如果是,那么又接著判斷后面是不是產(chǎn)生4.5ms左右的高電平,如果是,接著就是進行判斷后面的用戶碼、用戶反碼、按鍵數(shù)據(jù)碼、按鍵數(shù)據(jù)反碼的字節(jié),并存入全局變量的數(shù)組ircode[4]中。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程