一個(gè)外中斷的應(yīng)用
【例6-1】在單片機(jī)P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接一只按鈕開(kāi)關(guān)K1别瞭。要求將外部中斷0設(shè)置為電平觸發(fā)脊僚。程序啟動(dòng)時(shí)拣宰,P1口上的8只LED全亮轩端。每按一次按鈕開(kāi)關(guān)K1放典,使引腳接地,產(chǎn)生一個(gè)低電平觸發(fā)的外中斷請(qǐng)求基茵,在中斷服務(wù)程序中刻撒,讓低4位的LED與高4位的LED交替閃爍5次。然后從中斷返回耿导,控制8只LED再次全亮。原理電路及仿真結(jié)果見(jiàn)圖6-9态贤。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
//延時(shí)函數(shù)
void delay(uint i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<333;j++)//晶振為12MHz,j選擇與頻率有個(gè)
{;}
}
//主函數(shù)
void main()
{
EA =1;
EX0=1;
IT0=0;
while(1)
{
P1=0;
}
}
//中斷函數(shù)
void ite() interrupt 0 using 0
{
uchar m;
EX0=0;
for(m=0;m<5;m++)
{
P1=0x0f;
delay(400);
P1=0xf0;
delay(400);
}
EX0=1;
}
兩個(gè)外中斷的應(yīng)用
兩個(gè)外中斷的優(yōu)先級(jí)相同
【例6-2】如圖6-10所示舱呻,在單片機(jī)P1口上接有8只LED。在外部中斷0輸入引腳(P3.2)接有一只按鈕開(kāi)關(guān)K1。在外部中斷1輸入引腳(P3.3)接有一只按鈕開(kāi)關(guān)K2箱吕。要求K1和K2都未按下時(shí)芥驳,P1口的8只LED呈流水燈顯示,僅K1(P3.2)按下再松開(kāi)時(shí)茬高,上下各4只LED交替閃爍10次兆旬,然后再回到流水燈顯示。如果按下再松開(kāi)K2(P3.3)時(shí)怎栽,P1口的8只LED全部閃爍10次丽猬,然后再回到流水燈顯示。設(shè)置兩個(gè)外中斷的優(yōu)先級(jí)相同熏瞄。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//延時(shí)函數(shù)
void delay(uint i)
{
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
//主函數(shù)
void main()
{
//流水燈
uchar display[9]= {0xff,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0xf7f};
unsigned int a;
for(;;)//相當(dāng)于while(1)
{
EA =1脚祟;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
IP=0;//兩個(gè)外部中斷均是低優(yōu)先級(jí)
for(a=0;a<9;a++)
{
delay(500);
P1=display[a];
}
}
}
//第一個(gè)中斷函數(shù)
void int0() interrupt 0 using 1
{
uchar m;
for(m=0;m<10;m++)
{
P1=0xf0;
delay(500);
P1=0x0f;
delay(500);
}
}
//第二個(gè)中斷函數(shù)
voide int1() interrupt 1 using 2
{
uchar b;
for(b=0;b<10;b++)
{
P1=0x00;
delay(500);
P1=0xff;
delay(500);
}
}
兩個(gè)外中斷的優(yōu)先級(jí)不同
【例6-3】電路見(jiàn)圖6-10,設(shè)計(jì)一中斷嵌套程序:要求K1和K2都未按下時(shí)强饮,P1口8只LED呈流水燈顯示由桌,當(dāng)按一下K1時(shí),產(chǎn)生一個(gè)低優(yōu)先級(jí)外中斷0請(qǐng)求(跳沿觸發(fā))邮丰,進(jìn)入外中斷0中斷服務(wù)程序行您,上下4只LED交替閃爍。此時(shí)按一下K2時(shí)剪廉,產(chǎn)生一個(gè)高優(yōu)先級(jí)的外中斷1請(qǐng)求(跳沿觸發(fā))娃循,進(jìn)入外中斷1中斷服務(wù)程序,使8只LED全部閃爍妈经。當(dāng)顯示5次后淮野,再?gòu)耐庵袛?返回繼續(xù)執(zhí)行外中斷0中斷服務(wù)程序,即P1口控制8只LED吹泡,上骤星、下4只LED交替閃爍。設(shè)置外中斷0為低優(yōu)先級(jí)爆哑,外中斷1為高優(yōu)先級(jí)洞难。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//延時(shí)函數(shù)
void delay(uint i)
{
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
//主函數(shù)
void main()
{
//流水燈
uchar display[9]= {0xff,0xfe,0xfd,0xf7,0xef,0xdf,0xbf,0xf7f};
unsigned int a;
for(;;)//相當(dāng)于while(1)
{
EA =1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=0;//外部中斷0為低優(yōu)先級(jí)
PX1=1;//外部中斷1為高優(yōu)先級(jí)
for(a=0;a<9;a++)
{
delay(500);
P1=display[a];
}
}
}
//第一個(gè)中斷函數(shù)
void int0() interrupt 0 using 1
{
uchar m;
for(m=0;m<10;m++)
{
P1=0xf0;
delay(500);
P1=0x0f;
delay(500);
}
}
//第二個(gè)中斷函數(shù)
voide int1() interrupt 1 using 2
{
uchar b;
for(b=0;b<10;b++)
{
P1=0x00;
delay(500);
P1=0xff;
delay(500);
}
}
定時(shí)計(jì)數(shù)器
采用12MHz晶振揭朝,則計(jì)數(shù)周期為
將3C,B0分別預(yù)制給TH1条霜,TL1.