单片机学习小组
直播中

卢表镜

7年用户 1019经验值
私信 关注

如何利用51单片机去设计一个8位抢答器呢

如何利用51单片机去设计一个8位抢答器呢?其程序代码该怎样去实现?

回帖(1)

冉屹芳

2022-2-23 09:17:58
8位抢答器


利用51单片机设计一个8位抢答器。按下按钮,倒计时10s,初始状态LED处于熄灭状态,最后5s倒计时伴随LED闪烁。有玩家抢答或者计时结束时,LED灯常亮。开始计时后的任意状态下再次按下按钮,抢答器重置。

Proteus布线图




代码


变量说明:

***it LED = P3^1;        //led
***it key4=P3^4; //TO计时器

uint xian[4]={0};//数据存储
uint N=20;//Time=50ms*20=1s
uint begin=0;//判断开始和结束
uint counter=10;//计时10s
uint player=0;//玩家号码
uint flag=0;//有玩家抢答,暂停
uchar p1=0x00;

初始化:

void init()
{
        TMOD=0x01;
        TH0=(65536-41500)/256;
        TL0=(65536-41500)%256;
        ET0=1;
        TR0=0;
        EX0=1;
        IT0=1;
        EA=1;
        }

主函数:

void main(void)
{
        init();
        counter=10;      
        LED=1;
        SPEAKER=1;
        while(1)
        {
         flag=0;
         LED=1;
                        if(begin)
                        {
                                if(P1!=0xFF)//判断非法抢答
                                {
                                         player=15;//非法抢答显示“F”
                                         flag=1;         //停止抢答判断
                                    }
                        else  if(!flag)
                            {
                                  Begin_a();
                                         }
                        }
                        else
                        {
                                         counter=10;
                                         player=0;
                                         xianshi(counter);
                                        }
                        xianshi(counter);               
        }
}

比如三号玩家违规抢答(即在裁判开始之前就按下抢答健),则如下显示:


开始抢答:

void Begin_a()
{
        TR0=1;
        while(begin&&counter)
        {                                                                         //****
          if(!flag) //如果已有玩家抢答将不再作此判断
          {
                  judge();
          }         

          if(N==20)
                  {
                        N=0;
                          counter--;
                        
                          if(counter<6)//倒计时5s闪烁
                                  {
                                  LED=0;
                  delay(300);
                  LED=1;
                                          }
                          }
                          xianshi(counter);
                 }                                                         //****

                         TR0=0;
                        LED=0;                              
  }                 

判断抢答玩家:

void judge()  //判断抢答玩家号码
{
        switch(P1)//如果一下八位中任意玩家抢答:记录该玩家号码
        {         //并关闭计时器,LED常亮,终止判断程序
                case ~0x01:{player=1;TR0=0;LED=0;flag=1;break;}
                case ~0x02:{player=2;TR0=0;LED=0;flag=1;break;}
                case ~0x04:{player=3;TR0=0;LED=0;flag=1;break;}
                case ~0x08:{player=4;TR0=0;LED=0;flag=1;break;}
                case ~0x10:{player=5;TR0=0;LED=0;flag=1;break;}
                case ~0x20:{player=6;TR0=0;LED=0;flag=1;break;}
                case ~0x40:{player=7;TR0=0;LED=0;flag=1;break;}
                case ~0x80:{player=8;TR0=0;LED=0;flag=1;break;}
                default:{player=0;}      
                }
        }  

显示:

void xianshi(count)
{
        xian[0]=count%10;
        xian[1]=count/10;
        xian[3]=player;
      
        P2=~0x08;
        P0=~display[xian[0]];
        delay(10);
      
        P2=~0x04;
        P0=~display[xian[1]];
        delay(10);
      
        P2=~0x01;
        P0=~display[player];
        delay(10);
        }         

中断0:

void Int0()interrupt 0 //INT0
{
        begin++;
        begin=begin%2;
        }

T0计时中断:

void initT0() interrupt 1 //T0
{
        TH0=(65536-41500)/256;
        TL0=(65536-41500)%256;         //  50ms
        N++;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分