所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。
proteus原理图:
1.外部中断:
代码:
#include
#include
#define uint unsigned
int
#define uchar unsigned char
uchar
temp; //声明一个全局变量
void delay(uint delay_time);
void
main()
{
EA=1; //开总中断
EX0=1; //开外部中断0
IT0=0; //设置有效方式为低电平有效
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 //中断后执行内容(这个不用声明)
{
EA=0;
temp=P0; //temp做传递变量,保证中断结束后继续中断发生时的操作
P0=0xff;
delay(1000);
P0=temp;
EA=1;
}
proteus仿真结果:
2.定时器中断
代码:
#include
#include
#define uint unsigned
int
#define uchar unsigned char
uint
n; //全局变量
uchar code
table_led[]={ //这个亮灯的16进制码
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff};
void
main()
{
n=0;
TH0=(65536-20000)/256; //赋初值
TL0=(65536-20000)%6;
TMOD=0X01; //设置工作方式为工作方式1(16位计数器)
EA=1; //开总中断
ET0=1; //开定时器中断0
TR0=1; //启动定时器中断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;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』