文章目錄
1. 什麼是中斷
1.1 中斷的概念
中斷是指中央處理器CPU正在處理某件事情的時候,外部發生了某一事件(如定時器計時已到),請求CPU迅速去處理,CPU暫停當前的工作,轉去處理所發生的事件,處理完以後,再回到原來被中斷的地方,繼續原來的工作。實現這種功能的部件稱爲中斷系統。它由4個與中斷有關的特殊功能寄存器(TCON、SCON),中斷允許控制寄存器IE和中斷順序查詢邏輯等組成。
1.2 中斷源
我們將發起中斷申請的設備,稱爲中斷源。
1.2.1 中斷源的種類
根據中斷源的不同,可分爲2個外部中斷源,3個內部中斷源:
- /INT0:外部中斷0,中斷請求信號由P3.2端口線引入,低電平或下跳沿引起。
- /INT1:外部中斷1,中斷請求信號由P3.3端口線引入,低電平或下跳沿引起。
- T0:定時/計數器0溢出中斷,對外部脈衝計數由P3.4輸入,由T0計滿回零引起。
- T1:定時/計數器1溢出中斷,對外部脈衝計數由P3.5輸入,由T1計滿回零引起。
- 串行中斷:包括串行接收中斷RI和串行發送中斷TI。
2. 中斷寄存器
單片機中主要包含四類特殊的寄存器對中斷進行控制:
- TCON:定時/計數器控制寄存器
- SCON:串行口控制寄存器
- IE:中斷允許寄存器
- IP:中斷優先級寄存器
2.1 TCON寄存器
每個中斷源對應一箇中斷標誌位,當某個中斷源有中斷請求時,相應的中斷標誌位置1,各中斷源的中斷標誌位在TCON和SCON中,具體如下表所示:
說明:
- 標誌位IE0=1時,表示外部中斷/INT0提出了中斷請求,如果IE0=0,則沒有中斷請求;
- 標誌位IE1=1時,表示外部中斷/INT1提出了中斷請求;
- 標誌位TF0=1時,表示定時器/計數器T0提出了中斷請求;
- 標誌位TF1=1時,表示定時器/計數器T1提出了中斷請求。
- IT0:外部中斷0觸發方式控制位。
- 當IT0=0時,爲電平觸發方式(低電平有效);
- 當IT0=1時,爲邊沿觸發方式(下降沿有效)。
- IT1(TCON.2):外部中斷1觸發方式控制位,其作用和IT0類似。
- TR0(TCON.4):定時/計數器T0運行控制位。
當TR0=1,啓動定時/計數器T0;反之,停止定時/計數器T0。 - TR1(TCON.6):定時/計數器T1運行控制位,其作用和TR0相同。
2.2 SCON寄存器
這裏補充一下串口通信的四種模式,方便後面理解各個標誌位的作用:
說明:
- TI:串行口發送中斷標誌位,當CPU將一個發送數據寫入串行口發送緩衝器時,就啓動了發送過程。每發送完一個串行幀,由硬件置位TI,即TI=1。 CPU響應中斷時,不能自動清除TI,TI必須由軟件清除。
- RI:串行口接收中斷標誌位。當允許串行口接收數據時,每接收完一個串行幀,由硬件置位RI,即RI=1,RI也必須由軟件清除。
- SM0、SM1:串口工作方式選擇位,用於控制串口通信模式。
- SM2:多機通信控制位,主要用於方式2和方式3。
- REN:允許串行接收位。由軟件置REN=1,則啓動串行口接收數據;若置REN=0,則禁止接收。
- TB8:在方式2或方式3中,是發送數據的第九位,可以用軟件規定其作用,例如:作爲數據的奇偶校驗位,或在多機通信中,作爲地址幀/數據幀的標誌位。在方式0和方式1中,該位未用。
- RB8:在方式2或方式3中,是接收到數據的第九位,作爲奇偶校驗位或地址幀/數據幀的標誌位。在方式1時,若SM2=0,則RB8是接收到的停止位。
2.3 IE寄存器
中斷系統中所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的,IE可進行位尋址。中斷允許寄存器IE對中斷的開放和關閉實現兩級控制。(PS:兩級控制是指有一個總的開關中斷控制位EA。當EA=0時,所有的中斷請求被屏蔽,CPU對任何中斷請求都不接受;當EA=1時,CPU開放中斷,但5箇中斷源的中斷請求是否允許,還要由IE中的低5位所對應的5箇中斷請求允許控制位的狀態來決定。)
說明:
- EA:CPU中斷允許(總允許)位。EA0=0,所有中斷關閉,EA=1,CPU打開中斷。
- ES:串行口中斷允許位。ES=1,允許串口中斷,否則關閉串口中斷。
- ET1:定時/計數器T1中斷允許位。ET1=1,允許T1中斷,否則關閉T1中斷。
- EX1:外部中斷1允許位。EX1=1,允許外部中斷1中斷,否則關閉外部中斷1。
- ET0:定時/計數器T0中斷允許位。其功能與ET1相同。
- EX0:外部中斷0允許位。其功能與EX1相同。
2.4 IP寄存器
單片機有兩個中斷優先級,即可實現二級中斷服務嵌套。兩級優先級遵循下述規則:僅高優先級可中斷嵌套低優先級。簡而言之:高優先級的中斷可打斷低優先級的中斷。
說明:
- PX0:外部中斷0優先級設定位;
- PT0:定時/計數器T0優先級設定位;
- PX1:外部中斷1優先級設定位;
- PT1:定時/計數器T1優先級設定位;
- PS:串行口優先級設定位;
注意: 對於同一優先級的中斷,一旦中斷得到響應,就不會被其他中斷打斷。對於各中斷的優先權值,則根據中斷的系統的自然優先級形成,自然優先級如下圖所示:
3. 中斷處理流程
3.1 定時器中斷實操
要求:使P1.0管腳上輸出週期爲2ms的方波脈衝。設單片機晶振頻率Fosc=6MHz。
思路:利用定時器T0作1ms定時,達到定時值後引起中斷,在中斷服務程序中,使P1.0的狀態取一次反,並再次定時1ms。
PS:當定時器/計數器工作在方式1時,且確定定時爲T後,其初值的計算公式爲:
X = 65536 - T x Fosc /12
編程實現爲:
#include <reg52.h>
sbit Pulse=P1^1;
//初始化定時器
void InitTimer0( ){
EA = 0; //禁止所有中斷
TMOD = 0x01; // T0爲定時器狀態,工作方式1
TL0 = (65536 - 10000) / 256 ; // T0的低位定時初值
TH0 = (65536 - 10000) %256 ; // T0的高位定時初值
ET0 = 1; //允許定時器/計數器0的溢出中斷
EA = 1; //開CPU中斷
TR0 = 1; //啓動定時器0
}
//定時器0中斷服務程序
void IRQTimer0 () interrupt 1{
EA=0;
TL0 = (65536 - 10000) / 256; // T0的低位定時初值
TH0 = (65536 - 10000) %256; // T0的高位定時初值
Pulse=~Pulse;
EA=1;
}
//主程序
void main() {
InitTimer0( )
Pulse=1;
while(1);
}
3.2 外部中斷實操
要求:繪製電路圖,並通過按鍵實現LED燈的閃爍。
思路:將按鍵信號作爲單片機外部中斷觸發信號。每產生一個外部中斷就將與LED燈相連的P1.0口電平取反,從而實現LED燈閃爍
PS:由於手動按鍵存在機械抖動,且按鍵會持續一段時間(約50~100ms),爲避免一次按鍵產生多次外部中斷,需要在每次中斷後進行一定延時處理,確保本次按鍵已經釋放
實現:電路圖設計爲:
編程爲:
#include<reg51.h>
sbit LED=P1^0;
// 主函數
void main(void){
P3=0xff; //端口初始化,爲外部中斷信號輸入作準備。
EA=1; //開總中斷
IT0=0; //設置外部中斷0爲電平觸發方式
EX0=1; //外部中斷0允許
LED=0; //LED初始狀態爲點亮
while(1); //等待中斷
}
//外部中斷0服務程序
void EIRQ0(void) interrupt 0{
unsigned int iDelay=0;
EX0=0; //關外部中斷1
LED=~ LED; //來一個外部中斷信號LED狀態改變一次
For(iDelay=0; iDelay<65535; iDelay++); //延時等待按鍵釋放
EX0=1; //開外部中斷1
}
3.3 思考題:
現要求編制程序,並設計相關外部電路,使P1.1管腳上連接LED,並在外部中斷INT0連接按鍵。設單片機晶振頻率Fosc=12MHz。
1.利用定時器T0使得達到定時值後引起中斷,在中斷服務程序中,使LED燈狀態發生反轉,並持續500ms。
2.若單片機被外部中斷INT0中斷,則在中斷服務程序中使得LED等的狀態進行500ms每次的閃爍(亮500ms,滅500ms)反覆5次,期間可被定時器中斷,5次以後重新回到INT0中斷前狀態。
想要獲取或查看思考題的答案,請關注公衆號:Newtol,後臺回覆暗號:中斷