中斷系統
正常運行過程中,被打斷進行另外工作,結束后回到原有進程。
5個中斷源
外部中斷源(2個):INT0——由P3.2端口線引入,低電平或下降沿引起。INT1——由P3.3端口線引入,低電平或下降沿引起。這兩個外部中斷源標志和它們的觸發方式控制位由特殊功能寄存器TCON的低4位控制。
內部中斷源(3個):T0——定時器/計數器0中斷,由T0回零溢出引起。T1——定時器/計數器1中斷,由T1回零溢出引起。TI/RI——串行I/O中斷,串行端口完成一幀字符發送/接收后引起。這3個內部中斷源的控制位分別鎖存在特殊功能寄存器TCON和SCON中。
1、中斷請求標志TCON(88H)可位尋址 【2.配置中斷方式】
TCON:Timer控制寄存器,低4位管理外部中斷
作用:設置外部中斷觸發方式,標注外部中斷請求。
IE0/IE1:外部中斷申請標志位:=0:沒有外部中斷申請;=1:有外部中斷申請。
IT0/IT1:外部中斷請求的觸發方式選擇位:=0:在INT0/INT1端申請中斷的信號 低電平 有效;注意:低電平觸發 引腳上的低電平須持續到中斷發生。若中斷返回前仍未及時撤除低電平,將再次中斷。=1:在INT0/INT1端申請中斷的信號 負跳變 有效。注意:負脈沖觸發 CPU在前一機器周期采到INT0/INT1引腳為高,后一機器周期采到為低才認為是一次中斷請求。CPU 可記憶申請、可自動撤除中斷申請。
2、中斷允許控制寄存器IE(A8H)【1.允許中斷】
作用:CPU對中斷系統所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。
EA , CPU中斷允許(總允許)位; =0 時禁止全部中斷;=1 時允許中斷。
ES,串行口中斷允許位;=0 時禁止中斷; =1 時允許中斷。
ET1,定時/計數器T1中斷允許位;=0 時禁止中斷; =1 時允許中斷。
EX1,外部中斷1允許位;=0 時禁止中斷; =1 時允許中斷。
ET0,定時/計數器T0中斷允許位;=0 時禁止中斷; =1 時允許中斷。
EX0,外部中斷0允許位; =0 時禁止中斷; =1 時允許中斷。
3.中斷優先級控制寄存器IP (B8H)可位尋址【3.中斷處理-優先級】
PX0/PX1:INT0/1優先級控制位:=0 時屬低優先級; =1 時屬高優先級。
PT0/PT1:T0/1中斷優先級控制位:=0 時屬低優先級; =1 時屬高優先級。
PS:串行口中斷優先級控制位:=0 時屬低優先級; =1 時屬高優先級。
對同時發生多個中斷申請時:
不同優先級的中斷同時申請(很難遇到)——先高后低
相同優先級的中斷同時申請(很難遇到)——按序執行
正處理低優先級中斷又接到高級別中斷——高打斷低
正處理高優先級中斷又接到低級別中斷——高不理低
編程知識點
中斷響應條件:
此中斷源的中斷允許位為1。
總中斷CPU中斷打開(EA = 1)。
中斷源有中斷請求。
中斷初始化:
EX0 = 1; //開外部中斷0
IT0 = 0; //低電平觸發
EA = 1; //開總中斷
編程
1.外部中斷0低電平觸發
實現:外部中斷0低電平觸發方式,每按下一次S2按鍵就會進入一次中斷,LED燈會發生狀態變化。
注意:
按鍵S2:連接在P3.0引腳(定義為key_s2)
中斷觸發信號:由P3.7引腳(定義為flag)產生 低電平
外部中斷0:實際中斷觸發引腳為P3.2(固定硬件功能),需確保硬件上P3.7與P3.2物理連接
#include <reg52.h>#define uint unsigned int
#define uchar unsigned charsbit key_s2 = P3^0;//獨立按鍵S2
sbit flag = P3^7; //外部中斷信號產生腳/*====================================
函數 : delay(uint z)
參數 :z 延時毫秒設定,取值范圍0-65535
返回值 :無
描述 :12T/Fosc11.0592M毫秒級延時
====================================*/
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}
//外部中斷0初始化
void int0Init()
{EA = 1; //開總中斷EX0 = 1;//開外部中斷0IT0 = 0;//外部中斷0低電平觸發
}void main()//main函數自身會循環
{int0Init();//外部中斷0初始化 while(1){if(key_s2 == 0)//判斷S2是否被按下{delay(20);//按鍵消抖if(key_s2 == 0){flag = 0;flag = 0;//產生低電平,CPU會采樣2次P3.2的狀態,兩次都為低才觸發flag = 1;//結束低電平while(!key_s2);//松手檢測} }}
}//外部中斷1中斷服務程序
void int0() interrupt 0
{P1 = ~P1;//P1的狀態按位取反
}
外部中斷1跳變沿
實現:外部中斷1下降沿觸發方式,每按下一次S2按鍵就會進入一次中斷,LED燈會發生狀態變化。
#include <reg52.h>#define uint unsigned int
#define uchar unsigned charsbit key_s2 = P3^0;//獨立按鍵S2
sbit flag = P3^7; //外部中斷信號產生腳/*====================================
函數 : delay(uint z)
參數 :z 延時毫秒設定,取值范圍0-65535
返回值 :無
描述 :12T/Fosc11.0592M毫秒級延時
====================================*/
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
}
//外部中斷1初始化
void int1Init()
{EA = 1; //開總中斷EX1 = 1;//開外部中斷1IT1 = 1;//外部中斷1下降沿觸發
}void main()//main函數自身會循環
{int1Init();//外部中斷1初始化 while(1){if(key_s2 == 0)//判斷S2是否被按下{delay(20);//按鍵消抖if(key_s2 == 0){flag = 1;flag = 0;//產生下降沿while(!key_s2);//松手檢測} }}
}//外部中斷1中斷服務程序
void int1() interrupt 2
{P1 = ~P1;
}
未完待續……