51单片机的八路抢答器设计

一.硬件方案

        本设计 利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。整体电路主要由51单片机最小系统,数码管显示电路,蜂鸣器提示电路,按键模块;原理图如图:

仿真图如图:

二.设计功能

  • 采用4位数码管设计;下排按键一一对应八位选手。
  • 竖排三个按键,从上到下依次为:开始、暂停、复位。
  • 操作流程:上电后数码管显示“----”当主持人按下“开始”键后,60秒,开始计时,此时,八位选手就可以抢答,如有紧急情况需要停止的话,主持人按“暂停”键就可以,如果有选手抢答成功,数码管显示“1 25”,1表示是1号选手,25表示剩余还25秒,小于5秒时,蜂鸣器响,提示时间快要结束,当为0秒时,此题结束,表示没有任何选手抢答成功,主持人按“复位”键后从新开始。
  • 可以设定时间,在上电后,数码管显示“----”,此时按下1号选手对应的按键,进入时间设定状态,2号选手对应的按键为时间加,3号选手对应的按键为时间减,设定完成后再按1号选手键退出。

三.软件设计

主程序源码

void main()
{
int djs1=60;
Timer0_init();     //初始化定时器中断
spk=1;              //蜂鸣器不响
        djs=60;        //倒计时赋值
while(1)
{

LOOP1:   
djs=djs1;
djsxs22();    //LOOP1是标号,显示 -  --

if(key1==0)         //在定时器运行状态下,key1==0 则说明1号选手按下按键
{
   delayms(3);
   if(key1==0)
   { 
      while(!key1);      //去除按键抖动后,重新在判断,是否确实按下
      djs=60;
      while(1)
      {
         TR0=0;          //定时器停止
         djsxs();      
         if(key2==0)      //复位按下按下
         {    
             delayms(8);           //去除抖动
             if(key2==0)       //再次判断是否按下复位按键
             {
                 do
                 { 
                     while(!key2); //如果按下复位键,则回到- --状态
                     delayms(5);
                 }
                 while(key2!=1);
                 djs++;
                 djs1=djs;
             }
          }
          if(key3==0)      //复位按下按下
          {    
             delayms(8);           //去除抖动
             if(key3==0)       //再次判断是否按下复位按键
             { 
                do
                {
                    while(!key3); //如果按下复位键,则回到- --状态
                    delayms(5);    
                }
                while(key3!=1);
                djs--;
                djs1=djs;
             }
           }
           if(key1==0)      //复位按下按下
           {    
              delayms(3);           //去除抖动
              if(key1==0)       //再次判断是否按下复位按键
              { 
                 while(!key1); //如果按下复位键,则回到- --状态
                 goto LOOP1;          //goto语句,回到loop1表号处
              }
           }                                           
         }
       }
     }
     if(keyks==0)
     {           
        //spk=0;
        delayms(3);         //去除按键抖动
        if(keyks==0)
        { 
           while(!keyks);      //以上表示按下开始按键 
           //spk=1;               //蜂鸣器不响
           TR0=1;               //启动定时器 开始倒计时
           while(1)
           {
              djsxs();
              if(keytz==0)
              {
                  delayms(3);             //此处表示出去抖动, 以后不一一标出
                  if(keytz==0)
                  { 
                     while(!keytz);       //以上表示按下停止按键后 
                     {
                        TR0=0;           //定时器停止
                        flag=0;//
                        spk=1;
                     }

                   }
               }
               if(keyks==0)
               {
                  //spk=0;
                  delayms(3);
                  if(keyks==0)
                  { 
                     while(!keyks);       //以上表示按下清楚按键后 
                     //spk=1;               //蜂鸣器不响
                     TR0=1;           //定时器启动

                  }
                }
                .......
              } 

            }

         }
      }
   }
}

资料链接:https://pan.baidu.com/s/1gQxHvckRl0UBPJStygP3rA?pwd=rpy5 
提取码:rpy5

  • 8
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值