单片机主程序一加入中断,就无法执行死循环里面的命令。
程序如下:10、设计一控制系统并仿真:包括3个按键(A、B、C键)、8个LED和2位7段数码管。
按A键后开始1个LED灯左循环,第二轮2LED个灯左循环,第三轮3LED个灯左循环,第四轮回到一个灯左循环;
同时7段数码管循环显示0-9。按B、C键分别用于增加和减少跑马灯及数码管的显示速度。
添加中断后,数码管会亮,但是跑马灯就不会再显示了。注释掉中断,跑马灯就又可以了。
单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dsy_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴
sbit ka=P3^4;
sbit kb=P3^5;
sbit kc=P3^6;
sbit LE2=P2^6;
sbit LE3=P2^7;
int a=0; //控制是否开始跑马灯
int n=5; //控制闪烁的频率
void delay(uint x)
{
uchar t;
while(x--)
for(t=0;t<120;t++);
}
void key()
{
if(ka==0)
{
delay(20);
if(ka==0)
{
a=1;
}
while(!ka);
}
}
void key2()
{
if(kb==0)
{
delay(20);
if(kb==0)
{
n--;
}
while(!kb);
}
if(kc==0)
{
delay(20);
if(kc==0)
{
n++;
}
while(!kc);
}
}
void init()
{
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
EA=1;
ET1=1;
TR1=1;
TF1=0;
}
void main()
{
int i;
int b;
int led;
init();
P3=0xff;
while(1)
{
key();
if(a==1)
{
while(1)
{
led=0xfe; //一个灯循环左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
led=0xfc; //两个灯循环左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
led=0xf8; //三个灯循环左移
for(i=0;i<8;i++)
{
P1=led;
led=_crol_(led,1);
key2();
for(b=0;b<n;b++)
{
delay(40);
}
}
}
}
}
}
void timer() interrupt 3
{
int c;
LE2=0;
LE3=0;
TH1=0xd8;
TL1=0xf0;
TF1=0;
for(c=0;c<9;c++)
{
LE3=1;
P0=0xdf;
LE3=0;
LE2=1;
P0=dsy_code[c];
delay(100);
LE2=0;
LE3=1;
P0=0xef;
LE3=0;
LE2=1;
P0=dsy_code[0];
delay(20);
LE2=0;
}
}
|