×
单片机 > 单片机程序设计 > 详情

基于51单片机的八路抢答器仿真设计

发布时间:2020-06-17 发布时间:
|

首先,裁判在右方按下开始按钮,蜂鸣器响起,抢答开始,初始时间为20s,若1-8位选手按下按钮,即抢答成功,由显示屏显示该选手号码,如果超过时间(20s)没人认抢答,则时间重置为20s,并此题作废,答题结束后,按下重置按钮,这时时间重置,下次抢答开始。


创新功能(*)在没有按下开始键时,按下修改时间按钮,则时间会减少1s,由于默认时间为20s,所以这个功能可以实现20s内时间的调整

仿真原理图如下

单片机源程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

#define  max 20

uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


sbit d1=P2^4;

sbit d2=P2^5;

sbit x1=P2^6;

sbit x2=P2^7;


sbit k1=P1^0;

sbit k2=P1^1;

sbit k3=P1^2;

sbit k4=P1^3;

sbit k5=P1^4;

sbit k6=P1^5;

sbit k7=P1^6;

sbit k8=P1^7;


sbit zk1=P2^0;

sbit zk2=P2^1;


sbit buz=P2^2;


uchar d_num,cnt;

uchar x_flag;

void jianpan();

void init(void)

{

   TMOD=0X01;

   TL0=0XB0; 

   TH0=0X3C;

//   TR0=1;    

   ET0=1;     

   EA=1;

   d_num=max;

}


void delay(uint xms)

{

   uint x,y;

   for(x=xms;x>0;x--)

    for(y=110;y>0;y--);


}


void display()

{

        d1=0;         //位选端;

        P0=tab[d_num/10];//显示倒计时

        delay(5);

        d1=1;


        d2=0;

        P0=tab[d_num%10];

        delay(5);

        d2=1;


        x1=0;        //位选端

        P0=tab[x_flag/10];//显示选手号

        delay(5);

        x1=1;


        x2=0;

        P0=tab[x_flag%10];

        delay(5);

        x2=1;

}


void main()

{        init();

        while(1)

        { 

          jianpan();

          display();


        }        

}


void timer0(void) interrupt 1

   TL0=0XB0; //重装初值

   TH0=0X3C; 

   cnt++;

   if(cnt==20)//1 秒时间到

    {

       cnt=0;//计数清零

           d_num--;

           if(d_num==0)

          {

             d_num=max;


             TR0=0;        //关闭所有操作

                 }

           buz=0;        

           delay(20);

           buz=1;

           

     }   

}

void jianpan()


{             if(zk1==0&&x_flag==0)

                {

                         delay(5);

                         x_flag=0;


                         TR0=1;

                         

                }

                if(zk2==0&&TR0==0)

                {

                         delay(5);

                         if(zk2==0&&TR0==0)

                         {

                                 if(x_flag==0)

                                 {

                                   d_num--;                                //设置倒计时

                                   buz=0;

                                   delay(20);

                                    buz=1;  }


                                 if(d_num==5)

                                 d_num=max;

                                                  

                                 if(x_flag!=0) //选手显示清零

                                 {

                                 x_flag=0;

                                 d_num=max;        

                                 TR0=0;        

                                   buz=0;

                                   delay(20);

                                    buz=1;

                                      }


                                 while(!zk2)

                                 display();

                         }

                }


                

            if(k1==0&&TR0==1) 

                {

                         delay(5);

                         if(k1==0&&TR0==1)

                         {

                           x_flag=1;


                            TR0=0;

                                  }                 

                }



                if(k2==0&&TR0==1)

                {

                         delay(5);

                         if(k2==0&&TR0==1)

                         {x_flag=2;TR0=0;}                 

                         

                }


                if(k3==0&&TR0==1)

                {

                         delay(5);

                         if(k3==0&&TR0==1)

                         {x_flag=3;TR0=0;}                 

                         while(!k3)

                         display();

                }


                if(k4==0&&TR0==1)

                {

                          delay(5);

                         if(k4==0&&TR0==1)

{x_flag=4;TR0=0;}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C51 特殊功能寄存器SFR的名称和地址