任务描述
某企业承担了某抢答比赛抢答器系统的设计,要求如下:①可同时供3名选手参加比赛,他们的编号分别是1、2、3,每名选手各用一个抢答按钮,按钮的编号与选手的编号相对应,分别是S1、S2、S3。②给主持人设置两个控制开关“START”和”END”,用来控制系统中抢答的开始和结束。③抢答器具有数据所存、显示和声音提示的功能。抢答开始前,若有选手按动抢答按钮,视为违规,要显示其编号,并长响蜂鸣器;抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号,同时蜂鸣器给出音响提示,此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号将一直保存到主持人将系统清零为止。
硬件电路图
元件清单
C语言程序
#include
unsigned char dip[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xfb,0x80,0x90}; //共阳极数码管段码
sbit KEY9=P3^1; //开始键
sbit KEY10=P3^2; //结束键
sbit BUZZ=P3^0; //蜂鸣器
bit start_key(); //抢答开始键检测函数
bit end_key(); //抢答结束键检测函数
unsigned int number_key(); //选手按键扫描
void delay_20ms(); //延时函数
void buzz_on(); //蜂鸣器开关
void main() //主函数
{
unsigned char key_number,n;
while(1)
{
P0=0xff; //关闭数码管显示
BUZZ=1; // 关闭蜂鸣器
if(start_key()==1) //抢答允许检测
{
key_number=number_key(); //抢答开始前检测有无选手违规
if(key_number==0) //无人违规
continue; //返回
else P0=dip[key_number]; // 有人违规,显示违规选手号码
while(end_key()==1) //主持人结束键没有按下则蜂鸣器长响
buzz_on();
}
if(start_key()==0) //主持人开始键按下前无人违规抢答
{ //数码管显示“三”允许抢答
P0=0Xb6;
while (end_key()==1)
{
n=0;
key_number=number_key(); //检测是否有选手抢答
if(key_number==0)
continue;
while(key_number!=0)
{
P0=dip[key_number]; //显示第一个选手抢答的号码
for(;n<150;n++)
buzz_on(); //蜂鸣器响一会儿
if(end_key()==0) // 主持人结束键按下,结束本轮抢答
break;
}
}
}
}
}
bit start_key()
{
if(KEY9==1)
return 1; //返回值1表示主持人没有按开始键
else
delay_20ms(); //延时防抖
if(KEY9==1)
return 1;
else
return 0;
}
bit end_key()
{
if(KEY10==1)
return 1;
else
return 0;
}
unsigned int number_key()
{
unsigned char key_state=0;
key_state=P1;
if(key_state==0xff)
return 0; //返回0无选手抢答
else
{
if(key_state==0xfe) //1号抢答
return 1;
else if(key_state==0xfd) //2号抢答
return 2;
else return 3; //3号抢答
}
}
void buzz_on()
{
unsigned char i;
BUZZ=0;
for(i=0;i<26;i++)
delay_20ms();
BUZZ=1;
}
void delay_20ms()
{
unsigned int j;
for(j=0;j<10;j++);
}