C51 中断 如何 快速反应
时间:10-02
整理:3721RD
点击:
最近没事折腾下C51,看到,下面这段程序,//stc11f01单片机,12m晶振,rst用作p3.6
//爆闪灯,多种模式,带数码管显示
#include <reg51.h>
sbit out_1=P3^7; //爆闪输出1
sbit out_2=P1^1; //爆闪输出2
sbit out_3=P1^5; //爆闪输出3
sbit out_4=P1^7; //爆闪输出4
sbit a=P1^2; //数码管段位a
sbit b=P1^6; //数码管段位b
sbit c=P3^6; //数码管段位c
sbit d=P3^0; //数码管段位d
sbit e=P3^1; //数码管段位e
sbit f=P1^0; //数码管段位f
sbit g=P3^4; //数码管段位g
//unsigned int f=2000;
unsigned int cnt,cout,l,v,m,t; //定义变量
void delay (unsigned int k) //延时程序
{
unsigned int i,j;
for (i=0;i<k;i++)
{
for (j=0;j<=121;j++)
{;}
}
}
void init(void) //初始化
{
PX1=1;
EX1 =1;
IT1 =1;
EA=1;
}
void extern_int1(void) interrupt 2 //中断按键检测
{
delay(35);
cout++;
if(cout==9)
{
cout=0;
}
}
void IN_SYSTEM_init(void)//定时器初始化
{
TMOD = 0X11;
TH1=-(30000/256);
TL1=-(30000/256);
ET1=1;
TR1=1;
TH0=-(30000/256);
TL0=-(30000/256);
ET0=1;
TR0=1;
EA=1;
}
//***********************************************定时器0中断服务函数
void time0_int (void) interrupt 1
{
TH0=-(30000/256);
TL0=-(30000%256);
out_1= ~out_1;
out_2=~out_2;
}
//***************************************************定时器1中断服务函数
void time1_int (void) interrupt 3
{
TH1=-(30000/256);
TL1=-(30000%256);
out_3=~out_3;
out_4=~out_4;
}
//****************************************************
void k_1(void) //按键切换
{
switch(cout)
{
//****************************************************
//**************************************************** 第一种变化,交替闪
case 1:
a=b=c=d=e=f=g=1;
b=c=0;
delay(200) ;
EX1 =0;
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(80);
}
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(80);
}
EX1 =1;
break;
//------------------------------------------2渐快闪
case 2:
a=b=c=d=e=f=g=1;
a=b=d=e=g=0;
EX1 =0;
m+=10;
if(m>150) { m=0; }
for(t=0;t<=23;t++)
{
TR1=0;
TR0=1;
out_1=out_2=out_3=out_4=1;
delay(150-m);
}
delay(150-m);
for(t=0;t<=23;t++)
{ TR1=1;
TR0=0;
out_1=out_2=out_3=out_4=1;
delay(150-m);
}
EX1 =1;
break;
//**************************************************** 3快全闪,
case 3:
a=b=c=d=e=f=g=1;
a=b=c=d=g=0;
EX1 =0;
for(t=0;t<=20;t++)
{
TR1=1;
TR0=1;
delay(100);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(1000);
EX1 =1;
break;
//****************************************************4慢全闪
case 4:
a=b=c=d=e=f=g=1;
b=c=f=g=0;
EX1 =0;
for(t=0;t<=20;t++)
{
TR1=1;
TR0=1;
delay(100);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(2500);
EX1 =1;
break;
//****************************************************5全闪
case 5:
a=b=c=d=e=f=g=1;
a=c=d=f=g=0;
EX1 =0;
TR1=1;
TR0=1;
delay(150);
EX1 =1;
break;
//****************************************************6交替闪再全闪
case 6:
a=b=c=d=e=f=g=1;
a=c=d=e=f=g=0;
EX1 =0;
for(l=0;l<=3;l++)
{
for(cnt=0;cnt<=13;cnt++)
{ out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(150);
}
for(cnt=0;cnt<=13;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(150);
}
}
for(v=0;v<=3;v++)
{
for(cnt=0;cnt<=10;cnt++)
{
TR1=1;
TR0=1;
delay(150);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(1000);
}
EX1 =1;
break;
//***************************************************7流水闪烁
case 7:
a=b=c=d=e=f=g=1;
a=b=c=0;
EX1 =0;
TR1=0;
out_1=out_2=out_3=out_4=1;
TR0=0;
for(t=0;t<=13;t++)
{
out_4= ~out_4;
delay(100);
}
for(t=0;t<=13;t++)
{
out_3= ~out_3;
delay(100);
}
for(t=0;t<=13;t++)
{
out_2= ~out_2;
delay(100);
}
for(t=0;t<=13;t++)
{
out_1= ~out_1;
delay(100);
}
EX1 =1;
break;
//****************************************************8左右交替长闪
case 8:
a=b=c=d=e=f=g=1;
a=b=c=d=e=f=g=0;
EX1 =0;
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(300);
}
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(300);
}
EX1 =1;
break;
//****************************************************0全灭
case 0:
a=b=c=d=e=f=g=1;
EX1 =0;
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=0;
EX1 =1;
break;
}
}
//**************************************************** 主程序
void main (void)
{
init();
IN_SYSTEM_init();
while (1)
{
k_1();
}
}
///////////////////////////////////////////////
程序有的地方可以借鉴,求助一个问题,这个程序在按键切换后,程序不能立即能切换到需要的位置,感觉好像要等该段程序结束后才会跳转到下一个。
请教下怎么改进。
//爆闪灯,多种模式,带数码管显示
#include <reg51.h>
sbit out_1=P3^7; //爆闪输出1
sbit out_2=P1^1; //爆闪输出2
sbit out_3=P1^5; //爆闪输出3
sbit out_4=P1^7; //爆闪输出4
sbit a=P1^2; //数码管段位a
sbit b=P1^6; //数码管段位b
sbit c=P3^6; //数码管段位c
sbit d=P3^0; //数码管段位d
sbit e=P3^1; //数码管段位e
sbit f=P1^0; //数码管段位f
sbit g=P3^4; //数码管段位g
//unsigned int f=2000;
unsigned int cnt,cout,l,v,m,t; //定义变量
void delay (unsigned int k) //延时程序
{
unsigned int i,j;
for (i=0;i<k;i++)
{
for (j=0;j<=121;j++)
{;}
}
}
void init(void) //初始化
{
PX1=1;
EX1 =1;
IT1 =1;
EA=1;
}
void extern_int1(void) interrupt 2 //中断按键检测
{
delay(35);
cout++;
if(cout==9)
{
cout=0;
}
}
void IN_SYSTEM_init(void)//定时器初始化
{
TMOD = 0X11;
TH1=-(30000/256);
TL1=-(30000/256);
ET1=1;
TR1=1;
TH0=-(30000/256);
TL0=-(30000/256);
ET0=1;
TR0=1;
EA=1;
}
//***********************************************定时器0中断服务函数
void time0_int (void) interrupt 1
{
TH0=-(30000/256);
TL0=-(30000%256);
out_1= ~out_1;
out_2=~out_2;
}
//***************************************************定时器1中断服务函数
void time1_int (void) interrupt 3
{
TH1=-(30000/256);
TL1=-(30000%256);
out_3=~out_3;
out_4=~out_4;
}
//****************************************************
void k_1(void) //按键切换
{
switch(cout)
{
//****************************************************
//**************************************************** 第一种变化,交替闪
case 1:
a=b=c=d=e=f=g=1;
b=c=0;
delay(200) ;
EX1 =0;
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(80);
}
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(80);
}
EX1 =1;
break;
//------------------------------------------2渐快闪
case 2:
a=b=c=d=e=f=g=1;
a=b=d=e=g=0;
EX1 =0;
m+=10;
if(m>150) { m=0; }
for(t=0;t<=23;t++)
{
TR1=0;
TR0=1;
out_1=out_2=out_3=out_4=1;
delay(150-m);
}
delay(150-m);
for(t=0;t<=23;t++)
{ TR1=1;
TR0=0;
out_1=out_2=out_3=out_4=1;
delay(150-m);
}
EX1 =1;
break;
//**************************************************** 3快全闪,
case 3:
a=b=c=d=e=f=g=1;
a=b=c=d=g=0;
EX1 =0;
for(t=0;t<=20;t++)
{
TR1=1;
TR0=1;
delay(100);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(1000);
EX1 =1;
break;
//****************************************************4慢全闪
case 4:
a=b=c=d=e=f=g=1;
b=c=f=g=0;
EX1 =0;
for(t=0;t<=20;t++)
{
TR1=1;
TR0=1;
delay(100);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(2500);
EX1 =1;
break;
//****************************************************5全闪
case 5:
a=b=c=d=e=f=g=1;
a=c=d=f=g=0;
EX1 =0;
TR1=1;
TR0=1;
delay(150);
EX1 =1;
break;
//****************************************************6交替闪再全闪
case 6:
a=b=c=d=e=f=g=1;
a=c=d=e=f=g=0;
EX1 =0;
for(l=0;l<=3;l++)
{
for(cnt=0;cnt<=13;cnt++)
{ out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(150);
}
for(cnt=0;cnt<=13;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(150);
}
}
for(v=0;v<=3;v++)
{
for(cnt=0;cnt<=10;cnt++)
{
TR1=1;
TR0=1;
delay(150);
}
TR1=0;
TR0=0;
out_1= 1;
out_2=1;
out_3=1;
out_4=1;
delay(1000);
}
EX1 =1;
break;
//***************************************************7流水闪烁
case 7:
a=b=c=d=e=f=g=1;
a=b=c=0;
EX1 =0;
TR1=0;
out_1=out_2=out_3=out_4=1;
TR0=0;
for(t=0;t<=13;t++)
{
out_4= ~out_4;
delay(100);
}
for(t=0;t<=13;t++)
{
out_3= ~out_3;
delay(100);
}
for(t=0;t<=13;t++)
{
out_2= ~out_2;
delay(100);
}
for(t=0;t<=13;t++)
{
out_1= ~out_1;
delay(100);
}
EX1 =1;
break;
//****************************************************8左右交替长闪
case 8:
a=b=c=d=e=f=g=1;
a=b=c=d=e=f=g=0;
EX1 =0;
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=1;
TR0=0;
delay(300);
}
for(cnt=0;cnt<=15;cnt++)
{
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=1;
delay(300);
}
EX1 =1;
break;
//****************************************************0全灭
case 0:
a=b=c=d=e=f=g=1;
EX1 =0;
out_1=out_2=out_3=out_4=1;
TR1=0;
TR0=0;
EX1 =1;
break;
}
}
//**************************************************** 主程序
void main (void)
{
init();
IN_SYSTEM_init();
while (1)
{
k_1();
}
}
///////////////////////////////////////////////
程序有的地方可以借鉴,求助一个问题,这个程序在按键切换后,程序不能立即能切换到需要的位置,感觉好像要等该段程序结束后才会跳转到下一个。
请教下怎么改进。