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