在开始键未按下的时候,分钟的加减键可以顺畅的加减,但是秒钟按下加一后红外接收器就没有反应了;按下开始键后,分数加减也是只能加一之后红外接收器就没反应了。想知道程序有什么问题。
#include<reg51.h>
#include <intrins.h>
#define LEDData P0
#define uchar unsigned char
#define uint unsigned int
uchar time;
uchar code LEDCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管的段码编码
uchar table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int minit,second,count,count1,playon=0,ad1=1,dec1=1,exchange=1,ad2=1,dec2=1,p24_sec=1,jy,jz;
char min=15,sec=0;
uchar IRCOM[7];
sbit IRIN=P3^2; //红外接收器数据线
sbit secondpoint=P0^7; //秒闪动点
//依次点亮数码管的位
sbit AA1=P2^0;//一队得分
sbit AA2=P2^1;
sbit AA3=P2^2;
sbit BB1=P2^4;//二队得分
sbit BB2=P2^5;
sbit BB3=P2^6;
sbit DD1=P3^0;//24秒
sbit DD2=P3^1;
sbit CC1=P3^4;//比赛时间
sbit CC2=P3^5;
sbit CC3=P3^6;
sbit CC4=P3^7;
sbit alam=P1^7; //报警
bit timeover=0; //比赛结束标志位,为1时表示时间已经完
bit AorB=0; //甲乙对交换位置标志位
bit halfsecond=0; //半秒标志位
uint scoreA; //甲队得分
uint scoreB; //乙队得分
char sec24=24;
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void Delay5ms(void)
{
unsigned int i;
for(i=100;i>0;i--);
}
void IR_init(void) //红外初始化
{
IT0=0;
EX0=1;
EA=1;
IRIN=1; //相当于打开外部中断0 此处意义为红外接收器打开
}
void time0_init(void)
{ //定时器初始化
TMOD=0x11;//TR1和TR0都选用直接启动且定时时间为0.05s的定时器
TL0=0xb0;//定时时间为0.05s,T0和T1的初值都为15536
TH0=0x3c;
TL1=0xb0;
TH1=0x3c;
minit=min; //初始值为15:00
second=sec; //初始值为0
EA=1;//打开总中断
ET0=1;//启动定时器0
ET1=1;//启动定时器1
TR0=0;//计时器0,1先停止计数
TR1=0;
IT0=1;//定时器0设为下降沿触发
IT1=1;//定时器1也设为下降沿触发
PX0=1;//外部中断1设为高优先级
PT0=0;//定时器0设为低优先级
P1=0xFF;//端口初始化
P3=0xFF;
}
void display(void)
{
//显示时间分
CC1=0;
LEDData=LEDCode[minit/10];
Delay5ms();
CC1=1;
CC2=0;
LEDData=LEDCode[minit%10];
Delay5ms();
CC2=1;
//秒点闪动
if(halfsecond==1)
LEDData=0x7f;
else
LEDData=0xff;
CC2=0;
Delay5ms();
CC2=1;
secondpoint=0;
//显示时间秒
CC3=0;
LEDData=LEDCode[second/10];
Delay5ms();
CC3=1;
CC4=0;
LEDData=LEDCode[second%10];
Delay5ms();
CC4=1;
//显示1组的分数百位
AA3=0;
if(AorB==0)//交换位置
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
Delay5ms();
AA3=1;
//显示1组分数的十位
AA2=0;
if(AorB==0)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
Delay5ms();
AA2=1;
//显示1组分数的个位
AA1=0;
if(AorB==0)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
Delay5ms();
AA1=1;
//显示2组分数的百位
BB3=0;
if(AorB==1)
LEDData=LEDCode[scoreA/100];
else
LEDData=LEDCode[scoreB/100];
Delay5ms();
BB3=1;
//显示2组分数的十位
BB2=0;
if(AorB==1)
LEDData=LEDCode[(scoreA%100)/10];
else
LEDData=LEDCode[(scoreB%100)/10];
Delay5ms();
BB2=1;
//显示2组分数的个位
BB1=0;
if(AorB==1)
LEDData=LEDCode[scoreA%10];
else
LEDData=LEDCode[scoreB%10];
Delay5ms();
BB1=1;
//显示时间分
DD2=0;
LEDData=LEDCode[sec24/10];
Delay5ms();
DD2=1;
DD1=0;
LEDData=LEDCode[sec24%10];
Delay5ms();
DD1=1;
}
//按键检测程序
void keyscan(void)
{
if(playon==0)
{
if(ad1==0)
{
ad1=1;
display();
if(minit<99)
minit++;
else{
minit=99;
min=minit;}
}
if(dec1==0)
{
dec1=1;
display();
if(minit>0)
minit--;
else{
minit=0;
min=minit;}
}
if(ad2==0)
{
ad2=1;
display();
if(second<59)
second++;
else{
second=59;
sec=second;}
}
if(dec2==0)
{
dec2=1;
display();
if(second>0)
second--;
else{
second=0;
sec=second;}
}
if(exchange==0)
{
exchange=1;
display();
TR1=0; //关闭T1计数器
alam=1; //关报警
AorB=~AorB; //开启交换
minit=min; //并将时间预设为15:00
second=sec;
sec24=24;
}
}
else
{
if(ad1==0)
{
ad1=1;
display();
if(AorB==0)
{
if(scoreA<999)
scoreA++;
else
scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
if(dec1==0)
{
dec1=1;
display();
if(AorB==0)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
if(ad2==0)
{
ad2=1;
display();
if(AorB==1)
{
if(scoreA<999)
scoreA++;
else
scoreA=999;
}
else
{
if(scoreB<999)
scoreB++;
else
scoreB=999;
}
}
if(dec2==0)
{
dec2=1;
display();
if(AorB==1)
{
if(scoreA>0)
scoreA--;
else
scoreA=0;
}
else
{
if(scoreB>0)
scoreB--;
else
scoreB=0;
}
}
if(p24_sec==0)
{
p24_sec=1;
display();
sec24=24;
TR0=1;
alam=1;
}
}
}
//主函数
void main(void)
{
IR_init();
time0_init();
alam=1;
while(1)
{
while(1)
{
while(jy==jz)
{
if(timeover==1)
{
timeover=0;
}
switch(jz)
{
case 1:ad1=0;break;
case 2:dec1=0;break;
case 3:if(playon==0)
{
playon=1; //开始标志位
TR0=1; //开启计时
if((minit+second)==0)
{
sec24=24;
minit=min;
second=sec;
}
}
else
{
playon=0; //开始标志位清零,表示暂停
TR0=0; //暂时计时
}break;
case 4:ad2=0;break;
case 5:dec2=0;break;
case 6:exchange=0;break;
case 7:p24_sec=0;break;
}
jy--;
}
keyscan();
display();
Delay5ms();
Delay5ms();
}
}
}
void IR() interrupt 0 //执行中断:进行读取信号 最后产生键值
{
unsigned char j,k,N=0;
delay(15);
if (IRIN==1)
{ EX1 =1;
return;
}
while (!IRIN)
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN)
{delay(1);}
while (!IRIN)
{delay(1);}
while (IRIN)
{
delay(1);
N++;
if (N>=30)
{ EX1=1;
return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX1=1;
return; }
switch(IRCOM[2])
{
case 0x0c:jz=1;break;
case 0x18:jz=2;break;
case 0x5e:jz=3;break;
case 0x08:jz=4;break;
case 0x1c:jz=5;break;
case 0x5a:jz=6;break;
case 0x42:jz=7;break;
default:break;
}
jy=jz;
}
void time0_int(void) interrupt 1 //启动定时器0
{
TL0=0xb0;
TH0=0x3c;
TR0=1;
count++;
if(count==10)
{
halfsecond=0;
}
if(count==20)
{
count=0;
halfsecond=1;
// if(second>0)
{
second--;
if(second<0)
{
if(minit>0)
{
second=59;
minit--;
}
else
{
second=0;
timeover=1;
playon=0;
TR0=0;
TR1=1;
}
}
sec24--;
if(sec24<=0)
{
if((minit+second)!=0)
{
alam=0;
TR0=0;
}
sec24=0;
}
}
}
}
void time1_int(void) interrupt 3//开定时器中断1
{
TL1=0xb0;
TH1=0x3c;
TR1=1;
count1++;
if(count1==10)
{
alam=0;
}
if(count1==20)
{
count1=0;
alam=1;
}
}