51单片机抢答器设计

2023-02-24 14:30   387   0  

任务描述


某企业承担了某抢答比赛抢答器系统的设计,要求如下:①可同时供3名选手参加比赛,他们的编号分别是1、2、3,每名选手各用一个抢答按钮,按钮的编号与选手的编号相对应,分别是S1、S2、S3。②给主持人设置两个控制开关“START”和”END”,用来控制系统中抢答的开始和结束。③抢答器具有数据所存、显示和声音提示的功能。抢答开始前,若有选手按动抢答按钮,视为违规,要显示其编号,并长响蜂鸣器;抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示出选手的编号,同时蜂鸣器给出音响提示,此外,要封锁输入电路,禁止其他选手抢答。优先抢答选手的编号将一直保存到主持人将系统清零为止。




硬件电路图


48008c57-ac52-11ed-bcd2-b8ca3a6cb5c4.webp


元件清单


48008c58-ac52-11ed-bcd2-b8ca3a6cb5c4.png




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++);

 }



登录icspec成功后,会自动跳转查看全文
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。