当前位置:首页 > 单片机 > 单片机
[导读] 所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。proteus原理图:1.外部中断:代码:#include#include

所有的中断(外部中断,定时器中断……)运行的结果都是一样的:流水灯逐个点亮,当中断响应的时候,流水灯全部熄灭,当中断结束的时候,流水灯继续刚才的流动。

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;
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭