51單片機-(中斷系統)
了解51單片機中斷系統、中斷源、中斷響應條件和優先級等,通過外部中斷0實現按鍵控制LED亮滅為例理解中斷工作原理和編程實現過程。
1.中斷系統結構
89C51/52的中斷系統有5個中斷源 ,2個優先級,可實現二級中斷嵌套 。
1.1.外部中斷0 (P3.2)
INT0: 通過TCOM中的IT0來選擇其為下降沿有效還是低電平有效。
1.2.定時計數器中斷T0
T0: 定時計數溢出中斷標志TF0置1
1.3.外部中斷1 INT1(P3.3)
INT1: 通過TCOM中的IT1來選擇其為下降沿有效還是低電平有效。
1.4.定時計數器中斷T1
T1: 定時計數溢出中斷標志TF1置1
1.5. RI(SCON.0)或TI(SCON.1)
串行口中斷請求標志。當串行口接收完一幀串行數據時置位RI或當串行口發送完一幀串行數據時置位TI,向CPU申請中斷。
2.中斷請求標志TCON
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節地址:88H | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
- IT0 (TCON.0),外部中斷0觸發方式控制位。
當IT0=0時,為電平觸發方式。
當IT0=1時,為邊沿觸發方式(下降沿有效)。 - IE0 (TCON.1) :外部中斷0中斷請求標志位。
- IT1 (TCON.2):外部中斷1觸發方式控制位。
- IE1 (TCON.3):外部中斷1中斷請求標志位。
- TR0(TCON.4):T0運行控制位,其功能與TR1類同。
- TF0 (TCON.5):定時/計數器T0溢出中斷請求標志位。
- TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。
- TF1 (TCON.7),定時/計數器T1溢出中斷請求標志位。
3.中斷允許控制(IE)
CPU對中斷系統所有中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 |
- EXO(IE.0),外部中斷0允許位;
- ETO(IE.1),定時/計數器T0中斷允許位;
- EX1(IE.2),外部中斷0允許位;
- ETI(IE.3),定時/計數器T1中斷允許位;
- ES(IE.4),串行口中斷允許位;
- EA (IE.7),CPU中斷允許(總允許)位。
4.各中斷源響應
4.1.中斷優先級
有時同一優先級中的中斷申請不止一個,則有中斷優先權排隊問題。同一優先級的中斷優先權排隊,由中斷系統硬件確定的自然優先級形成,其排列如所示
中斷優先級有三條原則:
- CPU同時接收到幾個中斷時,首先響應優先級別最高的中斷請求。
- 正在進行的中斷過程不能被新的同級或低優先級的中斷請求所中斷。
- 正在進行的低優先級中斷服務,能被高優先級中斷請求所中斷。
為了實現上述后兩條原則,中斷系統內部設有兩個用戶不能尋址的優先級狀態觸發器。其中一個置1,表示正在響應高優先級的中斷,它將阻斷后來所有的中斷請求;另一個置1,表示正在響應低優先級中斷,它將阻斷后來所有的低優先級中斷請求。
4.2.中斷號
4.3.中斷響應條件
- 中斷源有中斷請求;
- 此中斷源的中斷允許位為1;
- CPU開中斷(即EA=1)。
以上三條同時滿足時,CPU才有可能響應中斷。
4.4.開發中使用中斷
你想使用的中斷是哪個?選擇相應的中斷號;
你所希望的觸發條件是什么?
你希望在中斷之后干什么?
5.中斷樣例
5.1.外部中斷0為例
通過按鍵按下出發外部中斷0來控制LED反轉亮滅。
(對照這張圖好理解)
使用外部中斷0的代碼:
默認按鍵為高電平,選擇用下降沿觸發中斷
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;sbit led=P2^0;
sbit key3=P3^2;//delay函數功能: 延時函數,i=1時,大約延時10us
void delay(u16 i)
{while(i--);
}
//Int0Init函數功能:
void Int0Init()
{IT0=1; //設置外部中斷的觸發方式下降沿觸發EX0=1; //開外部中斷0允許位EA=1; //打開總中斷開關
}
//
void main()
{Int0Init();while(1);
}//中斷服務函數int0:
void int0 () interrupt 0
{delay(1000);if(key3==0){led =~led;}
}
不使用中斷的代碼:
//實現現象:下載程序后按下K1按鍵可以對D11小燈狀態取反。
#include "reg52.h"//此文件中定義了單片機的特殊功能寄存器
typedef unsigned int u16;//對數據類型進行聲明定義
typedef unsigned char u8;sbit k1=P1^0; //定義P10口是k1
sbit led=P0^0; //定義P00口是led//函數名 : delay
//函數功能: 延時函數,i=1時,大約延時10us,用定時器延時更精確
void delay(u16 i)
{while(i--);
}//函數名 : keypros
//函數功能: 按鍵處理函數,判斷按鍵K1是否按下
void keypros()
{if(k1==0) //檢測按鍵K1是否按下{ delay(1000); //消除抖動 一般大約10msif(k1==0) //再次判斷按鍵是否按下{led=~led; //led狀態取反}while(!k1); //檢測按鍵是否松開}
}//主函數: main
void main()
{ led=0;while(1) { keypros(); //按鍵處理函數 }
}