基于AT89C51单片机的抢答器的设计

您所在的位置:网站首页 时间倒计时制作 基于AT89C51单片机的抢答器的设计

基于AT89C51单片机的抢答器的设计

2023-12-28 06:00| 来源: 网络整理| 查看: 265

基于AT89C51单片机设计制作一个抢答器,具体要求如下:

设计一个智力竞赛抢答器,可同时共8名选手参加比赛,编号为1、2、3、4、5、6、7、8,各用一个按键。用一个按键作为主持人总开关,用来控制系统的清零和抢答的开始。抢答器开始后,数码管开始10秒倒计时,若有选手按动抢答按钮,在LED数码管上显示选手的编号,同时灯亮且伴随声音提示;倒计时完成后,选手不能再抢答;有人抢答成功后,要禁止其他选手抢答,同时开始显示60秒回答时间倒计时提示;最先抢答选手的编号一直保留到主持人将系统清零。

仿真图

源码

#include #include sbit smg1=P2^4;        //定义数码管第一位 sbit smg2=P2^6;        //定义数码管第二位 sbit smg3=P2^7;        //定义数码管第三位 sbit smg4=P2^5;

sbit keyks=P2^2;    //定义开始按键 sbit keytz=P2^1;    //定义停止按键 sbit keyqc=P2^0;    //定义清除按键

sbit key1=P1^4;        //定义1号抢答选手          sbit key2=P1^5;        //定义2号抢答选手 sbit key3=P1^6;        //定义3号抢答选手 sbit key4=P1^7;        //定义4号抢答选手 sbit key5=P3^4;        //定义5号抢答选手 sbit key6=P3^5;        //定义6号抢答选手 sbit key7=P3^6;        //定义7号抢答选手 sbit key8=P3^7;        //定义8号抢答选手 sbit spk=P1^0;        //定义蜂鸣器 int djs=10,js=0;           //djs和bt是初始倒计时时间 unsigned char flag=0;

sbit led=P3^0;       //定义led灯

int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80};

void delayms(int x)       //延时函数 { char i; while(x--)  {   for(i=500;i>0;i--);   } }  

void Timer0_init()            //定时器0初始化 {       js=0;       TMOD=0x01;                  //T0为定时器方式1       TH0=60;       TL0=176;                   ET0=1;       EA=1;     }

void timer0() interrupt 1 using 1    //定时器0中断服务函数 {         TF0=0;          TH0=60;         TL0=176;                    //赋初值         js++;         if(flag==1)           {            if(js     P0=table[1];     smg1=0;     delayms(3);     smg1=1;                   //第一位数码管显示1

} void djsxs2()  {     P0=table[2];     smg1=0;     delayms(3);     smg1=1;                //第一位数码管显示2

} void djsxs3()  {     P0=table[3];     smg1=0;     delayms(3);     smg1=1;              //第一位数码管显示3

} void djsxs4()  {     P0=table[4];     smg1=0;     delayms(3);     smg1=1;             //第一位数码管显示4

} void djsxs5()  {     P0=table[5];     smg1=0;     delayms(3);     smg1=1;           //第一位数码管显示5

} void djsxs6()  {     P0=table[6];     smg1=0;     delayms(3);     smg1=1;            //第一位数码管显示6

} void djsxs7()  {     P0=table[7];     smg1=0;     delayms(3);     smg1=1;          //第一位数码管显示7 } void djsxs8()  {     P0=table[8];     smg1=0;     delayms(3);     smg1=1;         //第一位数码管显示8

} void main() { int djs1=10; Timer0_init();     //初始化定时器中断 led=0;            //灯不亮 spk=1;              //蜂鸣器不响 djs=10;        //倒计时赋值 while(1) { LOOP1:  djs=djs1;         djsxs22();         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)         {                        delayms(3);         //去除按键抖动             if(keyks==0)             {                  while(!keyks);      //以上表示按下开始按键                  TR0=1;               //启动定时器 开始倒计时                 while(1)                 {                     djsxs();                     if(keytz==0)                     {                            delayms(3);             //此处表示出去抖动, 以后不一一标出                            if(keytz==0)                            {                                 while(!keytz);       //以上表示按下停止按键后                              {                                 TR0=0;           //定时器停止                                 flag=0;//                                 spk=1;                             }                         }                     }                     if(keyks==0)                     {                            delayms(3);                            if(keyks==0)                            {                                 while(!keyks);       //以上表示按下清楚按键后                              TR0=1;           //定时器启动                         }                     }

                    if((key1==0)&&(TR0==1))         //在定时器运行状态下,key1==0 则说明1号选手按下按键                     {                             spk=0;         //蜂鸣器响                         led=1; //灯亮                            delayms(3);                            if(key1==0)                            {                                 while(!key1);      //去除按键抖动后,重新在判断,是否确实按下                             {                                 spk=1;          //蜂鸣器不响                                 led=0;                                 flag=0;//清0最后五秒响蜂鸣器                             }                             while(1)                             {                                 TR0=0;          //定时器停止                                  djsxs1();      //显示选手编号                                 djsxs30();      //第二位数码管显示-                                 djsxs();      //显示剩余倒计时时间                                 delayms(3);                                 djs=60;                                 TR0=1;                                 while(1)                                 {                                     djsxs1();      //显示选手编号                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     if(djs==0)                                     {                                         TR0=0;                                         if(keyqc==0)                                            {                                                    delayms(3);           //去除抖动                                                if(keyqc==0)                                                {                                                      while(!keyqc); //如果按下清楚键,则回到- --状态                                                 goto LOOP1;          //goto语句,回到loop1表号处                                             }                                            }                                     }                                 }                                                                        }                         }                     }                     if((key2==0)&&(TR0==1))                     {                             spk=0;     led=1; //灯亮                            delayms(3);                            if(key2==0)                            {                                 while(!key2);                             {                                 spk=1;                                 flag=0;//清0最后五秒响蜂鸣器                              led=0;//灯不亮                             }                             while(1)                             {                                 TR0=0;                                 djsxs2();                                 djsxs30();      //第二位数码管显示-                                 djsxs();                                 djs=60;                                 TR0=1;                                 while(1)                                 {                                     djsxs2();      //显示选手编号                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     if(djs==0)                                     {                                         TR0=0;                                         if(keyqc==0)                                            {                                                    delayms(3);           //去除抖动                                                if(keyqc==0)                                                {                                                      while(!keyqc); //如果按下清楚键,则回到- --状态                                                 goto LOOP1;          //goto语句,回到loop1表号处                                             }                                            }                                     }                                 }                                                                                                        }                         }                     }                     if((key3==0)&&(TR0==1))                         {        led=1; //灯亮                             spk=0;                                delayms(3);                                if(key3==0)                                {                                     while(!key3);                                 {                                     spk=1;                                     flag=0;//清0最后五秒响蜂鸣器                                         led=0;                                 }                                 while(1)                                   {                                     TR0=0;                                      djsxs3();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs3();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                                                                                                     }                             }                         }                         if((key4==0)&&(TR0==1))                         {            led=1; //灯亮                             spk=0;                                delayms(3);                                if(key4==0)                                {                                     while(!key4);                                   {                                        spk=1;                                        flag=0;//清0最后五秒响蜂鸣器                                     led=0;                                   }                                  while(1)                                   {                                     TR0=0;                                      djsxs4();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs4();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                                                                                  }                             }                         }                         if((key5==0)&&(TR0==1))                         {            led=1; //灯亮                             spk=0;                                delayms(3);                                if(key5==0)                                {                                      while(!key5);                                   {                                        spk=1;                                     led=0;                                        flag=0;//清0最后五秒响蜂鸣器                                   }                                  while(1)                                   {                                        TR0=0;                                      djsxs5();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs5();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                                                                                                 }                             }                         }                         if((key6==0)&&(TR0==1))                         {               led=1; //灯亮                             spk=0;                                delayms(3);                                if(key6==0)                                {                                     while(!key6);                                   {                                        spk=1;                                        flag=0;//清0最后五秒响蜂鸣器                                     led=0;                                   }                                  while(1)                                   {                                     TR0=0;                                      djsxs6();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs6();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                                                                                                 }                             }                         }                         if((key7==0)&&(TR0==1))                         {             led=1; //灯亮                             spk=0;                                delayms(3);                                if(key7==0)                                {                                     while(!key7);                                   {                                    spk=1;                                    led=0;                                    flag=0;//清0最后五秒响蜂鸣器                                   }                                  while(1)                                   {                                     TR0=0;                                      djsxs7();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs7();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                                                      }                             }                         }                         if((key8==0)&&(TR0==1))                         {           led=1; //灯亮                             spk=0;                                delayms(3);                                if(key8==0)                                {                                     while(!key8);                                 {                                     spk=1;                                     led=0;                                        flag=0;//清0最后五秒响蜂鸣器                                 }                                  while(1)                                   {                                     TR0=0;                                      djsxs8();                                     djsxs30();      //第二位数码管显示-                                     djsxs();                                     djs=60;                                     TR0=1;                                     while(1)                                     {                                         djsxs8();      //显示选手编号                                         djsxs30();      //第二位数码管显示-                                         djsxs();                                         if(djs==0)                                         {                                             TR0=0;                                             if(keyqc==0)                                                {                                                        delayms(3);           //去除抖动                                                    if(keyqc==0)                                                    {                                                          while(!keyqc); //如果按下清楚键,则回到- --状态                                                     goto LOOP1;          //goto语句,回到loop1表号处                                                 }                                                }                                         }                                     }                                   }                              }                         }                            if(djs                                  if(keyqc==0)                                 {                                            delayms(3);                                        if(keyqc==0)                                        {                                              while(!keyqc);                                         spk=1;                                                   goto LOOP1;                                         }                                 }                             }                           }                    }                 }     }  } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3