中斷的概念 CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生); CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後, 再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。 我第一眼看見這東西,感覺跟函數嵌套調用 ...
中斷的概念
CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生); CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務); 待CPU將事件B處理完畢後,
再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。
我第一眼看見這東西,感覺跟函數嵌套調用的過程特別像。
中斷允許控制
CPU對中斷系統所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的
EX0(IE.0),外部中斷0允許位;
ET0(IE.1),定時/計數器T0中斷允許位;
EX1(IE.2),外部中斷1允許位;
ET1(IE.3),定時/計數器T1中斷允許位;
ES(IE.4),串列口中斷允許位;
EA (IE.7), CPU中斷允許(總允許)位
中斷請求標誌
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才有可能響應中斷
以外部中斷0為例
主程式中需要有以下代碼:
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 ); }