久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6036|回復: 3
收起左側

基于51單片機的八路搶答器源碼與制作出來的實物圖分享

[復制鏈接]
ID:295644 發表于 2018-11-6 19:00 | 顯示全部樓層 |閱讀模式
制作出來的八路搶答器實物圖如下:
IMG20181106184456.jpg IMG20181106184437.jpg IMG20181106184437 - 副本.jpg IMG20181106184449.jpg

單片機源程序如下:
  1. #include<reg52.h>                           //P0口接段選,P2口接位選
  2. #define uint unsigned int
  3. #define uchar unsigned char
  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;
  9. sbit K3=P1^2;
  10. sbit K4=P1^3;
  11. sbit K5=P1^4;
  12. sbit K6=P1^5;
  13. sbit K7=P1^6;
  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. void delay(uint xms)
  26. {
  27.         uint i,j;
  28.         for(i=xms;i>0;i--)
  29.                 for(j=110;j>0;j--);
  30. }
  31. uchar code table1[]={
  32.                      0x3f,0x06,0x5b,0x4f,
  33.                                          0x66,0x6d,0x7d,0x07,
  34.                                          0x7f,0x6f,0x77,0x7c,
  35.                                          0x39,0x5e,0x79,0x71
  36.                                         };
  37. uchar code table2[]={
  38.                      0xfe,0xfd,
  39.                                          0xfb,0xf7
  40.                                          };
  41. void init()                 //初始化子函數
  42. {
  43.         TMOD=0x11;
  44.         TH0=(65536-2000)/256;
  45.         TL0=(65536-2000)%256;
  46.         TH1=(65536-2000)/256;
  47.         TL1=(65536-2000)%256;
  48.         ET0=1;
  49.         ET1=1;
  50.         EA=1;
  51.         P0=0x00;
  52.         time1=10;
  53.         time2=10;
  54.         flag2=1;

  55. }
  56. //開始鍵掃描子函數
  57. void key1()
  58. {
  59.         uchar i=100;
  60.         if(K0==0)
  61.         {
  62.                 delay(10);
  63.                 if(K0==0)
  64.                 {
  65.                         while(K0==0&&i)
  66.                         {
  67.                                 i--;
  68.                                 delay(10);
  69.                         }
  70.                         TR0=1;
  71.                         s=time1;
  72.                         m=0;
  73.                         flag1=1;
  74.                         flag2=1;
  75.                         flag3=1;
  76.                         num=0;                                //
  77.                         beep=1;
  78.                         D0=1;
  79.                         flag4=0;  //消除違規標志位
  80.                         aa=0;
  81.                         bb=0;               
  82.                 }
  83.         }
  84. }
  85. //選手搶答按鍵掃描子函數
  86. void key()
  87. {
  88.         uchar i=100;
  89.         if(K1==0)
  90.         {
  91.                 delay(10);
  92.                 if(K1==0)
  93.                 {
  94.                         while(K1==0&&i)
  95.                         {
  96.                                 i--;
  97.                                 delay(10);
  98.                         }
  99.                         num=1;  //數碼管顯示1號"1"
  100.                         TR0=0;         //關閉定時器0,時間停止
  101.                         TR1=1;         //打開定時器1,使揚聲器響一下
  102.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  103.                 }
  104.         }
  105.         if(K2==0)
  106.         {
  107.                 delay(10);
  108.                 if(K2==0)
  109.                 {
  110.                         while(K2==0&&i)
  111.                         {
  112.                                 i--;
  113.                                 delay(10);
  114.                         }
  115.                         num=2;  //數碼管顯示2號"2"
  116.                         TR0=0;         //關閉定時器0,時間停止
  117.                         TR1=1;         //打開定時器1,使揚聲器響一下
  118.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  119.                 }
  120.          }
  121.          if(K3==0)
  122.         {
  123.                 delay(10);
  124.                 if(K3==0)
  125.                 {
  126.                         while(K3==0&&i)
  127.                         {
  128.                                 i--;
  129.                                 delay(10);
  130.                         }
  131.                         num=3;  //數碼管顯示3號"3"
  132.                         TR0=0;         //關閉定時器0,時間停止
  133.                         TR1=1;         //打開定時器1,使揚聲器響一下
  134.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  135.                 }
  136.           }
  137.           if(K4==0)
  138.         {
  139.                 delay(10);
  140.                 if(K4==0)
  141.                 {
  142.                         while(K4==0&&i)
  143.                         {
  144.                                 i--;
  145.                                 delay(10);
  146.                         }
  147.                         num=4;  //數碼管顯示4號"4"
  148.                         TR0=0;         //關閉定時器0,時間停止
  149.                         TR1=1;         //打開定時器1,使揚聲器響一下
  150.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  151.                 }
  152.         }
  153.         if(K5==0)
  154.         {
  155.                 delay(10);
  156.                 if(K5==0)
  157.                 {
  158.                         while(K5==0&&i)
  159.                         {
  160.                                 i--;
  161.                                 delay(10);
  162.                         }
  163.                         num=5;  //數碼管顯示5號"5"
  164.                         TR0=0;         //關閉定時器0,時間停止
  165.                         TR1=1;         //打開定時器1,使揚聲器響一下
  166.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  167.                 }
  168.         }
  169.         if(K6==0)
  170.         {
  171.                 delay(10);
  172.                 if(K6==0)
  173.                 {
  174.                         while(K6==0&&i)
  175.                         {
  176.                                 i--;
  177.                                 delay(10);
  178.                         }
  179.                         num=6;  //數碼管顯示6號"6"
  180.                         TR0=0;         //關閉定時器0,時間停止
  181.                         TR1=1;         //打開定時器1,使揚聲器響一下
  182.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  183.                 }
  184.         }
  185.         if(K7==0)
  186.         {
  187.                 delay(10);
  188.                 if(K7==0)
  189.                 {
  190.                         while(K7==0&&i)
  191.                         {
  192.                                 i--;
  193.                                 delay(10);
  194.                         }
  195.                         num=7;  //數碼管顯示7號"7"
  196.                         TR0=0;         //關閉定時器0,時間停止
  197.                         TR1=1;         //打開定時器1,使揚聲器響一下
  198.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  199.                 }
  200.      }
  201.          if(K8==0)
  202.         {
  203.                 delay(10);
  204.                 if(K8==0)
  205.                 {
  206.                         while(K8==0&&i)
  207.                         {
  208.                                 i--;
  209.                                 delay(10);
  210.                         }
  211.                         num=8;  //數碼管顯示8號"8"
  212.                         TR0=0;         //關閉定時器0,時間停止
  213.                         TR1=1;         //打開定時器1,使揚聲器響一下
  214.                         flag2=0;   //關閉開始鍵標志位,使再按其他七個鍵不會響
  215.                 }
  216.         }
  217. }
  218. //數碼管顯示子函數
  219. void display()
  220. {
  221.         if(flag1==1)         //開始鍵按下,開始計時搶答
  222.         {
  223.                 if(num!=0)         //如果有人搶答,就顯示相應的幾號
  224.                 {
  225.                         P0=table1[num];   //顯示幾號搶到了
  226.                         P2=table2[0];
  227.                         delay(2);
  228.                         P0=0;
  229.                         P2=0xff;
  230.                 }
  231.                 else                   //否則沒人搶答,則前面不顯示幾號
  232.                 {
  233.                         P0=0x00;
  234.                         P2=0xff;
  235.                 }
  236.                 P0=table1[s/10];     //下面為搶答倒計時
  237.                 P2=table2[2];
  238.                 delay(2);
  239.                 P0=0;
  240.                 P2=0xff;
  241.                    P0=table1[s%10];     //下面為搶答倒計時
  242.                 P2=table2[3];
  243.                 delay(2);
  244.                 P2=0xff;
  245.             P0=0x00;
  246.         }
  247.         else         //如果開始鍵沒有按下,則顯示FFF(若有違規者,則顯示違規號碼及FF)
  248.                          //或者時間調整
  249.         {
  250.                 if(flag4==1)   //違規顯示
  251.                 {
  252.                         if(num!=0)
  253.                         {
  254.                                 P0=table1[num];
  255.                                 P2=table2[0];
  256.                                 delay(2);
  257.                                 P0=0x00;
  258.                                 P2=0xff;

  259.                                 P0=table1[15];        //下面顯示FF,表示違規了
  260.                                 P2=table2[2];
  261.                                 delay(2);
  262.                                 P0=0x00;         //消隱
  263.                                 P2=0xff;
  264.                                 P0=table1[15];
  265.                                 P2=table2[3];
  266.                                 delay(2);
  267.                                 P0=0x00;
  268.                                 P2=0xff;
  269.                         }
  270.                         else
  271.                         {
  272.                                 P0=0x00;
  273.                                 P2=0xff;      
  274.                         }
  275.                 }
  276.           else
  277.           {
  278.                           if(aa==1)
  279.                         {
  280.                                 P0=0x76;         //第一位數碼管顯示"5(s)"(表示搶答時間調整)
  281.                                 P2=table2[0];
  282.                                 delay(2);
  283.                                 P0=0x00;
  284.                                 P2=0xff;
  285.                                 P0=table1[time1/10];  //下面顯示調整的搶答時間
  286.                                 P2=table2[2];
  287.                                 delay(2);
  288.                                 P0=0x00;
  289.                                 P2=0xff;
  290.                                 P0=table1[time1%10];  //下面顯示調整的搶答時間
  291.                                 P2=table2[3];
  292.                                 delay(2);
  293.                                 P0=0x00;
  294.                                 P2=0xff;
  295.                         }
  296.                    else if(bb==1)
  297.                    {
  298.                                    P0=0x38;  //第一位與第二位數碼管合起來顯示"T",表示答題時間調整
  299.                                 P2=table2[0];
  300.                                 delay(2);
  301.                                 P0=0x00;
  302.                                 P2=0xff;
  303.                                 P0=table1[time2/10];  //下面顯示調整的搶答時間
  304.                                 P2=table2[2];
  305.                                 delay(2);
  306.                                 P0=0x00;
  307.                                 P2=0xff;
  308.                                 P0=table1[time2%10];  //下面顯示調整的搶答時間
  309.                                 P2=table2[3];
  310.                                 delay(2);
  311.                                 P0=0x00;
  312.                                 P2=0xff;
  313.                    }
  314.                    else                 //否則顯示FFF
  315.                    {
  316.                                    P0=table1[15];
  317.                                 P2=table2[0];
  318.                                 delay(2);
  319.                                 P0=0x00;
  320.                                 P2=0xff;                //
  321.                                 P0=table1[15];
  322.                                 P2=table2[2];
  323.                                 delay(2);
  324.                                 P0=0x00;
  325.                                 P2=0xff;
  326.                                 P0=table1[15];
  327.                                 P2=table2[3];
  328.                                 delay(2);
  329.                                 P0=0x00;
  330.                                 P2=0xff;
  331.                    }
  332.           }
  333.         }
  334. }
  335. //調整時間鍵掃描子函數
  336. void key2()
  337. {
  338.         uchar i=100;
  339.         if(S2==0)        //搶答時間調整
  340.         {
  341.                 delay(10);
  342.                 if(S2==0)
  343.                 {
  344.                         while(S2==0&&i)
  345.                         {
  346.                                 i--;
  347.                                 delay(10);
  348.                         }
  349.                         time1++;
  350.                         if(time1==61)
  351.                         {
  352.                                 time1=10;
  353.                         }
  354.                         aa=1;          //將搶答時間標志位置1
  355.                         bb=0;          //同時關閉答題時間標志位
  356.                 }      
  357.         }
  358.         if(S3==0)                  //答題時間調整
  359.         {
  360.                 delay(10);
  361.                 if(S3==0)
  362.                 {
  363.                         while(S3==0&&i)
  364.                         {
  365.                                 i--;
  366.                                 delay(10);
  367.                         }
  368.                         time2++;
  369.                         if(time2==61)
  370.                         {
  371.                                 time2=10;
  372.                         }
  373.                         bb=1;
  374.                         aa=0;
  375.                 }
  376.         }
  377. }
  378. //主函數
  379. void main()
  380. {
  381.         uchar i=100;
  382.         init();
  383.         while(1)
  384.         {
  385.                 key1();
  386.                 if((flag1==0)&(flag2==1))//當開始鍵沒有按下及沒有人違規時才可進行時間調整
  387.                 {
  388.                         key2();
  389.                 }
  390.                 if((flag1==1)&(flag2==0))//當開始鍵按下及有人搶答才進行開始回答計時倒計時
  391.                 {
  392.                         if(S1==0)
  393.                         {
  394.                                 delay(10);
  395.                                 if(S1==0)
  396.                                 {
  397.                                         while(S1==0&&i)
  398.                                         {
  399.                                                 i--;
  400.                                                 delay(10);
  401.                                         }
  402.                                         s=time2;
  403.                                         TR0=1;
  404.                                         m=0;
  405.                                         TR1=1;
  406.                                 }
  407.                         }
  408.                 }
  409.                 if((flag1==0)&(flag2==1))  //違規
  410.                 {
  411.                         key();
  412.                         if(num!=0)  //開始鍵沒有按下時,有人按下了搶答鍵,則置違規標志位
  413.                         {
  414.                                 flag4=1;
  415.                                 D0=0;
  416.                         }
  417.                 }
  418.                 if((flag1==1)&(flag2==1))//如果開始鍵按下且搶答鍵沒有按下,則進行八路搶答鍵掃描
  419.                 {
  420.                         key();
  421.                 }
  422.                 display();    //顯示到數碼管上
  423.         }
  424. }
  425. //定時器0中斷子函數
  426. void t0() interrupt 1
  427. {
  428.         TH0=(65536-2000)/256;         //2ms
  429.         TL0=(65536-2000)%256;
  430.         if(flag3)          //開始鍵按下,嘟一聲,長一秒,表示開始搶答
  431.         {
  432.                 beep=~beep;
  433.         }
  434.         else
  435.                 beep=1;
  436.         if(s<5)                //搶答時間快到報警,隔一秒響一聲且紅燈閃爍,響三聲
  437.         {
  438.                 if(s%2==0)
  439.                 {
  440.                         flag3=1;
  441.                         D0=0;
  442.                 }
  443.                 else
  444.                 {
  445.                         flag3=0;
  446.                         D0=1;      
  447.                 }
  448.         }
  449.         m++;
  450.         if(m==500)                //1秒
  451.         {
  452.                 m=0;
  453.                 s--;
  454.                 flag3=0;   //關閉開始鍵按下響一秒的嘟聲
  455.                 if(s==-1)
  456.                 {
  457.                         s=20;
  458.                         TR0=0;
  459.                         flag1=0;        //顯示FFF
  460.                         flag2=1;
  461.                         num=0;
  462.                         D0=1;
  463.                 }
  464.         }
  465. }
  466. //定時器1中斷子函數
  467. void t1() interrupt 3        //定時器1處理有人按下搶答器嘟一生,長1秒
  468. {
  469.     TH0=(65536-2000)/256;         //2ms
  470.         TL0=(65536-2000)%256;
  471.         beep=~beep;
  472.         n++;
  473.         if(n==500)
  474.         {
  475.                 n=0;
  476.                 TR1=0;
  477.         }      
  478. }

復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:335259 發表于 2019-9-24 15:49 | 顯示全部樓層
大神,可以把你這板子的焊接原理圖告訴我嗎
回復

使用道具 舉報

ID:658761 發表于 2019-12-9 11:08 來自觸屏版 | 顯示全部樓層
老哥,有沒有仿真圖
回復

使用道具 舉報

ID:736988 發表于 2020-4-26 02:01 來自觸屏版 | 顯示全部樓層
老哥,沒有仿真圖
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91免费在线看 | 蜜桃特黄a∨片免费观看 | 一区二区三区在线免费观看 | 一区二区高清 | 成人毛片一区二区三区 | 亚洲在线久久 | 91久久国产综合久久 | 亚洲精色 | 中文字幕高清av | 理论片免费在线观看 | 爱爱无遮挡 | 天天曰夜夜 | 亚洲网址在线观看 | 国产精品亚洲综合 | 91久色 | 亚洲aⅴ | 久久久新视频 | 午夜视频在线免费观看 | 精品无码久久久久久国产 | 一色一黄视频 | 亚洲理论在线观看电影 | 成人欧美一区二区三区黑人孕妇 | 久久婷婷国产香蕉 | 亚洲视频 欧美视频 | 久久久国产一区二区三区四区小说 | 国产在线观看av | 国产福利精品一区 | 欧美不卡一区二区 | 天天操人人干 | 国产精品一区二区不卡 | 91久久精 | 日韩久久久久 | 在线毛片网 | 久久新| 成人性生交大片免费看中文带字幕 | 成人免费黄视频 | 日韩一级免费大片 | 一区二区日韩精品 | 免费的av网站 | 国产在线精品一区二区 | 日本精品一区二区 |