跟我學(xué)51單片機(jī)(六):?jiǎn)纹瑱C(jī)外部中斷及紅外遙控器解碼
程序詳細(xì)說(shuō)明:
?。?)定時(shí)器中斷0 服務(wù)函數(shù),紅外接收頭解碼數(shù)據(jù)觸發(fā)外部中斷1 后,引發(fā)定時(shí)器中斷,從而進(jìn)行捕獲解碼。
?。?)解碼時(shí), 將載頻部分變?yōu)榈碗娖剑?即低電平實(shí)際為1, 高電平實(shí)際為0。
(3)設(shè)置定時(shí)器0 高八位初值,因?yàn)橐〞r(shí)間長(zhǎng)度為一個(gè)數(shù)據(jù)位周期。
?。?) 設(shè)置定時(shí)器0 低八位初值。經(jīng)過(guò)實(shí)測(cè),SAA3010 的位時(shí)間在1.655ms 左右。
?。?)將紅外數(shù)據(jù)放入最低位。
(6)紅外計(jì)數(shù)沒(méi)進(jìn)一次定時(shí)器中斷就加1。
(7)如果當(dāng)前是第1 次和第2 次進(jìn)入定時(shí)器中斷。
?。?)如果此時(shí)in 的值為0,即如果發(fā)現(xiàn)起始兩位不全是1 的情況。
?。?)關(guān)閉定時(shí)器0。
?。?0)重新打開(kāi)外部中斷進(jìn)行接收。即起始兩位必須都為1。
(11)退出返回。
?。?2)如果接收完起始位(2 位)和控制位(1 位)。
?。?3)IR_sign 置1,即將接收到的紅外系統(tǒng)碼放到IR_Data[1] 中。
?。?4)如果當(dāng)前計(jì)數(shù)達(dá)到第8 次,即接收完5 位系統(tǒng)碼。
?。?5)如果接收到的系統(tǒng)碼不為0,即要求系統(tǒng)碼全為0 才正確。
?。?6)則關(guān)閉定時(shí)器和重開(kāi)外部中斷并返回。
?。?7)IR_sign 置2,將接收到的紅外數(shù)據(jù)位放到IR_Data[2] 中。
(18)如果當(dāng)前計(jì)數(shù)達(dá)到第14 次,即接收完6 位數(shù)據(jù)碼。
?。?9)IR_sign 置3,表示數(shù)據(jù)碼接收成功。
?。?0)如果IR_sign 等于3,即表示如果接收完成。
?。?1)接收完成,關(guān)閉定時(shí)器0,不再捕獲。
?。?2)接收完成后跳轉(zhuǎn)到執(zhí)行IR_Success() 函數(shù),進(jìn)行顯示以及重新初始化等。
?。?3)返回。
?。?4)將數(shù)據(jù)左移一位, 以便將一下位數(shù)據(jù)并于最低位。
五、調(diào)試要點(diǎn)與實(shí)驗(yàn)現(xiàn)象
接好硬件,通過(guò)冷啟動(dòng)方式將程序所生成的。hex 文件下載到單片機(jī)運(yùn)行后,打開(kāi)串口調(diào)試助手軟件,設(shè)置好波特率9600,復(fù)位單片機(jī),然后按下SAA3010 遙控器上的相應(yīng)按鍵,可以觀察到在接收窗口有接收到的數(shù)據(jù)顯示見(jiàn)圖8,此外電路板上的串行通信指示燈也會(huì)閃爍,P0 口也會(huì)將所接到的數(shù)據(jù)顯示在LED 燈上。
值得注意的是,不同紅外遙控器的編碼格式不同,即便是同一型號(hào)的紅外遙控器,其發(fā)射出來(lái)的碼值也可能稍有微小的區(qū)別,例如筆者手里所用的SAA3010 紅外遙控器,其位時(shí)間實(shí)測(cè)在1.655ms 左右,而不是在標(biāo)稱的1.688ms,因此,有條件的讀者可以用示波器或者邏輯分析儀之類的儀表對(duì)遙控器發(fā)射出來(lái)的碼值進(jìn)行測(cè)量,從而相應(yīng)的修改所捕獲的時(shí)間,確保無(wú)誤。此外,紅外的穿透能力較弱,例如我們用手遮擋住遙控器的發(fā)射頭或者接收頭時(shí),此時(shí)難以收到數(shù)據(jù)或者引入干擾。
六、總結(jié)
本講介紹了51 單片機(jī)如何利用外部中斷觸發(fā)和內(nèi)部定時(shí)器捕獲的方式進(jìn)行紅外遙控器解碼,現(xiàn)簡(jiǎn)單總結(jié)如下:
要對(duì)紅外遙控器解碼,首先應(yīng)當(dāng)知道遙控器的編碼標(biāo)準(zhǔn),無(wú)論是本文中所介紹的NEC 標(biāo)準(zhǔn)和PHILIPS 標(biāo)準(zhǔn),還是其他編碼格式,因?yàn)椴涣私饩幋a格式,難以對(duì)編碼進(jìn)行判斷,從而造成解錯(cuò)碼。其次,由于晶振(如遙控器內(nèi)部和單片機(jī)晶振)本身的不穩(wěn)定性等,為保證解碼的準(zhǔn)確性,應(yīng)對(duì)每位碼長(zhǎng)時(shí)間經(jīng)行測(cè)量,如利用儀表或者使用單片機(jī)本身,從而得到準(zhǔn)備結(jié)果。下講將講述單片機(jī)驅(qū)動(dòng)字符型液晶1602 模塊的原理與實(shí)例,敬請(qǐng)期待。
評(píng)論