CPU在處理某一事件A時,發生了另外一事件B請求CPU迅速去處理(中斷髮生); CPU暫時中斷當前的工做,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後,函數
再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱爲中斷。spa
我第一眼看見這東西,感受跟函數嵌套調用的過程特別像。code
CPU對中斷系統全部中斷以及某個中斷源的開放和屏蔽是由中斷容許寄存器IE控制的blog
EX0(IE.0),外部中斷0容許位;事件
ET0(IE.1),定時/計數器T0中斷容許位;it
EX1(IE.2),外部中斷1容許位;class
ET1(IE.3),定時/計數器T1中斷容許位;請求
ES(IE.4),串行口中斷容許位;程序
EA (IE.7), CPU中斷容許(總容許)位im
IT0(TCON.0),外部中斷0觸發方式控制位。
當IT0=0時,爲電平觸發方式。
當IT0=1時,爲邊沿觸發方式(降低沿有效)。
IE0(TCON.1),外部中斷0中斷請求標誌位。
IT1(TCON.2),外部中斷1觸發方式控制位。
IE1(TCON.3),外部中斷1中斷請求標誌位。
TF0(TCON.5),定時/計數器T0溢出中斷請求標誌位。
TF1(TCON.7),定時/計數器T1溢出中斷請求標誌位。
CPU同時接收到幾個中斷時,首先響應優先級別最高的中斷請求。
正在進行的中斷過程不能被新的同級或低優先級的中斷請求所中斷。
正在進行的低優先級中斷服務,能被高優先級中斷請求所中斷
中斷源有中斷請求;
此中斷源的中斷容許位爲1;
CPU開中斷(即EA=1)。
以上三條同時知足時,CPU纔有可能響應中斷
主程序中須要有如下代碼:
EA=1;//打開總中斷開關
EX0=1;//開外部中斷0
IT0=0/1;//設置外部中斷的觸發方式( 0爲低電平, 1爲降低沿 )
接下來。咱們用K3獨立按鍵,控制led的狀態翻轉
#include <reg52.h> /************ 0號中斷控制led燈狀態翻轉 ***********/ sbit LED = P0^0; sbit k3 = P3^2; //0號中斷 typedef unsigned int u16; typedef unsigned char u8; void delay( u16 i ){ while( i-- ); } void int0_init(){ //開啓0號外部中斷的條件 EA = 1; //總中斷開關 EX0 = 1; //容許外部中斷0 IT0 = 1; //外部中斷0的觸發方式 } void trigger_int0() interrupt 0{ delay( 1100 ); if( k3 == 0 ) { //k3按下 LED = ~LED; } } void main(){ int0_init(); while( 1 ); }
接線: 用杜邦線鏈接K3與P3的2腳。P0的0腳鏈接LED的排針。interrupt 0 這個0指的是中斷號
下例用k4按鍵,處理1號外部中斷。相應的連線也要作出調整:
#include <reg52.h> /************ 1號中斷控制led燈狀態翻轉 ***********/ sbit LED = P0^0; sbit k4 = P3^3; //1號中斷 typedef unsigned int u16; typedef unsigned char u8; void delay( u16 i ){ while( i-- ); } void int1_init(){ //開啓1號外部中斷的條件 EA = 1; //總中斷開關 EX1 = 1; //容許外部中斷1 IT1 = 1; //外部中斷1的觸發方式 } void trigger_int1() interrupt 2{ delay( 1100 ); if( k4 == 0 ) { //k3按下 LED = ~LED; } } void main(){ int1_init(); while( 1 ); }