中斷的概念:
CPU在處理某一事件A時,發(fā)生了另一事件B的請求(中斷請求);CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續(xù)處理事件A(中斷返),這一過程稱為中斷。
中斷執(zhí)行過程圖
如何執(zhí)行如上圖所示:先執(zhí)行主程序,到達斷點的地方出現(xiàn)中斷請求,此時執(zhí)行中斷響應,執(zhí)行中斷處理程序,執(zhí)行完中斷返回斷點,再繼續(xù)執(zhí)行主程序。
中斷源:
引起CPU中斷的根源,稱為中斷源。中斷源向CPU提出的中斷請求。CPU暫時中斷原來的事務A,轉去處理事件B。對事件B處理完畢后,再回到原來被中斷的地方(即斷點),稱為中斷返回。實現(xiàn)上述中斷功能的部件稱為中斷系統(tǒng)(中斷機構)。
中斷的優(yōu)點:
分時操作:CPU可以分時為多個外設服務,提高了計算機的利用率;
實時響應:CPU能夠及時處理應用系統(tǒng)的隨機事件,系統(tǒng)的實時性大大增強;
可靠性高:CPU具有處理設備故障及掉電等突發(fā)性事件能力,從而使系統(tǒng)可靠性提高。
定義中斷函數(shù)的一般形式:
viod 函數(shù)名() interrupt n
(1) interrupt必須要加,表示定義成中斷服務函數(shù)。
(2)后面n是中斷號,中斷號是編譯器識別不同中斷的唯一編號.
中斷服務函數(shù)和普通函數(shù)的異同:
同:函數(shù)的形式非常類似,中斷響應過程和普通函數(shù)調用過程也非常相似。
異:①中斷服務函數(shù)不需要聲明,普通函數(shù)一般需要聲明。②普通函數(shù)的執(zhí)行是可預測的;而中斷服務函數(shù)的執(zhí)行是不可預測的。③普通函數(shù)的跳轉是軟件(函數(shù)調用語句)完成的;中斷的跳轉(中斷響應)是由硬件完成的,只要發(fā)生了中斷事件,并且中斷被允許,硬件自動會幫我們完成中斷的跳轉(中斷響應)。④普通函數(shù):通過函數(shù)名找到被調用函數(shù);中斷服務函數(shù):通過中斷號找到中斷服務函數(shù)。所以我們可以知道,中斷服務函數(shù)中的函數(shù)名其實并沒有什么作用。
使用中斷函數(shù)時應遵循以下規(guī)則:
(1)中斷函數(shù)不能進行參數(shù)轉遞;
(2)在任何情況下,都不能直接調用中斷函數(shù)。
那么我們如何通過keil使用51單片機外部中斷0觸發(fā)數(shù)碼管顯示三位數(shù)字呢?
下面給予chatGPT示例
#include
sbit LED = P1^0; //定義LED連接的IO口
sbit KEY = P3^2; //定義KEY連接的IO口
unsigned int num = 0; //定義計數(shù)器
void delay(unsigned int x) //延時函數(shù)
{
unsigned int i, j;
for(i=0; i for(j=0; j<125; j++);
}
void display(unsigned int n) //數(shù)碼管顯示函數(shù)
{
unsigned char code table[] = { //數(shù)碼管顯示表
0x3f, //0
0x06, //1
0x5b, //2
0x4f, //3
0x66, //4
0x6d, //5
0x7d, //6
0x07, //7
0x7f, //8
0x6f //9
};
unsigned int i, j;
for(i=0; i<3; i++)
{
P2 = 0xff; //關閉所有數(shù)碼管
switch(i) //選擇要顯示的數(shù)位
{
case 0:
P0 = 0xfe; //第一位數(shù)碼管
break;
case 1:
P0 = 0xfd; //第二位數(shù)碼管
break;
case 2:
P0 = 0xfb; //第三位數(shù)碼管
break;
}
P2 = table[n%10]; //顯示個位數(shù)字
delay(1); //延時一段時間
P2 = 0xff; //關閉所有數(shù)碼管
switch(i) //選擇要顯示的數(shù)位
{
case 0:
P0 = 0xfd; //第二位數(shù)碼管
break;
case 1:
P0 = 0xfb; //第三位數(shù)碼管
break;
case 2:
P0 = 0xf7; //第四位數(shù)碼管
break;
}
P2 = table[n/10%10]; //顯示十位數(shù)字
delay(1); //延時一段時間
P2 = 0xff; //關閉所有數(shù)碼管
switch(i) //選擇要顯示的數(shù)位
{
case 0:
P0 = 0xfb; //第三位數(shù)碼管
break;
case 1:
P0 = 0xf7; //第四位數(shù)碼管
break;
case 2:
P0 = 0xef; //第五位數(shù)碼管
break;
}
P2 = table[n/100%10]; //顯示百位數(shù)字
delay(1); //延時一段時間
P2 = 0xff; //關閉所有數(shù)碼管
switch(i) //選擇要顯示的數(shù)位
{
case 0:
P0 = 0xf7; //第四位數(shù)碼管
break;
case 1:
P0 = 0xef; //第五位數(shù)碼管
break;
case 2:
P0 = 0xdf; //第六位數(shù)碼管
break;
}
P2 = table[n/1000%10]; //顯示千位數(shù)字
delay(1); //延時一段時間
}
}
void main()
{
EA = 1; //開啟總中斷
EX0 = 1; //開啟外部中斷0
IT0 = 1; //設置外部中斷0為下降沿觸發(fā)
while(1)
{
display(num%1000); //顯示后三位數(shù)字
}
}
void Interrupt0() interrupt 0 //外部中斷0中斷服務函數(shù)
{
num++; //計數(shù)器加1
LED = ~LED; //LED翻轉
}
在上面的代碼中,我們定義了一個計數(shù)器num,并在外部中斷0中斷服務函數(shù)中將其加1。同時,在main函數(shù)中,我們使用display函數(shù)來顯示num的后三位數(shù)字。display函數(shù)中使用了一個數(shù)碼管顯示表來將數(shù)字轉換為數(shù)碼管的顯示碼,然后通過控制數(shù)碼管的選擇位和段選位來實現(xiàn)數(shù)碼管的顯示。在每次顯示完一個數(shù)位后,我們都會延時一段時間,以控制數(shù)碼管的亮度和顯示效果。最后,我們在main函數(shù)的無限循環(huán)中不斷調用display函數(shù),以實現(xiàn)數(shù)碼管的動態(tài)顯示。
需要注意的是,在使用外部中斷0時,我們需要先開啟總中斷(EA=1),然后再開啟外部中斷0(EX0=1)。同時,我們還需要設置外部中斷0的觸發(fā)方式,可以選擇下降沿觸發(fā)(IT0=1)或者上升沿觸發(fā)(IT0=0),具體根據(jù)實際情況而定。在外部中斷0中斷服務函數(shù)中,我們可以進行一些需要立即響應的操作,比如計數(shù)器加1、LED翻轉等。
我覺得還是太復雜了(主要是太多了不想看又看不懂emmm),下面是我通過keil使用51單片機外部中斷0觸發(fā)數(shù)碼管顯示后三位學號的示例代碼:
#include
#define duan P0
#define uchar unsigned char
sbit wei1 = P2^4;//定義第一位數(shù)碼管
sbit wei2 = P2^5;//定義第二位數(shù)碼管
sbit wei3 = P2^6;//定義第三位數(shù)碼管
sbit wei4 = P2^7;//定義第四位數(shù)碼管
uchar code sz[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay (unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時xms
for(j=112;j>0;j--);
}
void main()
{
EX0 = 1;//INT0中斷允許
EA = 1;//全局中斷打開
IT0 = 0;//觸發(fā)方式為低電平觸發(fā)
while(1)
{
duan = sz[8];
wei1 = 0;
wei2 = 0;
wei3 = 0;
wei4 = 1;
delay(0);
duan = sz[2];//0111 1100 "b"
wei1 = 0;
wei2 = 0;
wei3 = 1;
wei4 = 0;
delay(0);
duan = sz[6];
wei1 = 0;
wei2 = 1;
wei3 = 0;
wei4 = 0;
delay(0);
duan = sz[7];
wei1 = 1;
wei2 = 0;
wei3 = 0;
wei4 = 0;
delay(0);
}
}
void low()interrupt 0
{
wei1 = 0;
delay(0);
}
運行結果
硬件顯示效果
顯示效果:顯示4位學號7628,通過外部中斷0使第一位數(shù)碼管不亮,從而顯示學號后三位。
總結:P3.2由ITO(TCON.0)選擇其為低電平有效。當CPU檢測到P3.2引腳上出現(xiàn)有效的中斷信號時,中斷標志 IEO(TCON.1)置1,向CPU申請中斷。
審核編輯 黃宇
-
單片機
+關注
關注
6039文章
44575瀏覽量
636387 -
cpu
+關注
關注
68文章
10878瀏覽量
212167
發(fā)布評論請先 登錄
相關推薦
評論