小知識點:
1.爲什麼要引入中斷原因
一個高速主機和一個低速外設連接時,效率極低,低速外設工作時無端佔用大量CPU時間。一個高速主機和多個低速外設連接時,高速主機無法進行多任務並行處理。
2.中斷系統結構
斷點即中斷源
引起CPU中斷的根源,稱爲中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務,轉去處理髮生中斷請求的事件,對此事件處理完後,再回到被中斷的地方(即斷點)繼續處理原來的事務,稱爲中斷返回。實現上述中斷功能的部件稱爲中斷系統。
80C51有5箇中斷源,2個優先級,可實現二級中斷嵌套。
3.中斷的優點
分時操作:CPU可以分時爲多個外設服務,提高了計算機的利用率;
實時響應:CPU能夠及時處理應用系統的隨機時間,系統的實時性大大增強;
可靠性高:CPU具有處理設備故障及掉電等突發性事件能力,從而使系統的可靠性提高。
4.中斷的幾個環節
①中斷源
②中斷請求
③開放中斷
④保護現場
⑤中斷服務
⑥恢復現場
⑦中斷返回
5.中斷允許控制
CPU對中斷系統所有的中斷以及某個中斷源的開放和屏蔽是由中斷允許寄存器IE控制的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字節地址:A8H | EA | ES | ET1 | EX1 | ET0 | EX0 | IE |
EX0(IE.0)]:外部中斷0允許位;
ET0(IE.1):定時/計數器TO中斷允許位;
EX1(IE.2):外部中斷0允許位;
ET1(IE.3):定時/計數器T1中斷允許位;
ES (IE.4):串行口中斷允許位;
EA (IE.7):CPU中斷允許(總允許)位。
6.定時器/計數器控制寄存器TCON
位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
功能 | TF1 | TR1 | TF0 | TR0 | TE1 | IT1 | IE0 | IT0 |
■IT0和IT1是設置外部中斷的觸發方式。
■當其爲0時,爲低電平觸發方式
■當其爲1時,爲負跳變觸發方式。
■IE0和IE1是外部中斷標誌位
■其他的是定時/計數器的控制。
■TF0和TF1是定時器的中斷標誌。
■TR1和TR0是打開相應的定時器
7.中斷優先級控制
每個中斷源的中斷優先級都是由中斷優先級寄存器IP中的相應位的狀態來規定的。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
字節地址:B8H | PT2 | PS | PT1 | PX1 | PT0 | PX0 | IP |
中斷編號
〇PX0 (IP.0):外部中斷0優先級設定位;
①PT0 (IP.1):定時/計數器T0優先級設定位;
②PX1 (IP.2):外部中斷1優先級設定位;
③PT1 (IP.3):定時/計數器T1優先級設定位;
④PS (IP.4) :串行口優先級設定位;
PT2 (IP.5):定時/計數器T2優先級設定位。
8.優先級問題
同一優先級中的中斷申請不止一個時,則有中斷優先權排隊問題。同一優先級的中斷優先權排隊,由中斷系統硬件確定的自然優先級形成,其排列如所示:
中斷源 | 中斷標誌 | 中斷服務程序入口 | 優先級順序 |
---|---|---|---|
外部中斷0(#INT0) | IE0 | 0003H | 高 |
定時/計數器0(T0) | TF0 | 000BH | 次高 |
外部中斷1(#INT1) | IE1 | 0013H | 低 |
定時/計數器1(T1) | TF1 | 001B | 次低 |
串行口 | RI或TI | 0023H | 最低 |
9.中斷響應條件:
1.中斷源有中斷請求;
2.此中斷源的中斷允許位爲1;
3.CPU開中斷(即EA=1)
三者條件必須同時滿足
10.一次中斷過程的完整步驟:
1、中斷請求:中斷事件旦發生, 中斷源就提交中斷請求(將中斷標誌位置1),欲請求CPU暫時放下目前的工作轉向爲該中斷作專項服務。
2、中斷使能:雖然中斷源提交了中斷請求,但是,能否得到CPU的響應,還要取決於該中斷請求能否通過若干關卡送達CPU(中斷使能位等於1,關卡放行),這些關卡有以下兩類:此中斷源的中斷允許位;
全局中斷允許位。
3、中斷響應:如果一路放行,則CPU響應該中斷請求,記錄斷點,跳轉到中斷服務程序。對於INT和TMR中斷,中斷響應時中斷標誌位會被硬件自動清零。
4、中斷處理:對中斷源進行有針對性的服務。
5、中斷返回:返回到主程序斷點處,繼續執行主程序。
1、3、5由硬件自動完成。2、4是用戶編程完成。
中斷響應條件爲1、2同時滿足。
11.中斷請求標記的置位和清除
外部中斷
下降沿觸發方式條件下,在產生中斷請求時由硬件置位(置1)中斷請求標記,當CPU響應中斷時由硬件清除(清0)。電平觸發方式條件下,中斷請求標記由外部中斷源控制。具體是:當CPU檢測到INT引腳上出現低電平時,中斷標誌IE由硬件置位,INT引腳上出現高電平時,中斷標誌IE由硬件清除。
定時器中斷
計數溢出時由硬件置位中斷請求標記,當CPU響應中斷由硬件清除。
串口中斷
當串行口接收完一幀數據後請求中斷,由硬件置位中斷請求標記RI,RI必須由軟件清除。當串行口發送完一幀數據後請求中斷,由硬件置位中斷請求標記TI,TI必須由軟件清除。
12.中斷服務函數
void 函數名()interrupt中斷編號
{
;
}
中斷具體實現代碼
1.外部中斷低電平觸發
代碼
/*外部中斷低電平觸發
效果:P3.2中斷後,P1口接的LED燈前後四位狀態調換*/
#include<reg51.h>
#include"delay.h"
void main()
{
P1=0x0f;
EX0=1; //INT0中斷允許
EA=1; //開總中斷
IT0=0; //觸發方式爲低電平觸發
while(1);
}
void low()interrupt 0
{
P1=~P1;
/*
優化增加延時
delay(200);
*/
}
電路原理圖
仿真結果若按鍵按下持續給低電平,則八個LED燈全亮,當按鍵鬆開後纔會改變狀態,與所想結果不符。因此可進行優化。
在中斷函數的執行程序中增加延時函數,可看到持續低電平時,左右四個燈並不是全亮,而是在不停的改變狀態。
2.外部中斷下降沿觸發
代碼
/*外部中斷下降沿觸發
效果:按下按鍵,觸發P3.3中斷
P1口接的LED燈前後四位狀態調換*/
#include<reg51.h>
void main()
{
P1=0x0f;
EX1=1; //INT1中斷允許
EA=1; //開總中斷
IT1=1; //觸發方式爲下降沿觸發
while(1);
}
void jump_low() interrupt 2
{
P1=~P1;
}
電路原理圖
電路圖與低電平觸發方式基本一樣。只是將按鍵接到P3.3INT1中斷上。
總結
經過這次中斷的仿真練習,可見下降沿觸發方式比低電平觸發方式更加可靠,雖然按鍵在按的過程中可能會有抖動,但在中斷中,這種情況並不能通過延時消除,但是呢,在中斷中,它會自己判斷必須是一個很明顯的下降沿纔會認爲是一次中斷。