Interrupt(单片机中断)
扫描二维码
随时随地手机看文章
所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。
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;
}