找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2966|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

關(guān)于如何實(shí)現(xiàn)單片機(jī)六路搶答器,希望前輩大佬幫忙看看電路圖和程序錯(cuò)在哪里

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
要求:其中主持人操控兩個(gè)按鍵。選手共六位,分別操控一個(gè)按鍵。當(dāng)主持人按下?lián)尨痖_始按鍵后,倒計(jì)時(shí)開始,計(jì)時(shí)5s。此后最先按下按鍵的選手號(hào)碼將顯示在數(shù)碼管上。后來按下的將無顯示。若五秒計(jì)時(shí)結(jié)束后,再按下按鍵也不會(huì)顯示。若主持人沒有按開始鍵,就有選手搶答,則視為犯規(guī)。此時(shí)犯規(guī)的選手號(hào)碼將被顯示于數(shù)碼管上(最多顯示五位犯規(guī)選手)。同時(shí),蜂鳴器發(fā)出長(zhǎng)笛聲報(bào)警,數(shù)碼管全亮。

單片機(jī)源程序如下:
  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. //延時(shí)子函數(shù)
  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. //定時(shí)器函數(shù)
  28. void timer()
  29. {
  30. TMOD=0x01;//選定工作方式
  31.   TH0=(65536-45872)/256;//裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
  32.     TL0=(65536-45872)%256;
  33.       EA=1;//開總中斷
  34.         ET0=1;//開定時(shí)器0中斷
  35. }

  36. //定時(shí)中斷函數(shù)
  37. void timer0()interrupt 1 using 1
  38. {
  39.    TH0=(65536-45872)/256;//裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
  40.      TL0=(65536-45872)%256;
  41.        TR0=1;//啟動(dòng)定時(shí)器0
  42.         count++;//計(jì)數(shù)一次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. //倒計(jì)時(shí)顯示函數(shù)
  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. //按鍵檢測(cè)程序

  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. //主函數(shù)
  145. main()
  146. {
  147.    if (start==0)
  148.    timer();
  149.    djsxs();
  150.    {
  151.      bit flag=0;//定義flag,方便跳出
  152.     while(!flag)
  153. if(key1==0)//如果一號(hào)選手按下?lián)尨鹌?br />
  154.      {
  155.       dula=1;//打開鎖存端
  156.        P0=table[1];//數(shù)碼管顯示一號(hào)選手
  157.         dula=0;//關(guān)閉鎖存端
  158.          P0=0xff;
  159.           wela=1;//打開鎖存端(開頭記得聲明鎖存端)
  160.            P0=0xFE;//送入位選信息,選擇第一位
  161.             wela=0;//關(guān)閉鎖存端
  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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:452950 發(fā)表于 2020-4-28 20:54 | 只看該作者
本站有很多8路搶答器的例子可以參考,功能應(yīng)該都差不多。
回復(fù)

使用道具 舉報(bào)

板凳
ID:96682 發(fā)表于 2020-4-29 01:44 來自觸屏版 | 只看該作者
看仿真圖這硬件電路肯定有問題
回復(fù)

使用道具 舉報(bào)

地板
ID:653248 發(fā)表于 2020-4-29 07:56 | 只看該作者
可以去網(wǎng)上參考下
回復(fù)

使用道具 舉報(bào)

5#
ID:703227 發(fā)表于 2020-4-30 08:19 | 只看該作者
可以參考論壇里的 一些設(shè)計(jì)
回復(fù)

使用道具 舉報(bào)

6#
ID:1105312 發(fā)表于 2023-12-20 11:03 | 只看該作者
有的分號(hào)都沒加,下到單片機(jī)了也沒用,根本沒有用
回復(fù)

使用道具 舉報(bào)

7#
ID:1105312 發(fā)表于 2023-12-20 11:03 | 只看該作者
有的分號(hào)都沒加,下到單片機(jī)了也沒用,根本沒有用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表