Interrupt(單片機(jī)中斷)
所有的中斷(外部中斷,定時(shí)器中斷……)運(yùn)行的結(jié)果都是一樣的:流水燈逐個(gè)點(diǎn)亮,當(dāng)中斷響應(yīng)的時(shí)候,流水燈全部熄滅,當(dāng)中斷結(jié)束的時(shí)候,流水燈繼續(xù)剛才的流動(dòng)。
proteus原理圖:
1.外部中斷:
代碼:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp;//聲明一個(gè)全局變量
void delay(uint delay_time);
void main()
{
EA=1;//開總中斷
EX0=1;//開外部中斷0
IT0=0;//設(shè)置有效方式為低電平有效
while(1)
{
uint i;
P0=0XFE;
delay(1000);
for(i=0;i<7;i++)
{
P0=P0<<1;
delay(1000);
}
P0=0xff;
delay(1000);
}
}
void delay(uint delay_time)
{
uint x,y;
for(x=delay_time;x>0;x--)
for(y=112;y>0;y--)
{;}
}
void INTERRUPT() interrupt 0//中斷后執(zhí)行內(nèi)容(這個(gè)不用聲明)
{
EA=0;
temp=P0;//temp做傳遞變量,保證中斷結(jié)束后繼續(xù)中斷發(fā)生時(shí)的操作
P0=0xff;
delay(1000);
P0=temp;
EA=1;
}
proteus仿真結(jié)果:
2.定時(shí)器中斷
代碼:
#include
#include
#define uint unsigned int
#define uchar unsigned char
uint n;//全局變量
uchar code table_led[]={//這個(gè)亮燈的16進(jìn)制碼
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff};
void main()
{
n=0;
TH0=(65536-20000)/256;//賦初值
TL0=(65536-20000)%6;
TMOD=0X01;//設(shè)置工作方式為工作方式1(16位計(jì)數(shù)器)
EA=1;//開總中斷
ET0=1;//開定時(shí)器中斷0
TR0=1;//啟動(dòng)定時(shí)器中斷0
while(1)
{
switch(n/50)//沒20ms一次中斷,20*50=1s
{
case 0: P0=table_led[8]; break;
case 1: P0=table_led[0]; break;
case 2: P0=table_led[1]; break;
case 3: P0=table_led[2]; break;
case 4: P0=table_led[3]; break;
case 5: P0=table_led[8]; break;
case 6: P0=table_led[4]; break;
case 7: P0=table_led[5]; break;
case 8: P0=table_led[6]; break;
case 9: P0=table_led[7]; break;
}
}
}
void INTERRUPT( )interrupt 1
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%6;
n++;
if(n==500)
n=0;
}