玖:中斷系統的原理與應用
基本概念
1、什麼是“中斷”? 顧名思義,中斷就是中斷當前工作去處理一些臨時發生的時間,處理完後,則繼續原工作過程。例如:你在看書,電話響了,你在書上做好記號後去接電話,接完之後再原記號處繼續往下看書。 2、51微控制器也需要“中斷”? 通常微控制器中只有一個CPU,但卻要應對諸如:執行程式、資料輸入、資料輸出、以及特殊情況處理等多項任務,為此微控制器必須具備中斷處理的功能,以應對特殊情況的緊急處理。 3、“中斷過程”是怎樣的? 中斷的目的是為了暫停主程式的執行,先去執行中斷服務程式,其功能是為了提高CPU工作效率。在中斷源提出中斷請求後,處理器執行完當前指令便進行中斷響應,一旦中斷服務程式執行完畢後,仍須返回到主程式被中斷處(斷點處)繼續執行原先程式,其過程如圖所示
4、誰能“中斷”51微控制器? 中斷源:能引發中斷的來源稱為中斷源。 51微控制器一共支援5箇中斷源(2個外部中斷源,3個內部中斷源),這些中斷源分別是: (1)外部中斷請求0,由INT0(P3.2引腳)輸入。 (2)外部中斷請求1,由INT1(P3.3引腳)輸入。 (3)片內定時/計數器0溢位中斷(T0)請求。 (4)片內定時/計數器0溢位中斷(T1)請求。 (5)片內序列口傳送/接收中斷請求。
5、“中斷源”同時來臨,怎麼辦? 中斷優先順序:處理中斷源的優先順序稱為中斷優先順序
51微控制器將優先順序整個劃分為2個大等級:高優先順序和低優先順序。高優先順序的中斷先響應,等高優先順序的中斷響應完之後才響應低優先順序的中斷,高低優先順序的分配可通過IP暫存器來設定。 當多箇中斷都分配為同一個優先等級,並且發生中斷時,由查詢電路來確定最終優先順序。 對於同一優先順序,微控制器對其中斷次序安排如下:外部中斷0>定時/計數器T0>外部中斷1>定時/計數器T1>序列口。 6、“中斷源”的訊號可否遮蔽?
7、中斷響應可否巢狀? 高優先順序中斷是可以打斷低優先順序的中斷處理過程。
8、每個“中斷”響應程式放在哪裡呢?
51微控制器給每個中斷安排了一個唯一的中斷入口地址。
中斷源的入口地址表
0003H | |
000BH | |
0013H | |
001BH | |
0023H |
51中斷的使用
★★★中斷允許暫存器(IE)
★★★中斷優先順序暫存器(IP)
對應中斷源 |
SCON
IT0、IT1:外部中斷0、1觸發方式選擇位,由軟體設定。1:下降沿觸發方式;0:低電平觸發方式 IE0、IE1:外部中斷0、1請求標誌位。當外部中斷0、1依據觸發方式滿足產生中斷請求是,由硬體置位。 RI :序列口接收中斷請求標誌位。當序列口接收完一幀資料後請求中斷時,由硬體置位(RI=1)。RI必須由軟體清0。 TI:序列口傳送中斷請求標誌位。當序列口傳送完一幀資料後請求中斷時,由硬體置位(TI=1)。TI必須由軟體清0。
(1)中斷初始化 中斷系統的初始化:在為某個中斷源編寫中斷服務程式前,首先應在主程式中對中斷系統進行初始化,初始化步驟應包括: 1)軟體清除相應中斷源的中斷標誌位,以消除以前中斷標誌對現在的影響。 2)預設或設定中斷優先順序。 3)其他設定:若為外部中斷,應設定是電平觸發方式還是下降沿觸發方式;若為定時/計數器中斷,應將定時/計數初值送入暫存器THx、TLx中。 4)開啟相應中斷源的分開關和總開關EA。 (2)中斷服務程式的預先安排 組合語言要喲昂到ORG偽指令和JMP跳轉指令,C語言要用到關鍵字interrupt。 中斷服務程式入口地址設定
INT0_i | ||||
T0_i | ||||
INT1_i | ||||
T1_i | ||||
COM_i |
(3)中斷服務程式的預先安排
ORG OOOOH
JMP Start ;跳轉到主程式
ORG 00BH
JMP T0_i ;跳轉到T0中斷服務程式處
ORG 0030H
Start: ;主程式
……
T0_i: ;T0的中斷服務程式
……
RETI ;中斷返回
END
(4)中斷返回 一旦某個中斷請求得到響應,微控制器必須把它的相應對應中斷標誌位清0,否則,微控制器會因中斷標誌未能得到及時清除而重新相應同一中斷請求,這是絕對不允許的。 1、外部中斷標誌的清除 當外部中斷工作在電平觸發方式下,外部中斷標誌IE0或IE1是依靠微控制器檢測其引腳INT0或INT1上為低電平而置位的。儘管RETI指令能使中斷標誌IE0或IE1自動清除成“0”狀態,但無法改變引腳INT0或INT1上電平始終為低電平的事實,所以單機在執行過程中會再次檢測到INT0或INT1引腳上的低電平而置位IE0或IE1。 2、序列口中斷標誌的清除 序列口有兩個中斷標誌位TI和RI,硬體無法判別是哪個中斷標誌引發的中斷請求,所以中斷響應後,RETI指令無法自動清除中斷標誌,只能由軟體清除。程式設計時應在中斷服務程式的適當位置採用指令清除TI或RI。 #實驗
彙編程式碼
******************************************************************/
* 【課程10】 ****中斷系統的應用***********
* 【說 明】 ****使用T0定時1秒讓LED燈閃爍一次
* 【描 述】 ****使用T0定時1秒讓LED燈閃爍一次,並通過按鍵來控制定時器的開啟和關閉。
******************************************************************/
ORG 0000H
JMP MAIN ;跳到主程式
ORG 000BH
JMP Timer0 ;跳到Timer0的中斷服務程式
ORG 0030H
Timer0: MOV TH0,#3CH ;定時器T0賦初值
MOV TL0,#0B0H
INC R3 ;R3儲存N值
MOV A,R3
CJNE A,#19,L1 ;A不等於19,則跳轉到L1處
CLR P2.7 ;P2.7=0,點亮D1燈
L1: CJNE A,#20,L2
SETB P2.7 ;P2.7=1,熄滅D1燈
MOV R3,#00H ;N=0
L2: RETI
MAIN: MOV TMOD,#01H ;定時器T0工作在方式1下
MOV TH0,#3CH ;T0賦初值
MOV TL0,#0B0H
SETB ET0 ;ET0=1,定時器t0中斷允許
SETB EA ;開中斷總開關
SETB TR0 ;啟動T0,開始定時
MOV R3,#00H ;R3儲存N值,N=0
CLR 20H ;位地址20H處,儲存標誌量
LOOP: JB P3.2,$ ;如果P3.2=1,則跳到自身處繼續執行
CALL DELAY
JB P3.2,LOOP
JNB P3.2,$
JB 20H,L3
SETB 20H
CLR TR0 ;關閉T0
JMP LOOP
L3: CLR 20H
SETB TR0 ;開啟T0
JMP LOOP
DELAY: MOV R7,#0FFH
W1: MOV R6,#03FH
W2: DJNZ R6,W2
DJNZ R7,W1
RET
END
C程式碼
******************************************************************/
* 【課程10】 ****中斷系統的應用***********
* 【說 明】 ****使用T0定時1秒讓LED燈閃爍一次
* 【描 述】 ****使用T0定時1秒讓LED燈閃爍一次,並通過按鍵來控制定時器的開啟和關閉。
******************************************************************/
#include<reg51.h> //51標頭檔案,
#include <intrins.h>
//---------常用的兩個巨集定義--------------
#define uint8 unsigned char
#define uint16 unsigned int
sbit Key=P3^2;
sbit Led=P2^7;
uint8 num; //一秒的計數變數
uint8 flag;
/************************************
函式名:Timer0_I()
功能:中斷服務程式
************************************/
void Timer0_I() interrupt 1
{
TH0=0x3c; //重灌初值
TL0=0xb0;
num++; //計時變數+1
if(num==20) {Led=~Led; num=0;}
}
/************************************
函式名:main()
功能:主程式
************************************/
void main()
{
TMOD=0x01; //選擇定時器0工作在定時方式1
TH0=0x3c; //定時50ms,裝初值
TL0=0xb0;
ET0=1; //開啟定時中斷
EA=1; //開總中斷
TR0=1; //開啟定時器T0
num=0;
flag=0;
while(1)
{
if(Key==0) //有鍵按下
{
if(flag==0)
{flag=1; TR0=0;} //關閉定時器T0
else
{flag=0; TR0=1;} //開啟定時器T0
}
}
}