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