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