for(j=0;j<120;j++);//数120次,约1ms
}
//=======================================主函数============================================================
voidmain()
{
uchark=100;//循环用变量
time_init();//定时器初始化
temp1=time1;temp2=time2;//time1=10,time2=60
while
(1)
{
if(flag4==1){convert_data(temp1);}//响应选手,显示抢答倒计时
elseif(flag3==1){convert_data(temp2);}//有人抢答,显示回答倒计时
scan_smg();//数码管扫描显示
if(s10==0){delay1m(3);if(s10==0){flag4=1;flag3=flag1=0;TR0=TR1=0;alarm=1;temp1=time1;temp2=time2;}}
while(flag4)//响应选手按键
{
if(flag4==1){convert_data(temp1);}//时间转换,响应选手时显示的是抢答倒计时
elseif(flag3==1){convert_data(temp2);}//有人抢答,显示回答倒计时
if(flag1==0){key_time1();key_time2();}
if(s9==0){delay1m(3);if(s9==0){flag1=flag4=1;flag3=0;TR0=1;TR1=0;alarm=1;temp1=time1;}}
if(s10==0){delay1m(3);if(s10==0){flag4=1;flag1=flag3=0;TR0=TR1=0;alarm=1;temp1=time1;temp2=time2;}}
scan_smg();//数码管扫描显示
if(flag1==1)//正常抢答
{
if(!
s1)
{
delay1m(3);
if(!
s1)//1号按下,定时器停止,显示【灭灭1],关蜂鸣器,不再响应选手号,回答倒计时标记,显示选手号后立马进入答题倒计时,开定时器0
{
buf[2]=1;TR0=TR1=0;buf[0]=buf[1]=11;alarm=1;flag4=0;flag3=1;while(k>0){scan_smg();k--;}TR0=1;
}
}
elseif(!
s2)
{
delay1m(3);
if(!
s2)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=2;haha;
}
}
elseif(!
s3)
{
delay1m(3);
if(!
s3)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=3;haha;
}
}
elseif(!
s4)
{
delay1m(3);
if(!
s4)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=4;haha;
}
}
elseif(!
s5)
{
delay1m(3);
if(!
s5)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=5;haha;
}
}
elseif(!
s6)
{
delay1m(3);
if(!
s6)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=6;haha;
}
}
elseif(!
s7)
{
delay1m(3);
if(!
s7)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=7;haha;
}
}
elseif(!
s8)
{
delay1m(3);
if(!
s8)//2号按下,定时器停止,显示【灭灭2】
{
buf[2]=8;haha;
}
}
k=100;//重新赋值
}
elseif(flag1==0)//犯规抢答
{
if(!
s1)
{
delay1m(3);
if(!
s1)//1号按下显示【灭灭1】
{
buf[2]=1;buf[0]=buf[1]=11;flag4=flag3=0;alarm=0;TR1=1;//开定时器1,蜂鸣器快速鸣响
}
}
elseif(!
s2)
{
delay1m(3);
if(!
s2)//2号按下显示【灭灭2】,
{
buf[2]=2;heihei;
}
}
elseif(!
s3)
{
delay1m(3);
if(!
s3)//3号按下显示【灭灭3】,
{
buf[2]=3;heihei;
}
}
elseif(!
s4)
{
delay1m(3);
if(!
s4)//3号按下显示【灭灭3】,
{
buf[2]=4;heihei;
}
}
elseif(!
s5)
{
delay1m(3);
if(!
s5)//3号按下显示【灭灭3】,
{
buf[2]=5;heihei;
}
}
elseif(!
s6)
{
delay1m(3);
if(!
s6)//3号按下显示【灭灭3】,
{
buf[2]=6;heihei;
}
}
elseif(!
s7)
{
delay1m(3);
if(!
s7)//3号按下显示【灭灭3】,
{
buf[2]=7;heihei;
}
}
elseif(!
s8)
{
delay1m(3);
if(!
s8)//3号按下显示【灭灭3】,
{
buf[2]=8;heihei;
}
}
}
}
}
}
//========================================抢答时间调整函数============================================
voidkey_time1()
{
EA=0;//关闭总中断
if(s14==0)//进入抢答时间调整
{
delay1m(3);
if(s14==0)
{
convert_data(time1);//将10s转换成方便数码管显示的数据
do
{
scan_smg();//扫描数码管
if(s12==0)//时间+
{
delay1m(3);
if(s12==0)
{
time1++;
if(time1>60){time1=10;}
while(!
s12);//等待按键弹起
convert_data(time1);
}
}
if(s11==0)//时间-
{
delay1m(3);
if(s11==0)
{
time1--;
if(time1<10){time1=60;}
while(!
s11);
convert_data(time1);
}
}
}while(s10);//按下停止键(确定)程序往下执行
temp1=time1;alarm=0;delay1m(500);alarm=1;
}
}
EA=1;//开总中断
}
//========================================回答时间调整函数============================================
voidkey_time2()
{
EA=0;//关闭总中断
if(s13==0)//进入回答时间调整
{
delay1m(3);
if(s13==0)
{
convert_data(time2);//将60s转换成方便数码管显示的数据
do
{
scan_smg();
if(s12==0)
{
delay1m(3);
if(s12==0)
{
time2++;
if(time2>250){time2=60;}
while(!
s12);
convert_data(time2);
}
}
if(s11==0)
{
delay1m(3);
if(s11==0)
{
time2--;
if(time2<60){time2=250;}
while(!
s11);
convert_data(time2);
}
}
}while(s10);//按下停止键(确定)程序往下执行
temp2=time2;alarm=0;delay1m(500);alarm=1;
}
}
EA=1;//开总中断
}
//==============================================数码管扫描显示函数========================================
voidscan_smg()
{
if(buf[0]==0){buf[0]=11;}//屏蔽不需要显示的0
if((buf[0]==11)&&(buf[1]==0)){buf[1]=11;}//屏蔽不需要显示的0
wei3=wei2=1;wei1=0;//低位
led=display[buf[2]];
delay1m(4);led=0xff;
wei3=wei1=1;wei2=0;//中位
led=display[buf[1]];
delay1m(4);led=0xff;
wei1=wei2=1;wei3=0;//高位
led=display[buf[0]];
delay1m(4);led=0xff;
}
//=============================================数据转换函数================================================
voidconvert_data(uchardat)
{
buf[0]=dat/100;//高位
buf[1]=dat/10%10;//中位
buf[2]=dat%10;//低位
}
//================================================定时器初始化函数=========================================
voidtime_init()
{
TMOD=0x11;//定时器0,1工作于方式1,16位
TH0=(65535-50000)/256;//50ms定时
TL0=(65535-50000)%256;
TH1=(65535-25000)/256;//25ms定时
TL1=(65535-25000)%256;
TR0=TR1=0;
ET0=ET1=EA=1;//允许定时器0/1中断,开总中断
}
//=================================================定时器中断函数===========================================
voidtime0_interrupt()interrupt1
{
TH0=(65535-50000)/256;//50ms定时
TL0=(65535-50000)%256;
counter++;
if(counter==20)//1s定时
{
counter=0;
if(flag3==0)//抢答倒计时
{
temp1--;
if(temp1==5){TR1=1;alarm=0;}//5s倒计时,开定时器1,蜂鸣器响
elseif(temp1==0)//抢答倒计时结束
{
alarm=1;//关蜂鸣器
TR0=TR1=0;
flag1=0;//抢答时间到,置于犯规抢答状态
delay1m(500);
temp1=time1;//抢答时间结束,显示抢答倒计时time1
}
}
elseif(flag3==1)//回答倒计时
{
temp2--;
if(temp2==5){TR1=1;alarm=0;}//5s倒计时,开定时器1,蜂鸣器响
elseif(temp2==0)//回答倒计时结束
{
alarm=1;//关蜂鸣器
TR0=TR1=0;
flag4=1;
flag3=0;//切换到抢答倒计时
flag1=0;
delay1m(500);
temp1=time1;//回答时间结束,显示抢答倒计时time1
temp2=time2;//还原回答倒计时
}
}
}
}
//=========================================================
voidtime1_interrupt()interrupt3
{
TH1=(65535-25000)/256;//25ms定时
TL1=(65535-25000)%256;
counter1++;counter2++;
if(flag1==0)//犯规抢答时,蜂鸣器快速鸣响
{
if(counter2>3)
{
counter2=0;
alarm=~alarm;
}
}
elseif((flag1==1)&&(counter1>19))//倒计时5S鸣响
{
counter1=0;
alarm=~alarm;
}
}
#ifndef_MAIN_H_
#define_MAIN_H
#defineucharunsignedchar
#defineuintunsignedint
#defineledP0//10111111
ucharcodedisplay[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//共阳数码管驱动信号0---9,-,灭,
sbitwei3=P2^7;sbitwei2=P2^6;sbitwei1=P2^5;//数码管位选(高wei3----低wei1)
sbits1=P1^0;sbits2=P1^1;sbits3=P1^2;sbits4=P1^3;//选手1---4号
sbits5=P1^4;sbits6=P1^5;sbits7=P1^6;sbits8=P1^7;//选手5---8号
sbits9=P3^2;sbits10=P3^3;//开始,停止/确定
sbits11=P2^0;sbits12=P2^1;//时间减,时间加
sbits13=P2^2;sbits14=P2^3;//回答时间设置键,抢答时间设置键
sbitalarm=P2^4;//蜂鸣器控制端
uchartime1=10;//抢答时间
uchartime2=60;//回答时间
uchartemp1=0;//抢答时间缓存
uchartemp2=0;//回答时间缓存
ucharbuf[3]={10,10,10};//显示数据缓存,初始显示---,高----低
bitflag1=0;/*开始键是否按下标记,初始状态:
【没按下】*/
bitflag3=0;/*抢答/回答倒计时,切换标记,初始状态:
【抢答】*/
bitflag4=1;/*是否需要响应选手按键,初始状态:
【响应】*/
ucharcounter=0;//1s计数器
ucharcounter1=0;//250ms计数器
ucharcounter2=0;//100ms计数器
//========================================函数声明======================================================
voidconvert_data(uchardat);//数据转换
voidkey_time1();//抢答时间调整
voidkey_time2();//回答时间调整
voidscan_smg();//数码管扫描
voidtime_init();//定时器初始化
#endif