1. 程式人生 > >玖:中斷系統的原理與應用

玖:中斷系統的原理與應用

基本概念

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、“中斷源”的訊號可否遮蔽?

51微控制器是可以遮蔽中斷訊號的。有總開關和分開關。 這裡寫圖片描述

7、中斷響應可否巢狀? 高優先順序中斷是可以打斷低優先順序的中斷處理過程。 這裡寫圖片描述

8、每個“中斷”響應程式放在哪裡呢?

51微控制器給每個中斷安排了一個唯一的中斷入口地址。

中斷源的入口地址表

中斷源
入口地址
外部中斷0(INT0)
0003H
定時/計數器0
000BH
外部中斷1(INT1)
0013H
定時/計數器1
001BH
序列口中斷
0023H

51中斷的使用

★★★中斷允許暫存器(IE)

D7
D6
D5
D4
D3
D2
D1
D0
EA
ES
ET1
EX1
ET0
EX0
![這裡寫圖片描述](https://img-blog.csdn.net/20180705231013334?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE3MDE3NTQ1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) EA:中斷總開關位。EA = 1,開中斷;EA = 0,禁止所有中斷。(分開關類似)

★★★中斷優先順序暫存器(IP)

D7
D6
D5
D4
D3
D2
D1
D0
PS
PT1
PX1
PT0
PX0
對應中斷源
對應中斷源
對應中斷源
序列口
定時器1
外部中斷1
定時器0
外部中斷0
以上表格中,若某位=1,則該對應的中斷源設定為高優先順序;若該位=0,則該對應的中斷源設定為低優先順序。 **★★★各中斷源的標誌位** **TCON**
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TF0
IE1
IT1
IE0
IT0
T1計數溢位
T0計數溢位
外部中斷1
外部中斷0

SCON

D7
D6
D5
D4
D3
D2
D1
D0
TI
RI
傳送完畢
接收完畢

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。 中斷服務程式入口地址設定

中斷源
服務程式名稱(假設)
入口地址
彙編程式
C程式
外部中斷0
INT0_i
0003H
ORG 0003H JMP INT0_i
INT0_i() interrupt 0
定時/計數器0
T0_i
000BH
ORG 000BH JMP T0_i
T0_i() interrupt 1
外部中斷1
INT1_i
0013H
ORG 0013H JMP INT1_i
INT1_i() interrupt 2
定時/計數器1
T1_i
001BH
ORG 001BH JMP T1_i
T1_i() interrupt 3
序列口
COM_i
0023H
ORG 0023H JMP COM_i
COM_i() interrupt 4

(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
		}	
	}
}