51单片机抢答

该博客介绍了一个使用51单片机、LED、蜂鸣器和数码管构建的抢答系统。系统中,开始键启动计时器,数码管显示倒计时,三位选手通过按键抢答,10秒内答题有效,超时或他人已答则无效。提供Proteus仿真和详细代码解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   用到的硬件:51单片机,led小灯,蜂鸣器,数码管,按键

  说明:模拟抢答,有一个开始按键,按下开始键后数码管显示000,三个按键代表选手,按下开始键后k1~k3才有效,D1~D3代表三个选手的状态,亮代表在答题,10s内答题,答题期间内其他两个选手按键无效。

整个项目打包地址:51单片机简单实现抢答场景模拟-硬件开发文档类资源-CSDN下载

Proteus仿真:

 代码:

全局变量,状态:

u8 count=0;  //20是1s
u8 flag_player=0;   //0:无选手按下
u8 flag_sta=0;      //1:按下开始键
u8 time_use=0;     //用了的时间

定时器0初始化:

void int_init()   //定时器0初始化
{
  EA=1;
  ET0=1;
  TMOD=0X01;
  TH0=15536/256;
  TL0=15536%256;
}

定时器0中断处理函数:

void timer0() interrupt 1   //定时器0中断处理函数
{
  TH0=15536/256;
  TL0=15536%256;
  count++;
  if(count==20)   //满1s
  {
    count=0;
    time_use++;
    if(time_use==10)   //时间到
    {
      TR0=0;
      flag_player=0;
      time_use=0;
      led1=1;led2=1;led3=1;
    }
  }
}

按键处理函数:

void deal_key()  //按键处理函数
{
  u8 key=0;
  key=key_scan(0);
  switch(key)
  {
    case KEYSTA_PRESS:  //按下开始键
    {
      flag_sta=!flag_sta;
      break;
    }
    case KEY1_PRESS:
    {
      if(flag_player==0)
        flag_player=1;
      break;
    }
    case KEY2_PRESS:
    {
      if(flag_player==0)
        flag_player=2;
      break;
    }
    case KEY3_PRESS:
    {
      if(flag_player==0)
        flag_player=3;
      break;
    }
  }
}

主函数:
 

void main()
{
  int_init();
  while(1)
  {
    delay_10us(2000);
    deal_key();
    if(flag_sta==0&&flag_player!=0)   //有人抢答
    {
      alarm(2000);
    }
    else if (flag_sta==1&&flag_player!=0)  //正常答题
    {
      TR0=1;
      display(10-time_use);   //显示剩余时间
      switch(flag_player)
      {
        case 1:
        {
          led1=0;
          break;
        }
        case 2:
        {
          led2=0;
          break;
        }
        case 3:
        {
          led1=0;
          break;
        }
        default:
        {
          
        }
      }
      
    }
    else if(flag_sta)
    {
      display(time_use);
    }
    
  }
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small_planet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值