一、通過兩個(gè)實(shí)驗(yàn)介紹有關(guān)中斷應(yīng)用程序的編寫。
1. 單一外中斷的應(yīng)用
例題:在單片機(jī)P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接一只按鈕開關(guān)K1。
要求將外部中斷0設(shè)置為電平觸發(fā)。程序啟動(dòng)時(shí),P1口上的8只LED全亮。每按一次按鈕開關(guān)K1,使引腳接地,產(chǎn)生一個(gè)低電平觸發(fā)的外中斷請(qǐng)求,在中斷服務(wù)程序中,讓低4位的LED與高4位的LED交替閃爍5次。然后從中斷返回,控制8只LED再次全亮。
利用中斷控制8只LED交替閃爍1次的電路如下所示
file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
參考程序如下:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延時(shí)函數(shù)Delay( ),i形式參數(shù),不能賦初值
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<333;j++) //晶振為12MHz,j選擇與晶振頻率有關(guān)
{;} //空函數(shù)
}
void main( ) //主函數(shù)
{
EA=1; //總中斷允許
EX0=1; //允許外部中斷0中斷
IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式
while(1) //循環(huán)
{ P1=0;} // P1口的8只LED全亮
}
void int0( ) interrupt 0 using 0 //外中斷0的中斷服務(wù)函數(shù)
{
uchar m;
EX0=0; //禁止外部中斷0中斷
for(m=0;m<5;m++) //交替閃爍5次
{
P1=0x0f; //低4位LED滅,高4位LED亮
Delay(400) ; //延時(shí)
P1=0xf0; //高4位LED滅,低4位LED亮
Delay(400); //延時(shí)
EX0=1; //中斷返回前,打開外部中斷0中斷
}
本例程包含兩部分,一部分是主程序段,完成中斷系統(tǒng)初始化,并把8個(gè)LED全部點(diǎn)亮。另一部分是中斷函數(shù)部分,控制4個(gè)LED交替閃爍1次,然后從中斷返回。
2、兩個(gè)外中斷的應(yīng)用
當(dāng)需要多個(gè)中斷源時(shí),只需增加相應(yīng)的中斷服務(wù)函數(shù)即可。
例題:在單片機(jī)P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接有一只按鈕開關(guān)K1。在外部中斷1輸入引腳(P3.3)接有一只按鈕開關(guān)K2。要求K1和K2都未按下時(shí),P1口的8只LED呈流水燈顯示,僅K1(P3.2)按下再松開時(shí),上下各4只LED交替閃爍10次,然后再回到流水燈顯示。如果按下再松開K2(P3.3)時(shí),P1口的8只LED全部閃爍10次,然后再回到流水燈顯示。設(shè)置兩個(gè)外中斷的優(yōu)先級(jí)相同。
電路圖如下:
file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
參考程序如下:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)//延時(shí)函數(shù)Delay( ),i為形式參數(shù),不能 // 賦初值
{
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;} //空函數(shù)
}
void main( ) //主函數(shù)
{
uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
0x7f};//流水燈顯示數(shù)據(jù)數(shù)組
unsigned int a;
for(;;)
{
EA=1; //總中斷允許
EX0=1; //允許外部中斷0中斷
EX1=1; //允許外部中斷1中斷
IT0=1; //選擇外部中斷0為跳沿觸發(fā)方式
IT1=1; //選擇外部中斷1為跳沿觸發(fā)方式
IP=0; //兩個(gè)外部中斷均為低優(yōu)先級(jí)
for(a=0;a<9;a++)
{
Delay(500); //延時(shí)
P1=display[a]; //將已經(jīng)定義的流水燈顯示數(shù)據(jù)送到P1口
}
}
}
void int0_isr(void) interrupt 0 using 1//外中斷0的中斷服務(wù)函數(shù)
{
uchar n;
for(n=0;n<10;n++) //高、低4位顯示10次
{
P1=0x0f; //低4位LED滅,高4位LED亮
Delay(500); //延時(shí)
P1=0xf0; //高4位LED滅,低4位LED亮
Delay(500); //延時(shí)
}
}
void int1_isr (void) interrupt 2 using 2//外中斷1中斷服務(wù)函數(shù)
{
uchar m;
for(m=0;m<10;m++) //閃爍顯示10次
{
P1=0xff; //全滅
Delay(500); //延時(shí)
P1=0; //全亮
Delay(500); //延時(shí)
}
}