在at89s52單片機(jī)中,只有兩個外部中斷請求輸入端int0和int1。而實(shí)際應(yīng)用系統(tǒng)中往往會出現(xiàn)兩個以上的外部中斷源,因此必須對外中斷源進(jìn)行擴(kuò)展。其方法主要有:用定時器/計數(shù)器t0、t1擴(kuò)展;采用中斷和查詢相結(jié)合的方法擴(kuò)展;用串行口的中斷擴(kuò)展;用優(yōu)先權(quán)編碼器擴(kuò)展等方法。這里重點(diǎn)介紹前兩種方法。
一、用定時器/計數(shù)器作為中斷源
at89s52單片機(jī)的兩個定時器/計數(shù)器t0、t1可工作在計數(shù)方式,計數(shù)初值一般設(shè)定為滿量程(即定時器的最大技術(shù)值),則它們的計數(shù)輸入端p3.4或p3.5引腳上發(fā)生負(fù)跳變時,t0或t1計數(shù)器就加l,產(chǎn)生溢出中斷。利用此特性,可以把p3.4、p3.5作為外部中斷請求輸入線,而計數(shù)器的溢出中斷作為外部中斷請求標(biāo)志。
設(shè)t0為方式2(自動裝入常數(shù))外部計數(shù)方式,時間常數(shù)為0ffh,允許中斷,cpu開放中斷。其初始化程序?yàn)椋?br>org 0000h ;跳到初始化程序
mov tmod, #06h ; t0為方式2,計數(shù)器方式工作
mov tl0, #0ffh ; 計數(shù)初值為滿量程
mov th0, #0ffh; 計數(shù)初值為滿量程
setb tr0; 置tr0為1,啟動t0
mov ie, #82h; 置中斷允許,ie中的ea位為1,et0位為1
當(dāng)接在p3.4引腳上的外部中斷請求輸入線發(fā)生負(fù)跳變時,tl0加1溢出,tf0被置1,向cpu發(fā)出中斷請求。同時th0的內(nèi)容自動送入tl0,使tl0恢復(fù)初始值0ffh。這樣,p3.4引腳上的每次負(fù)跳變都將tf0置位1,向cpu發(fā)出中斷請求,cpu響應(yīng)中斷請求時,程序計數(shù)器pc轉(zhuǎn)到000bh執(zhí)行外部中斷服務(wù)程序,此時p3.4相當(dāng)于邊沿觸發(fā)的外中斷源輸入線。同理,也可以把p3.5引腳作類似的處理。
二、采用中斷與查詢相結(jié)合的方法
中斷與查詢相結(jié)合的方法是把系統(tǒng)中多個外部中斷源按它們的重要程度進(jìn)行排序,把其中最高級別的中斷源接到mcs-51的一個外部中斷源輸入端(例如接到腳),其余的中斷源用線“或”的方法連接到另一個外部中斷輸入端(),并同時接到一個i/o口,如圖4-5中所示接到p1口。中斷請求由硬件電路產(chǎn)生,而中斷源的識別由程序查詢來處理,查詢順序由中斷源的優(yōu)先級決定。圖為五個外部中斷源的連接電路,其中設(shè)備1~4經(jīng)oc門與連接,并連接到p1.0~p1.3,均采用電平觸發(fā)方式。設(shè)備0為最高級中斷源,單獨(dú)作為外部中斷0的輸入信號。這種辦法擴(kuò)展比較簡單,但是當(dāng)外部中斷擴(kuò)展的數(shù)量較多時,查詢的時間比較長,導(dǎo)致程序的執(zhí)行效率較低。
圖 多個外部中斷源系統(tǒng)設(shè)計
外部中斷1的中斷服務(wù)程序如下:
org 1000h
ljmp intr
intr: pushpsw; 保護(hù)現(xiàn)場
pusha
jnbp1.0, ir1; p1.0引腳為0,轉(zhuǎn)至設(shè)備1中斷服務(wù)程序
jnbp1.1, ir2; p1.1引腳為0,轉(zhuǎn)至設(shè)備2中斷服務(wù)程序
jnbp1.2, ir3; p1.2引腳為0,轉(zhuǎn)至設(shè)備3中斷服務(wù)程序
jnbp1.3, ir4; p1.3引腳為0,轉(zhuǎn)至設(shè)備4中斷服務(wù)程序
intr1:popa; 恢復(fù)現(xiàn)場
poppsw
reti; 中斷返回
ir1:……; 設(shè)備1中斷服務(wù)程序入口
ajmpintr1; 跳轉(zhuǎn)到intr1所指示的指令
ir2:……; 設(shè)備2中斷服務(wù)程序入口
ajmpintr1; 跳轉(zhuǎn)到intr1
ir3:……; 設(shè)備3中斷服務(wù)程序入口
ajmpintr1; 跳轉(zhuǎn)到intr1
ir4:……; 設(shè)備4中斷服務(wù)程序入口
ajmpintr1; 跳轉(zhuǎn)到intr1