首先,裁判在右方按下开始按钮,蜂鸣器响起,抢答开始,初始时间为20s,若1-8位选手按下按钮,即抢答成功,由显示屏显示该选手号码,如果超过时间(20s)没人认抢答,则时间重置为20s,并此题作废,答题结束后,按下重置按钮,这时时间重置,下次抢答开始。
创新功能(*)在没有按下开始键时,按下修改时间按钮,则时间会减少1s,由于默认时间为20s,所以这个功能可以实现20s内时间的调整
仿真原理图如下
单片机源程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
#define max 20
uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit d1=P2^4;
sbit d2=P2^5;
sbit x1=P2^6;
sbit x2=P2^7;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit zk1=P2^0;
sbit zk2=P2^1;
sbit buz=P2^2;
uchar d_num,cnt;
uchar x_flag;
void jianpan();
void init(void)
{
TMOD=0X01;
TL0=0XB0;
TH0=0X3C;
// TR0=1;
ET0=1;
EA=1;
d_num=max;
}
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void display()
{
d1=0; //位选端;
P0=tab[d_num/10];//显示倒计时
delay(5);
d1=1;
d2=0;
P0=tab[d_num%10];
delay(5);
d2=1;
x1=0; //位选端
P0=tab[x_flag/10];//显示选手号
delay(5);
x1=1;
x2=0;
P0=tab[x_flag%10];
delay(5);
x2=1;
}
void main()
{ init();
while(1)
{
jianpan();
display();
}
}
void timer0(void) interrupt 1
{
TL0=0XB0; //重装初值
TH0=0X3C;
cnt++;
if(cnt==20)//1 秒时间到
{
cnt=0;//计数清零
d_num--;
if(d_num==0)
{
d_num=max;
TR0=0; //关闭所有操作
}
buz=0;
delay(20);
buz=1;
}
}
void jianpan()
{ if(zk1==0&&x_flag==0)
{
delay(5);
x_flag=0;
TR0=1;
}
if(zk2==0&&TR0==0)
{
delay(5);
if(zk2==0&&TR0==0)
{
if(x_flag==0)
{
d_num--; //设置倒计时
buz=0;
delay(20);
buz=1; }
if(d_num==5)
d_num=max;
if(x_flag!=0) //选手显示清零
{
x_flag=0;
d_num=max;
TR0=0;
buz=0;
delay(20);
buz=1;
}
while(!zk2)
display();
}
}
if(k1==0&&TR0==1)
{
delay(5);
if(k1==0&&TR0==1)
{
x_flag=1;
TR0=0;
}
}
if(k2==0&&TR0==1)
{
delay(5);
if(k2==0&&TR0==1)
{x_flag=2;TR0=0;}
}
if(k3==0&&TR0==1)
{
delay(5);
if(k3==0&&TR0==1)
{x_flag=3;TR0=0;}
while(!k3)
display();
}
if(k4==0&&TR0==1)
{
delay(5);
if(k4==0&&TR0==1)
{x_flag=4;TR0=0;}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』