單片機中斷技術概述
在任何一款事件驅動型的CPU里面都應該會有中斷系統,因為中斷就是為響應某種事件而存在的。中斷的靈活應用不僅能夠實現想要的功能,而且合理的中斷安排可以提高事件執行的效率,因此中斷在單片機應用中的地位是非常重要的。
單片機中斷(Interrupt)是硬件驅動事件,它使得CPU暫停當前的主程序,轉而去執行一個中斷服務子程序。為了更形象地理解中斷,下面以學生上自習時接電話為例闡述一下中斷的概念。
單片機的中斷系統有5個中斷源、2個中斷優先級,可實現兩級中斷服務程序嵌套。
如果單片機沒有中斷系統,單片機的大量時間可能會浪費在查詢是否有服務請求發生的定時査詢操作上。采用中斷技術完全消除了單片機在査詢方式中的等待現象,大大地提高了單片機的工作效率和實時性。
單片機中斷系統結構及中斷控制
中斷系統結構圖如圖5-2所示。

由圖5-2可見,MCS-51中斷系統共有5個中斷請求源:
- INT0——外部中斷請求0,中斷請求信號由INT0引腳輸入。
- 定時/計數器T0計數溢出發出的中斷請求。
- INT1——外部中斷請求1,中斷請求信號由INT1引腳輸入。
- 定時/計數器T1計數溢出發出的中斷請求。
- 串行口中斷請求。
中斷優先級從高到底排列。
單片機如何知道有中斷請求信號?是否能夠響應該中斷?若5個中斷源請求信號同時到來,單片機如何響應?這些問題都可以由中斷寄存器來解決。
單片機中斷寄存器有中斷標志寄存器TCON和SCON、中斷使能寄存器IE和中斷優先級寄存器IP,這些寄存器均為8位。
中斷標志寄存器
5個中斷請求源的中斷請求標志分別由TCON和SCON的相應位鎖存,單片機通過這些中斷標志位的狀態便能知道具體是哪個中斷源正在申請中斷。
TCON寄存器
TCON寄存器為定時/計數器的控制寄存器,字節地址為88H,可位尋址。特殊功能寄存器TCON的格式如圖5-3所示。

TCON各標志位功能如下。
- TF1——定時/計數器T1的溢出中斷請求標志位。當T1計數產生溢出時,由硬件使TF1置“1”,向CPU申請中斷。CPU響應TF1中斷時,TF1標志由硬件自動清“0”,TF1也可由軟件清“0”。
- TF0——定時/計數器T0的溢出中斷請求標志位,功能與TF1類似。
- IE1——外部中斷請求1的中斷請求標志位。
- IE0——外部中斷請求0的中斷請求標志位,功能與IE1類似。
- IT1——選擇外部中斷請求1為跳沿觸發還是電平觸發。IT1=0,電平觸發方式,引腳上低電平有效,並把IE1置“1”。轉向中斷服務程序時,由硬件自動把IE1清“0”。IT1=1,跳沿觸發方式,加到引腳上的外部中斷請求輸入信號電平從高到低的負跳變有效,並把IE1置“1”。轉向中斷服務程序時,由硬件自動把IE1清“0”。
- IT0——選擇外部中斷請求0為跳沿觸發方式還是電平觸發方式,其意義與IT1類似。
MCS-51復位后,TCON被清“0”,5個中斷源的中斷請求標志均為0。TRI (D6位)、TRO (D4位)這兩位與中斷系統無關。
SCON寄存器
SCON寄存器為串行口控制寄存器,字節地址為98H,可位尋址。
低二位鎖存串行口的發送中斷和接收中斷的中斷請求標志TI和RI,格式如圖5-4所示。
各標志位的功能如下。
- TI——串行口的發送中斷請求標志位。每發送完一幀串行數據后,TI自動置“1”。TI標志必須由軟件清“0”。

- RI——串行口接收中斷請求標志位。串行口接收完一個串行數據幀,硬件自動使RI中斷請求標志置“1”。必須在中斷服務程序中用指令對RI清“0”。
中斷使能寄存器IE
MCS-51對各中斷源的使能或屏蔽是由中斷使能寄存器IE控制的。IE字節地址為A8H,可位尋址,格式如圖5-5所示。

IE對中斷的使能和屏蔽實現兩級控制。一個總的使能中斷控制位EA (IE,7位),EA=0時,所有的中斷請求被屏蔽;EA=1時,使能中斷,但5個中斷源的中斷請求是否允許,還要由IE中的低5位所對應的5個中斷請求允許控制位的狀態來決定(見圖5-5)。
IE中各位功能如表5-1所示。


MCS-51復位以后,IE被清“0”,所有中斷請求被禁止。IE中與各個中斷源相應的位可用指令置“1"或清“0”。若使某一個中斷源被允許中斷,除了 IE相應的位被置“1”外,還必須使EA位置“1”。改變IE的內容,可由位操作指令來實現(即SETB bit; CLR bit),也可用字節操作指令實現。

中斷優先級寄存器IP
MCS-51的中斷請求源有兩個中斷優先級,由軟件可設置為高優先級中斷或低優先級中斷,可實現兩級中斷嵌套。
當幾個中斷同時向CPU發出中斷請求時,CPU會根據這些中斷的優先級來安排處理的順序,優先級高的先處理,優先級低的后處理。單片機的CPU正在處理一個低優先級的中斷,此時有一個高優先級的中斷信號到來,CPU會暫停處理該低優先級中斷,轉而去處理高優先級的中斷,處理完高優先級中斷后返回繼續處理低優先級中斷。
也就是說,MCS-51正在執行低優先級中斷的服務程序時,可被高優先級中斷請求所中斷,待高優先級中斷處理完畢后,再返回低優先級中斷服務程序。兩級中斷嵌套的過程如圖5-6所示。各中斷源的中斷優先級關系,可歸納為兩條基本規則:
- 低優先級可被高優先級中斷,高優先級不能被低優先級中斷。如果某一中斷源被設置為高優先級中斷,則不能被任何其他的中斷源的中斷請求所中斷。

- 任何一種中斷一旦得到響應,不會再被它的同級中斷源所中斷。

中斷優先級寄存器IP,其字節地址為B8H,可位尋址。只要用程序改變其內容,即可進行各中斷源中斷優先級的設置。IP寄存器的格式如圖5-7所示。

中斷優先級控制寄存器IP用位操作指令或字節操作指令可更新IP的內容,以改變中斷優先級。MCS-51復位以后,IP的內容為0,各個中斷源均為低優先級中斷。在同時收到幾個同優先級的中斷請求時,哪一個中斷請求能優先得到響應,取決於內部的査詢順序。其査詢順序見表5-3。

由此可見,各中斷源在同一個優先級的條件下,外部中斷0的中斷優先權最高,串行口中斷優先權最低。

中斷響應及中斷處理過程
中斷響應
中斷請求被響應,必須滿足以下必要條件。
- 總中斷允許開關接通,即IE寄存器中的中斷總允許位EA=1。
- 該中斷源發出中斷請求,即對應的中斷請求標志為“1”。
- 該中斷源的中斷允許位置1,即該中斷被允許。
- 無同級或更高級別的中斷正在被服務。
當CPU査詢到有效的中斷請求時,在滿足上述條件的情況下,緊接着就響應該中斷。
中斷響應的過程:首先由硬件自動生成一條長調用指令“LCALL addrl6"。addrl6就是程序存儲區中相應的中斷入口地址。
例如:對於外部中斷0的響應,硬件自動生成的長調用指令為LCALL 0003H
然后將程序計數器PC的內容壓入堆棧以保護斷點,再將中斷入口地址裝入PC,使程序轉向響應中斷請求的中斷入口地址。
各中斷源服務程序的入口地址如表5-4所示。

兩個中斷入口間只相隔8B,難以安放一個完整的中斷服務程序。因此,通常在中斷入口地址處放置一條無條件轉移指令,使程序執行轉向中斷服務程序入口。
中斷處理
中斷響應是有條件的,當遇到下列三種情況之一時,中斷響應被封鎖。
- CPU正在處理同級或更高級的中斷。
- 所査詢的機器周期不是當前正在執行指令的最后一個機器周期。只有在當前指令執行完畢后,才能進行中斷響應,以確保當前指令執行的完整性。
- 正在執行的指令是RETI或是訪問IE或IP的指令。因為按照MCS-51中斷系統的規定,在執行完這些指令后,需要再執行完一條指令,才能響應新的中斷請求。
如果存在上述三種情況之一,CPU將丟棄中斷査詢結果,不能對中斷進行響應。
如果中斷標志有效時沒有響應,中斷之后將不再保持該標志,每次查詢周期都會更新中斷標志。
當中斷服務程序執行到RETI指令時通知處理器中斷程序已執行完畢,然后從堆棧彈出兩個字節(程序中斷處的地址)重新裝入PC,繼續執行被中斷的程序。
中斷返回
中斷返回指令:RETI = RET指令+通知CPU中斷服務已結束。
注意:RET指令也以返回被中斷的程序,但這樣會使中斷系統認為中斷仍在執行,后面的中斷再也無法響應。
中斷服務程序
中斷系統的運行必須與中斷服務子程序配合才能正確使用。
設計中斷服務子程序需要首先明確以下幾個問題。
中斷服務子程序設計的任務
任務有下列4條。
- 設置中斷允許控制寄存器IE,允許相應的中斷請求源中斷。
- 設置中斷優先級寄存器IP,確定所使用的中斷源的優先級。
- 若是外部中斷源,還要設置中斷請求的觸發方式,決定釆用電平觸發方式還是跳沿觸發方式。
- 編寫中斷服務子程序,處理中斷請求。
前3條一般放在主程序的初始化程序段中。
采用中斷時的主程序結構
程序必須先從主程序起始地址0000H執行。所以,在0000H起始地址的幾個字節中,用無條件轉移指令,跳向主程序。
另外,各中斷入口地址之間依次相差8B,中斷服務子程序稍長就超過8B,這樣中斷服務子程序就占用了其他的中斷入口地址,影響其他中斷源的中斷處理。為此,一般在進入中斷后,用一條無條件轉移指令,把中斷服務子程序跳轉到遠離其他中斷入口的入口地址處。
常用的主程序結構如下。

ORG:指定一個地址,后面的程序或數據從這個地址值開始分配。
LJMP:無條件轉移指令。
注意:如果有多個中斷源,就有多個“ORG X1X2X3X4H”的入口地址,多個“中斷入口地址”必須依次由小到大排列,否則會發生地址重疊情況。主程序MAIN的起始地址Y1Y2Y3Y4H根據具體情況來安排,但必須大於串口的中斷入口地址0023H。
中斷服務子程序的流程
中斷服務子程序的基本流程如圖5-8所小。下面對有關中斷服務子程序執行過程中的一些問題進行說明。
-
現場保護和現場恢復
現場是指單片機中某些寄存器和存儲器單元中的數據或狀態。為使中斷服務子程序的執行不破壞這些數據或狀態,要送入堆棧保存起來,這就是現場保護。現場保護一定要位於中斷處理程序的前面。中斷處理結束后,在返回主程序前,則需要把保存的現場內容從堆棧中彈出恢復原有內容,這就是現場恢復。現場恢復一定要位於中斷處理的后面。MCS-51 的堆棧操作指令:“PUSH direct"和 “POP direct”,是供現場保護和現場恢復使用的。要保護哪些內容,應根據具體情況來定。
-
關中斷和開中斷
現場保護前和現場恢復前關中斷,是為防止此時有高一級的中斷進入,避免現場被破壞。在現場保護和現場恢復之后的開中斷是為下一次的中斷做好准備,也為了允許有更高級的中斷進入。這樣,中斷處理可以被打斷,但原來的現場保護和現場恢復不允許更改,除了現場保護和現場恢復的片刻外,仍然保持着中斷嵌套的功能。但有時候,一個重要的中斷必須執行完畢,不允許被其他的中斷嵌套。可在現場保護前先關閉總中斷開關位,待中斷處理完畢后再開總中斷開關位。 -
中斷處理
應用設計者根據任務的具體要求,來編寫中斷處理部分的程序。 -
中斷返回
中斷服務子程序最后一條指令必須是返回指令RETLI。CPU執行完這條指令后,把響應中斷時所置1的不可尋址的優先級狀態觸發器清0,然后從堆棧中彈出棧頂上的兩個字節的斷點地址送到程序計數器PC,彈出的第一個字節送入PCH,彈出的第二個字節送入PCL,從斷點處重新執行主程序。
PC,程序計數器,16位數。
PCL,是其低八位;PCH,是其高八位。

上述程序幾點說明:
- 本例的現場保護假設僅僅涉及PSW和A的內容,如有其他需要保護的內容,只需在相應位置再加幾條PUSH和POP指令即可。注意,堆棧的操作是先進后岀。
- “中斷處理程序段”,設計者應根據中斷任務的具體要求,來編寫中斷處理程序。
- 如果不允許被其他的中斷所中斷,可將“中斷處理程序段”前后的“SETB EA”和“CLR EA”兩條指令去掉。
- 最后一條指令必須是返回指令RETL不可缺少,CPU執行完這條指令后,返回斷點處,重新執行被中斷的主程序。
多外部中斷源系統設計
實際的應用中,兩個外部中斷請求源往往不夠用,需對外部中斷源進行擴充,如圖5-9所示。系統有6個外部中斷請求源INTRO〜INTR5,高電平有效。
最高級的請求源INTR0直接接到MCS-51的一個外部中斷請求輸入端INT0,其余5個請求源INTR1〜INTR5通過各自的OC門(集電極開路門)連到MCS-51的另一個外中斷源輸入端INT1,同時還連到P1口的P1.4〜P1.0腳,供MCS-51查詢。電路如圖5-9所示,除了 INTR0優先權級別最高外,其余4個外部中斷源的中斷優先權取決於查詢順序。

假設圖5-9中的5個外設中有一個外設提出高電平有效的中斷請求信號,則中斷請求通過5個集電極開路OC門的輸出公共點,即INT1腳的電平就會變低。究竟是哪個外設提出的請求,要通過程序査詢P1.4〜P1.0引腳上的邏輯電平來確定。
本例假設某一時刻只能有一個外設提出中斷請求,並設INTR1〜INTR5這5個中斷請求源的高電平可由相應的中斷服務子程序清“0”,則中斷服務子程序如下。


標志寄存器PSW(程序狀態字寄存器PSW)
標志寄存器PSW是一個16為的寄存器。它反映了CPU運算的狀態特征並且存放某些控制標志。8086使用了16位中的9位,包括6個狀態標志位和3個控制標志位。
CF(進位標志位):當執行一個加法(減法)運算時,最高位產生進位(或借位)時,CF為1,否則為0。
ZF零標志位:若當前的運算結果為零,則ZF為1,否則為0。
SF符號標志位:該標志位與運算結果的最高位相同。即運算結果為負,則SF為1,否則為0。
OF溢出標志位:若運算結果超出機器能夠表示的范圍稱為溢出,此時OF為1,否則為0。判斷是否溢出的方法是:進行二進制運算時,最高位的進位值與次高位的進位值進行異或運算,若運算結果為1則表示溢出OF=1,否則OF=0PF奇偶標志:當運算結果的最低16位中含1的個數為偶數則PF=1否則PF=0
AF輔助進位標志:一個加法(減法)運算結果的低4位向高4位有進位(或借位)時則AF=1否則AF=0另外還有三個控制標志位用來控制CPU的操作,可以由程序進行置位和復位。
TF跟蹤標志:該標志位為方面程序調試而設置。若TF=1,8086/8088CPU處於單步工作方式,即在每條指令執行結束后,產生中斷。IF中斷標志位:該標志位用來控制CPU是否響應可屏蔽中斷。若IF=1則允許中斷,否則禁止中斷。
DF方向標志:該標志位用來控制串處理指令的處理方向。若DF=1則串處理過程中地址自動遞減,否則自動遞增。出棧操作,前面應該有PUSH ACC,把ACC寄存器壓入堆棧。
