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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3232|回復: 0
收起左側

單片機8路搶答器程序與Proteus仿真原理圖

[復制鏈接]
ID:947480 發表于 2021-12-15 16:38 | 顯示全部樓層 |閱讀模式
制作出來的實物圖如下:
IMG_0629.JPG IMG_0630.JPG

八路搶答器元件清單
1)    9*15萬用板
2)    四位一體共陰數碼管
3)    STC89C51單片機
4)    40P芯片座
5)    12M晶振
6)    30P瓷片電容    *2
7)    10K電阻
8)    10uF電解電容
9)    2.2K電阻
10)    102排阻
11)    PNP三極管9012
12)    5v有源蜂鳴器
13)    按鍵*11
14)    4P下載排針
15)    DC座(電源插座)
16)    自鎖開關
17)    細導線
18)    焊錫
19)    USB電源線或電池盒+DC插頭

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

采用單片機作為整個控制核心,控制系統主要由:顯示模塊、控制模塊、報警模塊、搶答模塊組成。搶答模塊可以采用獨立按鍵或矩陣鍵盤,顯示模塊可以采用數碼管的動態掃描或LCD1602液晶顯示屏。
八路搶答器需要按鈕不是太多,獨立按鍵相比于矩陣鍵盤,可以直接讀取,檢測占用時間少,程序簡單,能使搶答器更加快捷,簡單。選手搶答更方便,所以選用獨立按鍵。對于顯示模塊而言,數碼管便宜,利用動態掃描完全可以實現多位數字,LCD1602液晶顯示屏,液晶顯示屏顯示的功能強大,可顯示大量文字、圖形,雖然LCD1602液晶屏進行顯示可以顯示32個字符,但本設計用不到那么多顯示,而數碼管滿足需求,且性價比更好,所以選擇數碼管。

搶答器的工作原理是采用單片機最小系統,用程序查詢方式采用動態顯示組號。主持人按下開始搶答鍵才可以搶答。主持人按下開始搶答按紐(P3.0),數碼管60秒倒計時開始(60秒內必須回答完問題),選手準備搶答,60秒內有人搶答則蜂鳴器響聲提示并在數碼管顯示他的組號及剩余時間,60秒內無選手搶答,則在最后五秒倒計時發出警報。答題結束,需主持人復位還原。單片機最小系統、搶答按鍵模塊(四位并行數碼顯示)、顯示模塊、顯示驅動模塊、搶答開關模塊、蜂鳴器音頻輸出模塊。

單片機復位電路通常采用上電自動復位和按鈕復位兩種方式。本次設計的復位電路是通過外部電路的電容充放電來實現的。只要Vcc的上升時間不超過1ms,就可以實現自動上電復位。

電路中當一個問題結束主持人后按下復位開關后進行下一題的準備。

選手搶答鍵
89C51的P1口做一個為選手搶答的輸入按鍵引腳,P1.0至P1.7輪流輸出低電位,給每一個選手編號1至8,當選手按下按鈕時,P1口個端口的電平變化從P1口輸入,經單片機處理后從P0輸出由數碼管顯示搶答者編號。

顯示與顯示驅動電路包括顯示和驅動,顯示采用數碼管,驅動用P2口,搶答成功者編號和回答問題時間60秒倒計時所剩時間均在數碼管上顯示,數碼管采用動態顯示。驅動電路P2口,查詢顯示程序利用P0口做段選碼口輸出P2低3位做位選碼輸出,當為低電平則能驅動數碼管使其顯示數字。在+5V電壓下接1k的電阻,保證正常壓降。

蜂鳴器輸出電路
通過控制不同頻率的矩形脈沖來控制蜂鳴器發聲。此次設計中只需要一些簡單的提示聲音,搶答成功、搶答時間用完后,得到提示聲。

        顯示初始界面,如需要調整倒計時時間,按下按鈕進入倒計時設置界面,設置成功返回到主界面,搶答開始,主持人按下開始按鈕,進入主程序,數碼管開始倒計時,有選手搶答,則跳入搶答子程序,顯示選手序號及倒計時所剩時間。若無選手搶答,則程序一直執行,在最后5秒發出警報直到倒計時結束。待到下一次使用,按下復位鍵就可以執行上述操作。

選手搶答成功,發出警報提示,告知其他選手已有選手搶答成功,數碼管顯示選手序號和倒計時所剩時間,在選手答題完畢后,主持人按下復位按鈕。繼續下一輪搶答。

測試結果和分析
軟件調試中的模塊包括顯示功能模塊,調整時間功能模塊,搶答功能模塊以及報警功能模塊。各個獨立模塊功能調試成功后,將這些模塊程序通過主程序合并在一起,最后再對合并后的總程序進行調試。仿真和實物實現功能一致。數碼管上選手序號顯示正確,蜂鳴器在規定范圍內發出報警。
當主持人按下開始鍵時,向單片機P3.0引腳輸入一個低電平信號,表示整個電路開始工作,此時數碼管前兩位顯示選手編號(無人搶答顯示00),后兩位顯示倒計時剩余時間。若在60秒內仍然無人搶答,蜂鳴器在最后5秒發出連續報警,提示搶答時間快要結束;若在60秒內有人搶答,并且搶答成功,則將選手編號顯示在數碼管前兩位上,后兩位顯示搶答剩余時間,同時蜂鳴器發出一聲報警,提示其他沒有搶答的選手此題已被人搶答成功。若在搶答過程中遇見特殊情況,主持人則可以通過時間加,時間減按鍵來進行時間調節。若要開始新的一輪搶答,主持人按下復位鍵再按開始鍵即可。

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. sbit smg1=P2^0;                //定義數碼管第一位
  4. sbit smg2=P2^1;                //定義數碼管第二位
  5. sbit smg3=P2^2;                //定義數碼管第三位
  6. sbit keyks=P3^0;        //定義開始按鍵
  7. sbit keytz=P3^1;        //定義停止按鍵
  8. sbit keyqc=P3^2;        //定義清除按鍵
  9. sbit key1=P1^0;                //定義1號搶答選手
  10. sbit key2=P1^1;                //定義2號搶答選手
  11. sbit key3=P1^2;                //定義3號搶答選手
  12. sbit key4=P1^3;                //定義4號搶答選手
  13. sbit key5=P1^4;                //定義5號搶答選手
  14. sbit key6=P1^5;                //定義6號搶答選手
  15. sbit key7=P1^6;                //定義7號搶答選手
  16. sbit key8=P1^7;                //定義8號搶答選手
  17. sbit spk=P3^7;                //定義蜂鳴器
  18. int djs=30,js=0;                   //djs和bt是初始倒計時時間,可修改
  19. //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  20. int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};

  21. void delayms(int x)           //延時函數
  22. {
  23.         unsigned int i;
  24.         while(x--)
  25.         {
  26.                 for(i=20;i>0;i--);
  27.         }
  28. }

  29. void Timer0_init()                        //定時器0初始化
  30. {
  31.         js=0;
  32.         TMOD=0x01;                                  //T0為定時器方式1
  33.         TH0=0x3c;
  34.         TL0=0xb0;                        
  35.         //TR0=1;//IT1=1;
  36.         ET0=1;//EX1=1;
  37.         EA=1;        
  38. }

  39. void timer0() interrupt 1 using 1        //定時器0中斷服務函數
  40. {
  41. //            TF0=0;
  42.                  TH0=0x3c;
  43.                 TL0=0xb0;                                        //賦初值
  44.                 js++;
  45.                 if(js>=20)
  46.                   { js=0;
  47.                     djs--;                                        //產生1s的倒計時
  48.                         //led1=~led1;
  49.                    }
  50. }

  51. void djsxs()                                   //顯示倒計時函數
  52. {        int b1,b2;
  53.          b1=djs/10;
  54.         b2=djs%10;                                  // 將倒計時時間分成高低位
  55.         P0=table[b1];
  56.     smg2=0;
  57.     delayms(3);
  58.     smg2=1;                                         //顯示十位數字

  59.         P0=table[b2];
  60.         smg3=0;
  61.         delayms(3);                                 //顯示個位數字
  62.         smg3=1;
  63. }
  64. void djsxs22()                                 
  65. {        
  66.          P0=0x40;
  67.     smg1=0;
  68.     delayms(3);
  69.     smg1=1;                                        //第一位數碼管顯示-

  70.         P0=0x40;
  71.     smg2=0;
  72.     delayms(3);                           //第三位數碼管顯示-
  73.     smg2=1;

  74.         P0=0x40;
  75.         smg3=0;
  76.         delayms(3);
  77.         smg3=1;                                  //第四位數碼管顯示-
  78. }

  79. void djsxs1()
  80. {
  81.         P0=table[1];
  82.     smg1=0;
  83.     delayms(3);
  84.     smg1=1;                                   //第一位數碼管顯示1

  85. }
  86. void djsxs2()
  87. {
  88.         P0=table[2];
  89.     smg1=0;
  90.     delayms(3);
  91.     smg1=1;                                //第一位數碼管顯示2

  92. }
  93. void djsxs3()
  94. {
  95.         P0=table[3];
  96.     smg1=0;
  97.     delayms(3);
  98.     smg1=1;                          //第一位數碼管顯示3

  99. }
  100. void djsxs4()
  101. {
  102.         P0=table[4];
  103.     smg1=0;
  104.     delayms(3);
  105.     smg1=1;                         //第一位數碼管顯示4

  106. }
  107. void djsxs5()
  108. {
  109.         P0=table[5];
  110.     smg1=0;
  111.     delayms(3);
  112.     smg1=1;                   //第一位數碼管顯示5

  113. }
  114. void djsxs6()
  115. {
  116.         P0=table[6];
  117.     smg1=0;
  118.     delayms(3);
  119.     smg1=1;                        //第一位數碼管顯示6

  120. }
  121. void djsxs7()
  122. {
  123.         P0=table[7];
  124.     smg1=0;
  125.     delayms(3);
  126.     smg1=1;                  //第一位數碼管顯示7
  127. }
  128. void djsxs8()
  129. {
  130.         P0=table[8];
  131.     smg1=0;
  132.     delayms(3);
  133.     smg1=1;                 //第一位數碼管顯示8

  134. }
  135. void main()
  136. {
  137.         int djs1=60;
  138.         Timer0_init();         //初始化定時器中斷
  139.         spk=1;                          //蜂鳴器不響
  140.         djs=60;                //倒計時賦值
  141.         while(1)
  142.         {
  143.         
  144.                 LOOP1:   djs=djs1;
  145.                 djsxs22();        //LOOP1是標號,顯示 -  --
  146.                
  147.                 if(key1==0)                 //在定時器運行狀態下,key1==0 則說明1號選手按下按鍵
  148.                 {
  149.                         delayms(300);
  150.                         if(key1==0)
  151.                         {
  152.                                 while(!key1);          //去除按鍵抖動后,重新在判斷,是否確實按下
  153.                                 djs=60;
  154.                                 while(1)
  155.                                 {
  156.                                         TR0=0;                  //定時器停止
  157.                                         djsxs();         
  158.                                         if(key2==0)         
  159.                                         {        
  160.                                                 delayms(300);                   //去除抖動
  161.                                                 if(key2==0)           //再次判斷是否按下
  162.                                                 {
  163.                                                         while(!key2); //如果按下
  164.                                                         djs++;
  165.                                                         djs1=djs;
  166.                                                 }
  167.                                         }
  168.                                         if(key3==0)         
  169.                                         {        
  170.                                                 delayms(300);                   //去除抖動
  171.                                                 if(key3==0)           //再次判斷是否按下
  172.                                                 {
  173.                                                         while(!key3); //如果按下
  174.                                                         djs--;
  175.                                                         djs1=djs;
  176.                                                 }
  177.                                         }
  178.                                         if(key1==0)         
  179.                                         {        
  180.                                                 delayms(100);                   //去除抖動
  181.                                                 if(key1==0)           //再次判斷是否按下
  182.                                                 {
  183.                                                         while(!key1); //如果按下
  184.                                                         goto LOOP1;                  //goto語句,回到loop1表號處
  185.                                                 }
  186.                                         }                                                                                   
  187.                                 }
  188.                         }
  189.                 }
  190.                 if(keyks==0)
  191.                 {                  
  192.                         //spk=0;
  193.                         delayms(300);                 //去除按鍵抖動
  194.                         if(keyks==0)
  195.                         {
  196.                                 while(!keyks);          //以上表示按下開始按鍵
  197.                                 //spk=1;                           //蜂鳴器不響
  198.                                 TR0=1;                           //啟動定時器 開始倒計時
  199.                                 while(1)
  200.                                 {
  201.                                         djsxs();
  202.                                         if(keytz==0)
  203.                                         {
  204.                                                 delayms(300);                         //此處表示出去抖動, 以后不一一標出
  205.                                                 if(keytz==0)
  206.                                                 {
  207.                                                         while(!keytz);           //以上表示按下停止按鍵后
  208.                                                         TR0=0;                   //定時器停止
  209.                                                 }
  210.                                         }
  211.                                         if(keyks==0)
  212.                                         {
  213.                                                 //spk=0;
  214.                                                 delayms(300);
  215.                                                 if(keyks==0)
  216.                                                 {
  217.                                                         while(!keyks);           //以上表示按下清楚按鍵后
  218.                                                         //spk=1;                           //蜂鳴器不響
  219.                                                         TR0=1;                   //定時器啟動
  220.                                                 }
  221.                                         }
  222. /***************************以下是八個選手搶答,key1表示1號選手,依次類推,注釋只寫第一位選手,其他和第一個完全一致,************************************/
  223.                                         if((key1==0)&&(TR0==1))                 //在定時器運行狀態下,key1==0 則說明1號選手按下按鍵
  224.                                         {                 
  225.                                                 spk=0;                 //蜂鳴器響
  226.                                                 delayms(3);
  227.                                                 if(key1==0)
  228.                                                 {
  229.                                                         while(!key1);          //去除按鍵抖動后,重新在判斷,是否確實按下
  230.                                                         spk=1;                  //蜂鳴器不響
  231.                                                         while(1)
  232.                                                         {
  233.                                                                 TR0=0;                  //定時器停止
  234.                                                                 djsxs1();          //顯示選手編號
  235.                                                                 djsxs();          //顯示剩余倒計時時間
  236.                                                                 if(keyqc==0)
  237.                                                                 {        
  238.                                                                         delayms(3);                   //去除抖動
  239.                                                                         if(keyqc==0)
  240.                                                                         {
  241.                                                                                 while(!keyqc); //如果按下清楚鍵,則回到- --狀態
  242.                                                                                 goto LOOP1;                  //goto語句,回到loop1表號處
  243.                                                                         }
  244.                                                                 }                                                                                   
  245.                                                         }
  246.                                                 }
  247.                                         }
  248.                                         if((key2==0)&&(TR0==1))
  249.                                         {
  250.                                                 spk=0;
  251.                                                 delayms(3);
  252.                                                 if(key2==0)
  253.                                                 {
  254.                                                         while(!key2);
  255.                                                         spk=1;
  256.                                                         while(1)
  257.                                                         {
  258.                                                                 TR0=0;
  259.                                                                 djsxs2();
  260.                                                                 djsxs();
  261.                                                                 if(keyqc==0)
  262.                                                                 {        
  263.                                                                         delayms(3);
  264.                                                                         if(keyqc==0)
  265.                                                                         {
  266.                                                                                 while(!keyqc);
  267.                                                                                 goto LOOP1;        
  268.                                                                         }
  269.                                                                 }                                                                                   
  270.                                                         }
  271.                                                 }
  272.                                         }
  273.                                         if((key3==0)&&(TR0==1))
  274.                                         {
  275.                                                 spk=0;
  276.                                                 delayms(3);
  277.                                                 if(key3==0)
  278.                                                 {
  279.                                                         while(!key3);
  280.                                                         spk=1;
  281.                                                         while(1)
  282.                                                         {
  283.                                                                 TR0=0;
  284.                                                                 djsxs3();
  285.                                                                 djsxs();
  286.                                                                 if(keyqc==0)
  287.                                                                 {        
  288.                                                                         delayms(3);
  289.                                                                         if(keyqc==0)
  290.                                                                         {
  291.                                                                                 while(!keyqc);
  292.                                                                                 goto LOOP1;        
  293.                                                                         }
  294.                                                                 }                                                                                   
  295.                                                         }
  296.                                                 }
  297.                                         }
  298.                                         if((key4==0)&&(TR0==1))
  299.                                         {
  300.                                                 spk=0;
  301.                                                 delayms(3);
  302.                                                 if(key4==0)
  303.                                                 {
  304.                                                         while(!key4);
  305.                                                         spk=1;
  306.                                                         while(1)
  307.                                                         {
  308.                                                                 TR0=0;
  309.                                                                 djsxs4();
  310.                                                                 djsxs();
  311.                                                                 if(keyqc==0)
  312.                                                                 {        
  313.                                                                         delayms(3);
  314.                                                                         if(keyqc==0)
  315.                                                                         {
  316.                                                                                 while(!keyqc);
  317.                                                                                 goto LOOP1;        
  318.                                                                         }
  319.                                                                 }                                                                                   
  320.                                                         }
  321.                                                 }
  322.                                         }
  323.                                         if((key5==0)&&(TR0==1))
  324.                                         {
  325.                                                 spk=0;
  326.                                                 delayms(3);
  327.                                                 if(key5==0)
  328.                                                 {
  329.                                                         while(!key5);
  330.                                                         spk=1;
  331.                                                         while(1)
  332.                                                         {
  333.                                                                 TR0=0;
  334.                                                                 djsxs5();
  335.                                                                 djsxs();
  336.                                                                 if(keyqc==0)
  337.                                                                 {        
  338.                                                                         delayms(3);
  339.                                                                         if(keyqc==0)
  340.                                                                         {
  341.                                                                                 while(!keyqc);
  342.                                                                                 goto LOOP1;        
  343.                                                                         }
  344.                                                                 }                                                                                   
  345.                                                         }
  346.                                                 }
  347.                                         }
  348.                                         if((key6==0)&&(TR0==1))
  349.                                         {
  350.                                                 spk=0;
  351.                                                 delayms(3);
  352.                                                 if(key6==0)
  353.                                                 {
  354.                                                         while(!key6);
  355.                                                         spk=1;
  356.                                                         while(1)
  357.                                                         {
  358.                                                                 TR0=0;
  359.                                                                 djsxs6();
  360.                                                                 djsxs();
  361.                                                                 if(keyqc==0)
  362.                                                                 {        
  363.                                                                         delayms(3);
  364.                                                                         if(keyqc==0)
  365.                                                                         {
  366.                                                                                 while(!keyqc);
  367.                                                                                 goto LOOP1;        
  368.                                                                         }
  369.                                                                 }                                                                                   
  370.                                                         }
  371.                                                 }
  372.                                         }
  373.                                         if((key7==0)&&(TR0==1))
  374.                                         {
  375.                                                 spk=0;
  376.                                                 delayms(3);
  377.                                                 if(key7==0)
  378.                                                 {
  379.                                                         while(!key7);
  380.                                                         spk=1;
  381.                                                         while(1)
  382.                                                         {
  383.                                                                 TR0=0;
  384.                                                                 djsxs7();
  385.                                                                 djsxs();
  386.                                                                 if(keyqc==0)
  387.                                                                 {        
  388.                                                                         delayms(3);
  389.                                                                         if(keyqc==0)
  390.                                                                         {
  391.                                                                                 while(!keyqc);
  392.                                                                                 goto LOOP1;        
  393.                                                                         }
  394.                                                                 }           
  395.                                                         }
  396.                                                 }
  397. ……………………

  398. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

仿真代碼51hei附件下載:
仿真程序.7z (1.29 MB, 下載次數: 34)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产成人 | 91精品国产乱码久久久久久久久 | 天堂网avav | 伊人久久免费视频 | 精品网站999 | 国产精品久久久久一区二区 | 97免费在线视频 | 亚洲91精品| 欧美高清成人 | 欧美日韩精品免费观看 | 福利视频一二区 | 一级做a爰片性色毛片视频停止 | 亚洲va中文字幕 | 久久国产精品一区 | 亚洲精品高清视频在线观看 | 亚洲日本一区二区三区四区 | 91精品国产91久久久久久吃药 | 日韩在线观看视频一区 | 亚洲一区二区三区观看 | 精品一区二区三区四区外站 | 午夜噜噜噜 | 精品国产乱码久久久久久88av | 亚洲啊v在线 | 久草视频观看 | 欧美日韩高清在线观看 | 国产在线一区二区三区 | 日日日色| 国产91久久精品一区二区 | 网站一区二区三区 | 色婷婷综合久久久中字幕精品久久 | 人人玩人人添人人澡欧美 | 久国久产久精永久网页 | 日本三级精品 | 久99久视频| 亚洲国产成人精 | 国产一区欧美 | 午夜精品久久久 | 国产福利在线 | 91啪影院| 亚洲精品乱码久久久久久9色 | 精品亚洲一区二区 |