找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2999|回复: 6
收起左侧

关于如何实现单片机六路抢答器,希望前辈大佬帮忙看看电路图和程序错在哪里

[复制链接]
ID:724589 发表于 2020-4-28 10:51 | 显示全部楼层 |阅读模式

电路图

电路图
要求:其中主持人操控两个按键。选手共六位,分别操控一个按键。当主持人按下抢答开始按键后,倒计时开始,计时5s。此后最先按下按键的选手号码将显示在数码管上。后来按下的将无显示。若五秒计时结束后,再按下按键也不会显示。若主持人没有按开始键,就有选手抢答,则视为犯规。此时犯规的选手号码将被显示于数码管上(最多显示五位犯规选手)。同时,蜂鸣器发出长笛声报警,数码管全亮。

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^0;
  5. sbit wela=P2^1;
  6. uchar code table[]={
  7. 0x3f,0x06,0x5b,0x4f,
  8. 0x66,0x6d,0x7d,0x07};
  9. sbit key1=P1^0;
  10. sbit key2=P1^1;
  11. sbit key3=P1^2;
  12. sbit key4=P1^3;
  13. sbit key5=P1^4;
  14. sbit key6=P1^5;
  15. sbit start=P1^6;
  16. sbit beep=P1^7;
  17. int num=0;
  18. uchar count;
  19. uchar second=5;


  20. //延时子函数
  21. void delayms(uint xms)
  22. {
  23. uint i,j;
  24.   for(i=xms;i>0;i--)
  25.     for(j=110;j>0;j--);
  26. }
  27. //定时器函数
  28. void timer()
  29. {
  30. TMOD=0x01;//选定工作方式
  31.   TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms数为45872
  32.     TL0=(65536-45872)%256;
  33.       EA=1;//开总中断
  34.         ET0=1;//开定时器0中断
  35. }

  36. //定时中断函数
  37. void timer0()interrupt 1 using 1
  38. {
  39.    TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms数为45872
  40.      TL0=(65536-45872)%256;
  41.        TR0=1;//启动定时器0
  42.         count++;//计数一次50ms,20次为1秒
  43.          if (count==20)
  44. {
  45.      count=0;
  46.       if (second>=1)
  47.     {
  48.        second--;//秒减1
  49.         if(second==0)
  50.       {
  51.        wela=0;
  52.         dula=0;
  53.          delayms(5);
  54.       }
  55.     }
  56.   }
  57. }



  58. //倒计时显示函数
  59. void djsxs()
  60. {
  61.          dula=1;
  62.           P0=table[second];
  63.            dula=0;
  64.                    P0=0xff;
  65.                     wela=1;
  66.              P0=0xfe;
  67.               wela=0;

  68. }

  69. //按键检测程序

  70. void keyscan()
  71. {
  72.    if(key1==0)
  73.   {
  74.         dula=1;
  75.          P0=0x06;
  76.           dula=0;
  77.            beep=1;
  78.                    P0=0xff;
  79.             wela=1;
  80.              P0=0xfe;
  81.               wela=0;
  82.            delayms(5);
  83.    }
  84. else if(key2==0)
  85. {
  86.          dula=1;
  87.           P0=0x5b;
  88.            dula=0;
  89.                     P0=0xff;
  90.              wela=1;
  91.               P2=0xfd;
  92.                wela=0;
  93.                 delayms(5);
  94. }
  95. else if(key3==0)
  96. {
  97.           dula=1;
  98.            P0=0x4f;
  99.             dula=0;
  100.                         P0=0xff;
  101.              beep=1;
  102.               wela=1;
  103.                P2=0xfb;
  104.                 wela=0;
  105.              delayms(5);
  106. }
  107. else if(key4==0)
  108. {
  109.       dula=1;
  110.        P0=0x66;
  111.         dula=0;
  112.                 P0=0xff;
  113.         beep=1;
  114.         wela=1;
  115.          P2=0xf7;
  116.           wela=0;
  117.          delayms(5);
  118. }
  119. else if(key5==0)
  120. {      
  121.       dula=1;
  122.        P0=0x6d;
  123.         dula=0;
  124.                  P0=0xff;
  125.                   beep=1;
  126.            wela=1;
  127.             P2=0xEF;
  128.              wela=0;
  129.               delayms(5);
  130. }
  131. else if(key6==0)
  132. {
  133.       dula=1;
  134.        P0=0x7d;
  135.         dula=0;
  136.                 P0=0xff;
  137.          beep=1;
  138.           wela=1;
  139.            P2=0xDF;
  140.             wela=0;
  141.          delayms(5);
  142. }
  143. }




  144. //主函数
  145. main()
  146. {
  147.    if (start==0)
  148.    timer();
  149.    djsxs();
  150.    {
  151.      bit flag=0;//定义flag,方便跳出
  152.     while(!flag)
  153. if(key1==0)//如果一号选手按下抢答器
  154.      {
  155.       dula=1;//打开锁存端
  156.        P0=table[1];//数码管显示一号选手
  157.         dula=0;//关闭锁存端
  158.          P0=0xff;
  159.           wela=1;//打开锁存端(开头记得声明锁存端)
  160.            P0=0xFE;//送入位选信息,选择第一位
  161.             wela=0;//关闭锁存端
  162.               flag=1;//使flag等于一,跳出程序
  163.                delayms(5);
  164.      }
  165. else if(key2==0)
  166.   {
  167.     dula=1;
  168.      P0=table[2];
  169.       dula=0;
  170.        P0=0Xff;
  171.         wela=1;
  172.          P0=0xFE
  173.           wela=0
  174.            flag=1;
  175.             delayms(5);
  176.   }
  177. else if(key3==0)
  178. {
  179.    dula=1;
  180.     P0=table[3];
  181.      dula=0;
  182.       P0=0Xff;
  183.        wela=1;
  184.         P0=0xFE;
  185.          wela=0;
  186.           flag=1;
  187.            delayms(5);
  188. }
  189. else if(key4==0)
  190. {
  191.    dula=1;
  192.     P0=table[4];
  193.      dula=0;
  194.       P0=0Xff;
  195.        wela=1;
  196.         P0=0xFE
  197.          wela=0;
  198.           flag=1;
  199.            delayms(5);
  200. }
  201. else if(key5==0)
  202. {
  203.    dula=1;
  204.      P0=table[5];
  205.      dula=0;
  206.       P0=0xff;
  207.        wela=1;
  208.         P0=0xFE;
  209.          wela=0;
  210.           flag=1;
  211.             delayms(5);
  212. }
  213. else if(key6==0)
  214. {
  215.    dula=1;
  216.     P0=table[6];
  217.      dula=0;
  218.       P0=0Xff;
  219.        wela=1;
  220.         P0=0xFE;
  221.          wela=0;
  222.           flag=1;
  223.            delayms(5);
  224. }


  225.      if(start==1)
  226.       {
  227.          keyscan();
  228.          if (key1==0)
  229.         {
  230.                 num++;
  231.              }
  232.         else if (key2==0)
  233.         {
  234.                num++;
  235.             }
  236.       else  if (key3==0)
  237.         {   
  238.              num++;
  239.              }
  240.        else if (key4==1)
  241.         {
  242.             num++;
  243.             }
  244.        else if (key5==0)
  245.         {
  246.             num++;
  247.             }
  248.        else if (key6==0)
  249.         {
  250.             num++;
  251.              }
  252.      if (num>5)
  253.           {
  254.           num=0;
  255.                   wela=0;
  256.                   dula=0;
  257.                   }
  258.                
  259.                
  260.           }
  261.    }
  262. }
复制代码
回复

使用道具 举报

ID:452950 发表于 2020-4-28 20:54 | 显示全部楼层
本站有很多8路抢答器的例子可以参考,功能应该都差不多。
回复

使用道具 举报

ID:96682 发表于 2020-4-29 01:44 来自触屏版 | 显示全部楼层
看仿真图这硬件电路肯定有问题
回复

使用道具 举报

ID:653248 发表于 2020-4-29 07:56 | 显示全部楼层
可以去网上参考下
回复

使用道具 举报

ID:703227 发表于 2020-4-30 08:19 | 显示全部楼层
可以参考论坛里的 一些设计
回复

使用道具 举报

ID:1105312 发表于 2023-12-20 11:03 | 显示全部楼层
有的分号都没加,下到单片机了也没用,根本没有用
回复

使用道具 举报

ID:1105312 发表于 2023-12-20 11:03 | 显示全部楼层
有的分号都没加,下到单片机了也没用,根本没有用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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