任务描述
某企业承担了某抢答比赛抢答器系统的设计,要求如下:①可同时供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++); }