認(rèn)識(shí)C51外部中斷(INT0)
要對(duì)紅外遙控信號(hào)解碼那么就要使用C51外部中斷,并且要設(shè)置成為負(fù)跳變沿觸發(fā)方式.一般都會(huì)在主程序的開(kāi)始外初始化中斷(或?qū)⒊跏蓟袛喑绦驅(qū)懗珊瘮?shù),將這個(gè)函數(shù)放入主程序)如下:
本文引用地址:http://2s4d.com/article/201611/321165.htmvoid main(void)
{
.........//其它程序
..........
}
void INT0() interrupt 0
{
.......//紅外信號(hào)解碼程序
}
根據(jù)需要打開(kāi)外部中斷(EX0=1):
以上程序在開(kāi)始處便打開(kāi)了外部中斷.從理論上是完全正確的!但在現(xiàn)實(shí)情況中要看具體情況來(lái)打開(kāi)外部中斷!如果剛進(jìn)入程序要處理其它事情暫時(shí)不能處理紅外信號(hào),那么EX0=1就不能寫(xiě)在主程序的開(kāi)始處.而要寫(xiě)在適當(dāng)?shù)奈恢?否則開(kāi)機(jī)有紅外信號(hào)就會(huì)馬上進(jìn)入紅外信號(hào)解碼程序.
關(guān)閉外部中斷(EX0=0):
一但有中斷信號(hào),單片機(jī)將很快對(duì)中斷產(chǎn)生響應(yīng)進(jìn)入中斷程序.中斷程序也就是紅外信號(hào)解碼程序.在中斷程序中一定不要忘記關(guān)閉中斷EX0=0!在按下遙控器的某個(gè)按鍵后,遙控器將一組一組的向外發(fā)送數(shù)據(jù).即便是以最快的速度按下并放開(kāi)按鍵,那么遙控已經(jīng)發(fā)送出多組數(shù)據(jù).單片機(jī)將多次解碼,主程序如果比較龐大解碼出來(lái)的數(shù)據(jù)還沒(méi)有來(lái)的急使用就被下一個(gè)數(shù)據(jù)覆蓋!關(guān)閉外部中斷后,能有效的避免干擾和分清當(dāng)前一組數(shù)據(jù)是否接收解碼完畢!進(jìn)入中斷程序就將外部中斷關(guān)閉,一組數(shù)據(jù)解碼結(jié)束并經(jīng)主程序采用后在開(kāi)啟外部中斷.這才是一個(gè)完整的過(guò)程!這一個(gè)完整的過(guò)程是在沒(méi)有干擾的情況下可正常完成.現(xiàn)實(shí)中干擾無(wú)時(shí)不在,一但無(wú)法正常解碼出數(shù)據(jù)那么主程序也不采用,那么外部中斷將不在打開(kāi).也就不在接受紅外信號(hào).這時(shí)在紅外解碼程序的最后加一判斷,如果出錯(cuò)就在解碼程序最后打開(kāi)外部中斷為下一次接受紅外信號(hào)做好準(zhǔn)備.
根據(jù)需要清空IE0(IE0=0):
關(guān)閉中斷后遙控器并沒(méi)有停止發(fā)送信號(hào),關(guān)閉中斷后的紅外信號(hào)將繼續(xù)使IE0置位.IE0的狀態(tài)根本不受EX0的控制.單片機(jī)執(zhí)行了IT1=1語(yǔ)句,只要外部中斷有負(fù)跳變沿IE0就會(huì)置位.如果我們只處理EX0=1(即中斷開(kāi)啟后的信號(hào))以后的信號(hào).那么在紅外信號(hào)解碼程序退出前要對(duì)IE0清零.如果不清零,只要打開(kāi)外部中斷將會(huì)再次進(jìn)入中斷.這一次進(jìn)入中斷輕則是浪費(fèi)時(shí)間,重則可能就會(huì)出錯(cuò)(進(jìn)入中斷后紅外線解碼采用查詢法時(shí)表現(xiàn)的很明顯).所以在EX0=1前面要加上一句IE0=0.
評(píng)論