https://blog.csdn.net/qq_38351824/article/details/93964530
课程设计题一:八人抢答器
1、八人抢答逻辑:只有一个最先抢答有效。
2、在主持人控制下,10秒内抢答有效。
3、采用数码管显示抢答10秒倒计时,若有抢答直接结束,显示结果。
4、抢答结束后用数码管显示抢答结果:抢答有效人编号;若有异常(提前抢答,犯规),显示抢答人编号和E,本次抢答结束 。
5、设主持人控制键、复位键。
展开代码控制键:启动抢答 复位键:系统复位
6、开始、正常结束、抢答结束、违规抢答采用声音提示。
7、最后5S开始倒计时的时候有滴滴滴的计时音。

c展开代码#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
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, js = 0;            /* djs和bt是初始倒计时时间 */
unsigned char flag = 0;
int table[] = { 0x5f, 0x44, 0x9d, 0xd5, 0xc6, 0xd3, 0xdb, 0x45, 0xdf, 0xd7, 0x80, 0x9b };
void delayms( uint z )          /* 毫秒 */
{
 uint x, y;
 for ( x = z; x > 0; x-- )
  for ( y = 110; y > 0; y-- )
   ;
}
void Timer0_init()                                                                              /* 定时器0初始化 */
{
 js = 0;
 TMOD = 0x01;                                                                         /* 设置定时器0为工作方式1(M1M0为01) */
 TH0 = (65536 - 45872) / 256;                                                        /* 装初值11.0592M晶振定时50ms数为45872 */
 TL0 = (65536 - 45872) % 256;
 ET0 = 1;                                                                            /* 开定时器0中断 */
 EA = 1;                                                                            /* 开总中断 */
}
void timer0() interrupt 1 using 1                                                               /* 定时器0中断服务函数 */
{
 TH0 = (65536 - 45872) / 256;                                                        /* 装初值11.0592M晶振定时50ms数为45872 */
 TL0 = (65536 - 45872) % 256;
 js++;                                                                                   /* 叠加20次 */
 if ( flag == 1 )                                                                        /*  */
 {
  if ( js < 8 )
   spk = 0;                                                                /* 蜂鸣器响 */
  else spk = 1;                                                                   /* 蜂鸣器停 */
 }
 if ( js == 20 )
 {
  js = 0;                                                                         /* 清空 */
  djs--;                                                                          /* 产生1s的倒计时 */
 }
}
void djsxs()                                                                                    /* 显示倒计时函数 */
{
 int b1, b2;
 b1 = djs / 10;
 b2 = djs % 10;                                                                     /* 将倒计时时间分成高低位 */
 P0 = table[b1];
 smg2 = 0;
 delayms( 3 );
 smg2 = 1;                                                                               /* 显示十位数字 */
 P0 = table[b2];
 smg3 = 0;
 delayms( 3 );                                                                           /* 显示个位数字 */
 smg3 = 1;
}
void djsxse()                                                                                   /* 第二位数码管显示 E */
{
 P0 = 0x9b;                                                                         /* 第三位数码管显示E */
 smg2 = 0;
 delayms( 3 );
 smg2 = 1;
}
void djsxs30()                                                                                  /* 第三位数码管显示 - */
{
 P0 = 0x80;                                                                         /* 第三位数码管显示- */
 smg4 = 0;
 delayms( 3 );
 smg4 = 1;
}
void djsxs22()                                                                                  /* 4位数码管显示- - - - */
{
 P0 = 0x80;                                                                         /* 第一位数码管显示- */
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;
 P0 = 0x80;                                                                         /* 第二位数码管显示- */
 smg4 = 0;
 delayms( 3 );
 smg4 = 1;
 P0 = 0x80;                                                                         /* 第三位数码管显示- */
 smg2 = 0;
 delayms( 3 );
 smg2 = 1;
 P0 = 0x80;                                                                         /* 第四位数码管显示- */
 smg3 = 0;
 delayms( 3 );
 smg3 = 1;
}
void djsxs1()                                                                                   /* 第一位数码管显示1 */
{
 P0 = table[1];                                                                     /* 第一位数码管显示1 */
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;
}
void djsxs2()                                                                                   /* 第一位数码管显示2 */
{
 P0 = table[2];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示2 */
}
void djsxs3()                                                                                   /* 第一位数码管显示3 */
{
 P0 = table[3];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示3 */
}
void djsxs4()                                                                                   /* 第一位数码管显示4 */
{
 P0 = table[4];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示4 */
}
void djsxs5()                                                                                   /* 第一位数码管显示5 */
{
 P0 = table[5];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示5 */
}
void djsxs6()                                                                                   /* 第一位数码管显示6 */
{
 P0 = table[6];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示6 */
}
void djsxs7()                                                                                   /* 第一位数码管显示7 */
{
 P0 = table[7];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示7 */
}
void djsxs8()                                                                                   /* 第一位数码管显示8 */
{
 P0 = table[8];
 smg1 = 0;
 delayms( 3 );
 smg1 = 1;                                                                               /* 第一位数码管显示8 */
}
void main()
{
 int djs1 = 10;                                                                          /* 修改倒计时第一处,共两处 */
 Timer0_init();                                                                          /* 初始化定时器中断 */
 spk = 0; delayms( 500 ); spk = 1;                                                   /* 蜂鸣器不响 */
 djs = 10;                                                                           /* 修改倒计时第二处,共两处 */
 while ( 1 )
 {
LOOP1:   djs = djs1;                                                                            /* LOOP1是标号 */
  djsxs22();                                                                      /* 4位数码管显示- - - - */
  if ( keyks == 0 )                                                               /* 开始按键 */
  {
   delayms( 3 );                                                           /* 去除按键抖动 */
   if ( keyks == 0 )
   {
    while ( !keyks )
     ;                                                       /* 以上表示按下开始按键 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    TR0 = 1;                                                    /* 启动定时器 开始倒计时 */
    while ( 1 )
    {
     djsxs();                                                /* 显示倒计时函数 */
     if ( keyks == 0 )
     {
      delayms( 3 );
      if ( keyks == 0 )
      {
       while ( !keyks )
        ;                               /* 以上表示按下清楚按键后 */
       TR0 = 1;                                /* 定时器启动 */
      }
     }
/***************************以下是八个选手抢答,key1表示1号选手,依次类推,注释只写第一位选手,其他和第一个完全一致,************************************/
     if ( (key1 == 0) && (TR0 == 1) )                        /* 在定时器运行状态下,key1==0 则说明1号选手按下按键 */
     {
      spk = 0;                                        /* 蜂鸣器响 */
      delayms( 3 );
      if ( key1 == 0 )
      {
       while ( !key1 )
        ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
       {
        spk = 1;                    /* 蜂鸣器不响 */
        flag = 0;                    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;                        /* 定时器停止 */
        djsxs1();                       /* 显示选手编号 */
        djsxs30();                      /* 第二位数码管显示- */
        djsxs();                        /* 显示剩余倒计时时间 */
        if ( keyqc == 0 )
        {
         delayms( 3 );           /* 去除抖动 */
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;       /* 如果按下清除键,则回到----状态 */
          goto LOOP1;     /* goto语句,回到loop1表号处 */
         }
        }
       }
      }
     }
     if ( (key2 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key2 == 0 )
      {
       while ( !key2 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs2();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key3 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key3 == 0 )
      {
       while ( !key3 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs3();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key4 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key4 == 0 )
      {
       while ( !key4 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs4();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key5 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key5 == 0 )
      {
       while ( !key5 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs5();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key6 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key6 == 0 )
      {
       while ( !key6 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs6();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key7 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key7 == 0 )
      {
       while ( !key7 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs7();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( (key8 == 0) && (TR0 == 1) )
     {
      spk = 0;
      delayms( 3 );
      if ( key8 == 0 )
      {
       while ( !key8 )
        ;
       {
        spk = 1;
        flag = 0;    /* 清0最后五秒响蜂鸣器 */
       }
       while ( 1 )
       {
        TR0 = 0;
        djsxs8();
        djsxs30();      /* 第二位数码管显示- */
        djsxs();
        if ( keyqc == 0 )
        {
         delayms( 3 );
         if ( keyqc == 0 )
         {
          while ( !keyqc )
           ;
          goto LOOP1;
         }
        }
       }
      }
     }
     if ( djs <= 5 )
      flag = 1;       /* spk=0;   //到倒计时小于5是,蜂鸣器响 */
     if ( djs == 0 )         /* 当倒计时时间等于0后,需要按清楚键恢复 */
     {
      flag = 0;
      spk = 1;
      while ( 1 )
      {
       if ( keyqc == 0 )
       {
        delayms( 3 );
        if ( keyqc == 0 )
        {
         while ( !keyqc )
          ;
         spk = 1;
         goto LOOP1;
        }
       }
      }
     }
    }
   }
  }
/* //////////////////抢答违规//////////////////// */
  if ( (key1 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key1 == 0 )
   {
    while ( !key1 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs1();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key2 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key2 == 0 )
   {
    while ( !key2 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs2();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key3 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key3 == 0 )
   {
    while ( !key3 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs3();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key4 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key4 == 0 )
   {
    while ( !key4 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs4();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key5 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key5 == 0 )
   {
    while ( !key5 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs5();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key6 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key6 == 0 )
   {
    while ( !key6 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs6();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key7 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key7 == 0 )
   {
    while ( !key7 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs7();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
  if ( (key8 == 0) && (TR0 == 0) )                        /* 1号选手违规按下按键 */
  {
   delayms( 3 );
   if ( key8 == 0 )
   {
    while ( !key8 )
     ;                               /* 去除按键抖动后,重新在判断,是否确实按下 */
    spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1; spk = 0; delayms( 200 ); spk = 1; delayms( 200 ); spk = 0; delayms( 200 ); spk = 1;
    while ( 1 )
    {
     djsxs8();                       /* 显示选手编号 */
     djsxs30();                      /* 第二位数码管显示- */
     djsxse();                       /* 显示E */
     if ( keyqc == 0 )
     {
      delayms( 3 );           /* 去除抖动 */
      if ( keyqc == 0 )
      {
       while ( !keyqc )
        ;       /* 如果按下清除键,则回到----状态 */
       goto LOOP1;     /* goto语句,回到loop1表号处 */
      }
     }
    }
   }
  }
 }
}


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!