找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8773|回复: 1
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:360519 发表于 2018-6-27 19:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基本功能
1、同时供 8 名选手或 8个代表队参加比赛,分别用 8个按钮 K1 ~ K8 表示。
2、设置一个系统抢答控制开关 K0,该开关由主持人控制。
3、抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,并在七段数码管上显示选手号码。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
4、抢答器具有定时抢答功能且一次抢答的时间由主持人设定(如 10秒)。当 主持人启动 "开始"键后,定时器进行减计时。
5、参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。在这段时间如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示FFF
源代码如下
  1. #include<reg51.h>
  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;
  4. sbit K0=P3^0;//        开始抢答按键
  5. sbit beep=P3^7;//        蜂鸣器
  6. sbit D0=P3^1;//        指示灯
  7. sbit K1=P1^0;//1 号选手抢答按键
  8. sbit K2=P1^1;//2 号选手抢答按键
  9. sbit K3=P1^2;//3 号选手抢答按键
  10. sbit K4=P1^3;//4 号选手抢答按键
  11. sbit K5=P1^4;//5 号选手抢答按键
  12. sbit K6=P1^5;//6 号选手抢答按键
  13. sbit K7=P1^6;//7 号选手抢答按键
  14. sbit K8=P1^7;//8 号选手抢答按键
  15. sbit S1=P3^2;// 答 题 计 时 键
  16. sbit S2=P3^3;//        开始抢答时间调整键
  17. sbit S3=P3^4;//        答题计时时间调整键
  18. char s;
  19. uchar num=0;
  20. char time1;//        抢答时间
  21. char time2;//        答题限时时间
  22. uint m,n;//T0,T1        定时器定一秒时
  23. bit flag1,flag2,flag3,flag4;        // 标志位
  24. bit aa,bb;//        时间调整标志位
  25. // 延时子函数
  26. void delay(uint z)
  27. {
  28. uint x,y; for(x=z;x>0;x--)
  29. for(y=120;y>0;y--);
  30. }

  31. uchar code table1[]={
  32.           // 共阴数码管段码值
  33.        0x3f,0x06,0x5b,0x4f,
  34.        0x66,0x6d,0x7d,0x07,
  35.        0x7f,0x6f,0x77,0x7c,
  36.            0x39,0x5e,0x79,0x71
  37.            };
  38. uchar code table2[]={
  39.                                   // 共阴数码管位码值
  40.                   0xfe,0xfd, 0xfb,0xf7
  41.                                   };
  42. // 初始化子函数
  43. void init()
  44. {
  45. TMOD=0x11;
  46. TH0=(65536-2000)/256;
  47. TL0=(65536-2000)%256;
  48. TH1=(65536-2000)/256;
  49. TL1=(65536-2000)%256;
  50. ET0=1;
  51. ET1=1;
  52. EA=1;
  53. P0=0x00;
  54. time1=10;
  55. time2=10;
  56. flag2=1;
  57. }
  58. // 开始键扫描子函数
  59. void key1()
  60. {
  61.    uchar i=100;
  62.    if(K0==0)
  63.    {
  64.      delay(10);
  65.          if(K0==0)
  66.      {
  67.       while(K0==0&&i)
  68.       {
  69.        i--;
  70.        delay(10);
  71.       }
  72.        TR0=1;
  73.            s=time1;
  74.            m=0;
  75.        flag1=1;
  76.            flag2=1;
  77.            flag3=1;
  78.            num=0;
  79.            beep=1;
  80.            D0=1;
  81.        flag4=0;        // 清除违规标志位
  82.        aa=0;
  83.            bb=0;
  84.           }
  85.    }
  86. }
  87. // 选手抢答按键扫描子函数
  88. void key()
  89. {
  90.   uchar i=100;
  91.   if(K1==0)
  92.   {
  93.    delay(10);
  94.    if(K1==0)
  95.    {
  96.     while(K1==0&&i)
  97.     {
  98.      i--;
  99.      delay(10);
  100.     }
  101.     num=1;        // 数码管显示        1 号 "1"
  102. TR0=0;        // 关闭定时器        0, 时间停止
  103.     TR1=1;        // 打开定时器        1, 使扬声器响一声
  104.     flag2=0;        // 关闭开始键标志位        , 使再按其他七个键不会响应
  105.    }
  106.   }
  107.   if(K2==0)        // 下面七个键的处理同上
  108.   {
  109.     delay(10);
  110.         if(K2==0)
  111.         {
  112.      while(K2==0&&i)
  113.      {
  114.       i--;
  115.       delay(10);
  116.      }
  117.      num=2;
  118.          TR0=0;
  119.          TR1=1;
  120.      flag2=0; // 重 要
  121.     }
  122.   }
  123.    if(K3==0)
  124.    {
  125.     delay(10);
  126.         if(K3==0)
  127.     {
  128.      while(K3==0&&i)
  129.      {
  130.       i--;
  131.       delay(10);
  132.      }
  133.      num=3;
  134.          TR0=0;
  135.          TR1=1;
  136.      flag2=0;
  137.     }
  138.    }
  139.    if(K4==0)
  140.    {
  141.     delay(10);
  142.         if(K4==0)
  143.     {
  144.      while(K4==0&&i)
  145.      {
  146.       i--;
  147.       delay(10);
  148.      }
  149.          num=4;
  150.          TR0=0;
  151.          TR1=1;
  152.      flag2=0;
  153.     }
  154.    }
  155.    if(K5==0)
  156.    {
  157.     delay(10);
  158.         if(K5==0)
  159.     {
  160.      while(K5==0&&i)
  161.      {
  162.       i--;
  163.       delay(10);
  164.      }
  165.      num=5;
  166.          TR0=0;
  167.          TR1=1;
  168.      flag2=0;
  169.     }
  170.    }
  171.    if(K6==0)
  172.    {
  173.     delay(10);
  174.         if(K6==0)
  175.     {
  176.      while(K6==0&&i)
  177.      {
  178.       i--;
  179.       delay(10);
  180.      }
  181.      num=6;
  182.          TR0=0;
  183.          TR1=1;
  184.      flag2=0;
  185.     }
  186.    }
  187.    if(K7==0)
  188.    {
  189.     delay(10);
  190.         if(K7==0)
  191.     {
  192.      while(K7==0&&i)
  193.      {
  194.       i--;
  195.       delay(10);
  196.      }
  197.      num=7;
  198.          TR0=0;
  199.          TR1=1;
  200.      flag2=0;
  201.     }
  202.    }
  203.    if(K8==0)
  204.    {
  205.     delay(10);
  206.         if(K8==0)
  207.     {
  208.      while(K8==0&&i)
  209.      {
  210.       i--;
  211.       delay(10);
  212.      }
  213.      num=8;
  214.          TR0=0;
  215.          TR1=1;
  216.      flag2=0;
  217.     }
  218.    }
  219. }
  220. // 数码管显示子函数
  221. void display()
  222. {
  223. if(flag1==1)        // 开始键按下 , 开始计时抢答
  224. {
  225. if(num!=0)        // 如果有人抢答 , 则显示相应的几号
  226. {
  227.   P0=table1[num];        // 显示几号抢到了
  228.   P2=table2[0]; delay(2); P0=0;
  229.   P2=0xff;
复制代码
限于篇幅,全部程序请从附件下载

单片机课设程序.docx

21.11 KB, 下载次数: 79, 下载积分: 黑币 -5

八路抢答器源代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:507935 发表于 2019-4-9 15:28 | 只看该作者
看看怎么用呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表