📄 八路倒计时抢答器.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key8=P3^0;
sbit key9=P3^1;
sbit key10=P3^2;
sbit key11=P3^3;
sbit beep=P3^4;
sbit dula=P3^5;
uchar temp,t0,temp1,flag2,c,flag;
uint table1[]={50,50,50,50,50,50,50,50};
uint shu;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uint b,uchar a);
void jia_jian(uchar a);
void start();
void keyscan();
void qiangda();
void init()
{
shu=50; //设定每人的初始分是50;当等于0时或者等于100时,抢答结束初始化
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
temp=0;
P1=0xff;
}
void main()
{
init();
while(1)
{
if(key11==0)
{
delay(5);
if(key11==0)
{
start();
}
}
if(flag2!=1)
{
keyscan();
display(temp,c);
}
else
{
jia_jian(c);
display(table1[c-1],c);//抢答到了,那么数码管第一位显示抢到的人编号,后3位显示当前人所得的分数
}
}
}
void display(uint b,uchar a)
{
uchar bai,shi,ge;
bai=b/100;
shi=b%100/10;
ge=b%10;
P2=0xfd;
dula=1;
P0=table[bai];
dula=0;
delay(5);
P0=0xff;
P2=0xfb;
dula=1;
P0=table[shi];
dula=0;
delay(5);
P0=0xff;
P2=0xf7;
dula=1;
P0=table[ge];
dula=0;
delay(5);
P0=0xff;
P2=0xfe;
dula=1;
P0=table[a];
dula=0;
delay(5);
P0=0xff;
}
void keyscan()
{
if(key8==0)//按下确认键
{
delay(5);
if(key8==0)
{
beep=0;
delay(100);
beep=1;
temp=20;
TR0=1;
flag=1;
while(!key8);
}
}
if(flag==1)
{
qiangda();//抢答开始
if(t0==20)
{
t0=0;
temp--;
if(temp==0)//假如20S内没有人抢答
{
TR0=0;
flag=0;
beep=0;
delay(1000);
beep=1;
}
}
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t0++;
}
void qiangda()
{
temp1=P1;
while(temp1!=0xff)
{
delay(5);
temp1=P1;
while(temp1!=0xff)
{
temp1=P1;
flag2=1;//确定有人抢答的标志位
TR0=0;
t0=0;
flag=0;
beep=0;
delay(1000);
beep=1;
switch(temp1)
{
case 0xfe:c=1;break;
case 0xfd:c=2;break;
case 0xfb:c=3;break;
case 0xf7:c=4;break;
case 0xef:c=5;break;
case 0xdf:c=6;break;
case 0xbf:c=7;break;
case 0x7f:c=8;break;
}
while(temp1!=0xff)
{
temp1=P1;
}
}
}
}
void jia_jian(uchar a)
{
uchar i;
shu=table1[a-1];
if(key9==0)
{
delay(5);
if(key9==0)
{
shu=shu+5;
if(shu==100)//表示该编号胜利,蜂鸣器间隔响动
{
shu=999;
for(i=0;i<6;i++)
{
beep=0;
delay(1000);
beep=1;
}
}
while(!key9);
}
}
if(key10==0)
{
delay(5);
if(key10==0)
{
shu=shu-5;
if(shu==0)//表示该编号失败,蜂鸣器响6s
{
shu=500;
beep=0;
delay(6000);
beep=1;
}
while(!key10);
}
}
table1[a-1]=shu;
}
void start()
{
P2=0;
dula=1;
P0=0x3f;
dula=0;
delay(5);
P0=0xff;
temp=t0=temp1=flag2=c=0;
P1=0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -