目錄
內容簡述
理論
中斷源型別
IP暫存器
LED程式:
Proteus仿真圖
外部中斷
改變中斷優先級
內容簡述:
以一個簡單的LED燈程式掌握51/STC單片機的中斷優先級調整
即:在主程式中設定LED為熄滅狀態,
利用LED的點亮或熄滅狀態完成對外部中斷優先級的調整
理論:
中斷源型別
| 中斷型別 | 優先級 | 中斷服務號 |
| INT0 – 外部中斷0 | 第1 | 0 |
| T0 – 定時器/計數器0中斷 | 第2 | 1 |
| INT1 – 外部中斷1 | 第3 | 2 |
| T1 – 定時器/計數器1中斷 | 第4 | 3 |
| 串口中斷 | 第5 | 4 |
| T2 – 定時器/計數器2中斷 | 第6 | 5 |
如果沒有自定義中斷優先級,單片機將默認表格中的優先級順序
改變中斷優先級需要用到IP暫存器
IP暫存器
作用:
調整優先級
| 序號 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
| 符號 | - | - | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
PT2:定時器/計數器2中斷優先
PS:串行口中斷優先
PT1:定時器/計數器1中斷優先
PX1:外中斷INT1中斷優先
PT0:定時器0中斷優先
PX0:外部中斷INT0的中斷優先
自定義的優先級分為4個擋位
0:最低優先級
1:較低優先級
2:較高優先級
3:最高優先級
LED程式:
Proteus仿真圖:

外部中斷
設定中斷開啟函式,設定觸發方式為低電平觸發
void open_out(){
EA=1; //中斷總開關
EX0=1;//外部中斷INT0打開
EX1=1;//外部中斷INT1打開
IT0=0;//外部中斷INT0,選擇低電平觸發
IT1=0;//外部中斷INT1,選擇低電平觸發
}
在主函式中設定LED一直為熄滅狀態
void main(){
open_out();
while(1){
LED=1;//LED熄滅
}
}
外部中斷程式
void INT0() interrupt 0{ //INT0外部中斷
LED=1;//LED熄滅
}
void INT1() interrupt 2{ //INT1外部中斷
LED=0;//LED點亮
}
由于設定的是低電平觸發,因此使key2處于長按狀態,那么LED原本的熄滅狀態被外部中斷INT1打斷,LED點亮,

在key2長按的同時(也就是外部中斷INT1一直處于觸發狀態),再使key1處于長按狀態,由于默認優先級INT0>INT1,因此LED熄滅

改變中斷優先級:
使用IP暫存器可以改變中斷優先級
PX1=1;//設定外部中斷INT1優先級為較低優先級;
PX0=0;//設定外部中斷INT0優先級為最低優先級;
void open_out(){
EA=1; //中斷總開關
EX0=1;//外部中斷INT0打開
EX1=1;//外部中斷INT1打開
IT0=0;//外部中斷INT0,選擇低電平觸發
IT1=0;//外部中斷INT1,選擇低電平觸發
PX1=1;//設定外部中斷INT1優先級為較低優先級;
PX0=0;//設定外部中斷INT0優先級為最低優先級;
}
那么由于中斷優先級的改變,由默認的INT0>INT1轉為INT0<INT1,當INT1處于觸發狀態時,再觸發INT0就不能打斷INT1,LED維持在點亮狀態,

通過一個簡單的除錯,可以加深對中斷優先級調整的理解,在撰寫復雜的程式時可以更加得心應手,
程式仿真檔案
https://download.csdn.net/download/zhjysx/72749301
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401452.html
標籤:其他
上一篇:PS4手柄控制無人駕駛小車車
