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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9615|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機7人多數(shù)表決器源程序與電路原理圖設計

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:664167 發(fā)表于 2020-11-1 17:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
主要內(nèi)容:

設計一個七人多數(shù)表決器,表決器的功能是將所投票者的結(jié)果綜合起來,超過半數(shù)贊成則表示結(jié)果通過,反之則不通過。而七人表決器由七個人來投票,當贊成的票數(shù)大于或者等于4人,則認為通過,通過則顯示1;當反對的票數(shù)大于或者等于4人時,則認為不通過,不通過則顯示為0。
  
  
基本要求:
(1)7人多數(shù)表決邏輯:多數(shù)通過。
(2)在主持人控制下,10秒內(nèi)表決有效。
(3)采用數(shù)碼管顯示表決10秒倒計時。
(4)表決結(jié)束后用發(fā)光二極管及數(shù)碼管顯示表決結(jié)果,數(shù)碼管顯示結(jié)果:通過、不通過,同意人數(shù)。
(5)設主持人控制鍵、暫停鍵、復位鍵。控制鍵:啟動表決,暫停鍵:暫停表決,復位鍵:系統(tǒng)復位。
(6)支持表決者,則其對的LED就發(fā)光
(7)表決開始采用聲音提示。
  
系統(tǒng)硬件電路設計

表決器器硬件電路由單片機最小系統(tǒng)模塊、按鍵模塊、顯示模塊、狀態(tài)指示模塊組成。圖3-1所示為表決器電路原理圖 。

圖3-1  表決器電路原理圖



按鍵模塊由10個按鍵組成,分為按鍵開始部分和表決部分。按鍵開始部分,分別接AT89C52單片機的P2端口的P2.0、P2.1、P2.2引腳。當主理人按下對應的按鍵,即給對應的引腳一個低電平。在軟件設計的程序中寫入相應的操作,即可實現(xiàn)開始、暫停和復位的功能。即當按下S1時,系統(tǒng)開始運行;當按下S2時,系統(tǒng)停止運行;當按下S3時,系統(tǒng)恢復初始狀態(tài)。

表決按鍵部分由七個按鍵組成,分別是S4-S10在7個按。按鍵一端接地,一端連接AT89C52單片機的P1端口。在表決時,當表決人按下他們相對應的按鍵,即給對應的引腳一個低電平,系統(tǒng)就會對其進行記錄,當表決時間結(jié)束后,就會在數(shù)碼管第四位顯示同意表決的人數(shù)。以此來統(tǒng)計投票情況。表決按鍵模塊的電路原理圖如圖3-3所示。

圖3-3  表決按鍵模塊電路原理圖

3.3 狀態(tài)指示模塊

狀態(tài)指示模塊由7個LED燈組成,LED一端接電源,另一端接單片機P3端口,LED燈用來指示表決時的表決人的狀態(tài),當表決人按了自己相對應的按鍵他自己相對應的LED燈就會發(fā)出黃色的光。在連接LED燈時,不能直接將LED燈連接到單片機的端口上,如果直接連接的話,LED燈就會燒掉,從而其不到相應的功能,這時我們需要在相應的LED燈的位置連接一個電阻來起到保險作用,而我們接的電阻的大小直接影響到LED燈的發(fā)光程度,最好選擇200歐姆的電阻,也可以將全部的LED串到一個電阻上來實現(xiàn)這個功能。狀態(tài)指示模塊電路原理圖如圖3-4所示。

圖3-4  狀態(tài)指示模塊電路原理圖

3.4 顯示模塊

在應用場景中,還需顯示表決倒計時的時間、表決的結(jié)果及同意表決的人數(shù)等信息,這部分由顯示模塊完成。表決倒計時的時間在系統(tǒng)開始運行時,數(shù)碼管的第三和第四位顯示;表決的結(jié)果在系統(tǒng)運行結(jié)束后,在數(shù)碼管的第一位顯示,如果顯示數(shù)字“1”,這表示表決通過,如果顯示數(shù)字“0”;表決的同意人數(shù)在數(shù)碼管的第四位顯示。這顯示模塊在本設計中,使用共陰極4位數(shù)碼管連接到AT80C52的P0端口。我們在連接數(shù)碼管的時候不能直接將數(shù)碼管直接連接到P0端口上,這樣連接了,你按下開始按鍵數(shù)碼管也不會顯示數(shù)字,我們在連接的時候需要并連一個排阻,也可以用8個1K的電阻來代替,因為P0端口在AT89C52單片機的內(nèi)部沒有驅(qū)動電阻,然而不接電阻的話就沒有足夠的電能來驅(qū)動數(shù)碼管。如圖3-4所示

圖3-4  顯示模塊圖

4系統(tǒng)軟件設計
4.1主程序設計

系統(tǒng)主程序開始以后,首先是對系統(tǒng)環(huán)境進行初始化,包括設置串口、定時器、中斷和端口。進入主程序之后,首先進行鍵盤掃描,檢測主持人的開始搶答按鍵和復位按鍵的狀態(tài)。如沒有任何動作,則數(shù)碼管與狀態(tài)指示燈設置為初始狀態(tài);如果開始搶答按鍵按下,則為定時器0設置初值,并開啟定時器0,開始搶答倒計時,從10到0倒數(shù),并設置狀態(tài)指示燈。這時開始檢測是否有表決人按下按鍵。如果10s內(nèi)沒有表決人按下按鍵,則判斷是否還要繼續(xù)表決,并回到鍵盤掃描。如果 10s內(nèi)有表決人按下按鍵,表決人對應的LED發(fā)光。倒計時10s結(jié)束,數(shù)碼管第四位顯示表決同意人數(shù),如果表決同意人數(shù)大于等于4人,數(shù)碼管第一位顯示數(shù)字“1”,表決同意人數(shù)小于4人,數(shù)碼管的第一位就顯示數(shù)字“0”。表決完成,則由主持人按復位鍵,回到按鍵掃描狀態(tài)。搶答器系統(tǒng)程序流程圖如圖4-1所示。

圖4-1  主程序設計流程圖

4.2子程序設計
4.2.1 子程序設計1

系統(tǒng)開始10s倒計時,表決人按下按鍵,表決人對應的LED燈就會發(fā)光,10s倒計時結(jié)束,數(shù)碼管的第四位顯示表決同意通過的人數(shù),如果表決的人數(shù)大于等于4人時,數(shù)碼管的第一位顯示數(shù)字“1”,如果表決人數(shù)小于4人,數(shù)碼管的第一位顯示數(shù)字“0”。主持人看是否進行下一次的表決,如果進行下次表決,主持人就按下復位按鍵,開始新一輪的表決。如圖4-2所示。

圖4-2  子程序設計1流程圖

4.2.2 子程序設計2

系統(tǒng)10s倒計時結(jié)束,數(shù)碼管的第四位顯示表決同意的結(jié)果,如果表決同意的人數(shù)大于等于4人時,數(shù)碼管的第一位顯示數(shù)字“1”,如果表決的人數(shù)小于4人時,數(shù)碼管的第一位顯示數(shù)字“0”。主持人看是否進行下一次的表決,如果進行下次表決,主持人就按下復位按鍵,開始新一輪的表決。如圖4-3所示。

圖4-2  子程序設計2圖

5系統(tǒng)性能測試和結(jié)果分析

系統(tǒng)開始運行,主持人按下開始按鍵,蜂鳴器發(fā)給“滴滴”聲,數(shù)碼管的第3,4位開始進行10s的倒計時。如圖5-1所示,數(shù)碼管倒計時顯示倒計時到了9s時的圖形。

圖5-1 系統(tǒng)開始運行

系統(tǒng)運行中,主持人可以緊急情況下按暫停按鍵,暫停表決,表決人可以按下自己對應的按鍵進行表決,當表決人按下自己的按鍵時,他自己對應的LED就會發(fā)光。如圖5-2所示,數(shù)碼管倒計時到3s的時候,有2號、3號、5號和7號表決人按下了自己的表決按鍵。

圖5-2 系統(tǒng)運行中的圖

系統(tǒng)運行結(jié)束后,數(shù)碼管不再顯示倒計時的數(shù)據(jù),數(shù)碼管的第一位會顯示表決是否通過,通過即顯示數(shù)字“1”,不通過即顯示數(shù)字“0”,數(shù)碼管的四位顯示表決同意的人數(shù)。表決結(jié)束要開始新的表決主持人可以按下復位按鍵進行下一次的表決。如圖5-3所示,10s倒計時結(jié)束,數(shù)碼管的第四位顯示為四,則說明有4人同意表決,由LED可以看出是2號、3號、5號和7號表決人同意表決,數(shù)碼管第一位顯示為數(shù)字“1”,則顯示表決通過。

圖5-3 系統(tǒng)運行結(jié)束圖

單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. sbit smg1=P2^4;                            //定義數(shù)碼管第一位
  4. sbit smg2=P2^6;                            //定義數(shù)碼管第二位
  5. sbit smg3=P2^7;                            //定義數(shù)碼管第三位
  6. sbit smg4=P2^5;                            //定義數(shù)碼管第四位

  7. sbit keyks=P2^2;              //定義開始按鍵
  8. sbit keyqc=P2^0;              //定義復位按鍵

  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 l1=P3^0;                            //定義第1燈
  17. sbit l2=P3^1;                            //定義第2燈
  18. sbit l3=P3^2;                            //定義第3燈
  19. sbit l4=P3^3;                            //定義第4燈
  20. sbit l5=P3^4;                            //定義第5燈
  21. sbit l6=P3^5;                            //定義第6燈
  22. sbit l7=P3^6;                            //定義第7燈

  23. sbit zt=P2^1;   //定義暫停
  24. sbit spk=P1^7;                            //定義蜂鳴器

  25. int djs,js=0;                  //djs和bt是初始倒計時時間            
  26. //flag1~7用來保證在未開始表決之前誤按   flagD用來控制是否顯示倒計時  bjs表決計數(shù)
  27. int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flagD=0,bjs=0;            
  28. int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80,0x9b};
  29.       //   0    1   2    3    4    5    6     7    8     9      E
  30. void delayms(unsigned z)            
  31. {
  32.               unsigned x,y;
  33.     for(x=z;x>0;x--)
  34.       for(y=110;y>0;y--);  
  35. }

  36. void Timer0_init()                                          //定時器0初始化
  37. {
  38.     js=0;
  39.               TMOD=0x01;                                                        //設置定時器0為工作方式1(M1M0為01)
  40.               TH0=(65536-45872)/256;              //裝初值11.0592M晶振定時50ms數(shù)為45872
  41.               TL0=(65536-45872)%256;                           
  42.               ET0=1;                                                                                    //開定時器0中斷
  43.               EA=1;                                                                                    //開總中斷
  44. }

  45. void timer0() interrupt 1 using 1              //定時器0中斷服務函數(shù)
  46. {
  47.               TH0=(65536-45872)/256;                            //裝初值11.0592M晶振定時50ms數(shù)為45872
  48.               TL0=(65536-45872)%256;            
  49.               js++;                                                                                    //疊加20次
  50.               if(js==20)
  51.               {
  52.                 js=0;                                                                                    //清空
  53.                 djs--;                                                                      //產(chǎn)生1s的倒計時
  54.               }
  55. }

  56. void djsxs()   //顯示倒計時函數(shù)
  57. {            
  58.               int b1,b2;
  59.               b1=djs/10;
  60.               b2=djs%10;                                                          //將倒計時時間分成高低位
  61.               P0=table[b1];                                          
  62.               smg2=0;
  63.               delayms(3);
  64.               smg2=1;                                                                      //顯示十位數(shù)字
  65.             
  66.               P0=table[b2];
  67.               smg3=0;
  68.               delayms(3);                                                        //顯示個位數(shù)字
  69.               smg3=1;
  70. }
  71. void djsxs10() //第一位數(shù)碼管顯示 0
  72. {
  73.               P0=0x5f;                                          //第一位數(shù)碼管顯示0
  74.     smg1=0;
  75.     delayms(3);
  76.     smg1=1;
  77. }
  78. void djsxs11() //第一位數(shù)碼管顯示1
  79. {
  80.               P0=0x44;                                          //第一位數(shù)碼管顯示1
  81.     smg1=0;
  82.     delayms(3);
  83.     smg1=1;
  84. }
  85. void djsxs20() //第二位數(shù)碼管顯示 -
  86. {
  87.               P0=0x80;                                          //第二位數(shù)碼管顯示-
  88.               smg4=0;
  89.               delayms(3);                                            
  90.               smg4=1;
  91. }
  92. void djsxs30() //第三位數(shù)碼管顯示 -
  93. {
  94.               P0=0x80;                                          //第三位數(shù)碼管顯示-
  95.               smg2=0;
  96.               delayms(3);                                            
  97.               smg2=1;
  98. }
  99. void djsxs0()  //第四位數(shù)碼管顯示0
  100. {
  101.               P0=table[0];
  102.     smg3=0;
  103.     delayms(3);
  104.     smg3=1;                            //第四位數(shù)碼管顯示0

  105. }
  106. void djsxs1()  //第四位數(shù)碼管顯示1
  107. {
  108.               P0=table[1];                  //第四位數(shù)碼管顯示1
  109.     smg3=0;
  110.     delayms(3);
  111.     smg3=1;                                                         

  112. }
  113. void djsxs2()  //第四位數(shù)碼管顯示2
  114. {
  115.               P0=table[2];
  116.     smg3=0;
  117.     delayms(3);
  118.     smg3=1;                                                        //第四位數(shù)碼管顯示2

  119. }
  120. void djsxs3()  //第四位數(shù)碼管顯示3
  121. {
  122.               P0=table[3];
  123.     smg3=0;
  124.     delayms(3);
  125.     smg3=1;                                            //第四位數(shù)碼管顯示3

  126. }
  127. void djsxs4()  //第四位數(shù)碼管顯示4
  128. {
  129.               P0=table[4];
  130.     smg3=0;
  131.     delayms(3);
  132.     smg3=1;                                          //第四位數(shù)碼管顯示4

  133. }
  134. void djsxs5()  //第四位數(shù)碼管顯示5
  135. {
  136.               P0=table[5];
  137.     smg3=0;
  138.     delayms(3);
  139.     smg3=1;                               //第四位數(shù)碼管顯示5

  140. }
  141. void djsxs6()  //第四位數(shù)碼管顯示6
  142. {
  143.               P0=table[6];
  144.     smg3=0;
  145.     delayms(3);
  146.     smg3=1;                                          //第四位數(shù)碼管顯示6

  147. }
  148. void djsxs7()  //第四位數(shù)碼管顯示7
  149. {
  150.               P0=table[7];
  151.     smg3=0;
  152.     delayms(3);
  153.     smg3=1;                              //第四位數(shù)碼管顯示7
  154. }


  155. void main()
  156. {
  157.               int djs1=10;                                             //修改倒計時第一處,共兩處
  158.               djs=10;                                           //修改倒計時第二處,共兩處
  159.               bjs=0;                                                                         //表決計數(shù)
  160.               Timer0_init();             //初始化定時器中斷
  161.               while(1)
  162.               {
  163. ////////////////////////////////////////////////////////////////////////////////////////////////                                                                                      
  164.               if(djs<=0)                                               //倒計時10s時間到
  165.               {
  166.                 flagD=0;                                                            //不再顯示時間
  167.                 TR0=0;                                                           //關閉定時器
  168.                 flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0;              //關閉選手的按鍵
  169.                 djsxs20();djsxs30();                 //顯示結(jié)果,此處顯示  --
  170.                 switch(bjs)              //顯示結(jié)果,此處顯示 1或0(通不通過) --              同意人數(shù)
  171.                 {
  172.                             case 0:              djsxs0();djsxs10();  break;
  173.                             case 1: djsxs1();djsxs10();  break;     
  174.                             case 2:              djsxs2();djsxs10();  break;
  175.                             case 3: djsxs3();djsxs10();  break;
  176.                             case 4:              djsxs4();djsxs11();  break;
  177.                             case 5: djsxs5();djsxs11();  break;     
  178.                             case 6:              djsxs6();djsxs11();  break;
  179.                             case 7: djsxs7();djsxs11();  break;                                      
  180.                             default:  ;
  181.        }
  182.                 }
  183. ////////////////////////////////////////////////////////////////////////////////////////////////
  184.               if(flagD==1) djsxs();                 //顯示倒計時函數(shù)
  185. ////////////////////////////////////////////////////////////////////////////////////////////////
  186.               if(keyks==0)  //開始按鍵
  187.               {            
  188.                  delayms(3);                            //去除按鍵抖動
  189.                  if(keyks==0)
  190.                  {
  191.                   while(!keyks);                //以上表示按下開始按鍵
  192.                             spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
  193.                             TR0=1;                                             //啟動定時器 開始倒計時
  194.                   flagD=1;                               //顯示倒計時函數(shù)
  195.                             bjs=0;                                             //歸零
  196.                             flag1=1,flag2=1,flag3=1,flag4=1,flag5=1,flag6=1,flag7=1;//開啟使能使選手按鍵按下有效
  197.                                           }
  198.                             }
  199. ////////////////////////////////////////////////////////////////////////////////////////////////
  200.               if(keyqc==0)  //復位按鍵
  201.               {            
  202.                             P3=0xff;
  203.                  delayms(3);                            //去除按鍵抖動
  204.                  if(keyqc==0)
  205.                  {
  206.                   while(!keyqc);                //以上表示按下開始按鍵
  207.                             spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
  208.                             TR0=0;                                             //關閉定時器
  209.                   djs=djs1;                               //倒計時10s重新賦值
  210.                                           }
  211.                             }
  212. ////////////////////////////////////////////////////////////////////////////////////////////////
  213.                             if(zt==0)    //暫停系統(tǒng)
  214.                             {
  215.                                           TR0=~TR0;
  216.                                           while(zt==0);
  217.                             }
  218. ///////////////////////////////////////////////////////////////////////////////////////////////
  219.               if((key1==0)&&(TR0==1)&&(flag1==1))              //在定時器運行狀態(tài)下,key1==0 則說明1號表決人按下按鍵
  220.               {                           
  221.                             l1=0;
  222.                  delayms(3);
  223.               if(key1==0)
  224. ……………………

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

復制代碼
以上的Word格式文檔51黑下載地址(注意暫時不提供仿真文件):
7人多數(shù)表決器.doc (757 KB, 下載次數(shù): 116)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂4 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草日韩 | 草久视频 | 蜜臀网 | 亚洲成人在线网 | 国产一区二区三区四区 | 国产午夜久久 | 精品欧美色视频网站在线观看 | 成人a免费 | a级性视频 | 亚洲福利在线观看 | 国产三级日本三级 | 亚洲国产精品一区 | 亚洲高清视频一区二区 | 国产午夜视频 | 黄色成人免费在线观看 | 黄色小视频入口 | 国产精品7777777 | 爱高潮www亚洲精品 中文字幕免费视频 | 精品日本中文字幕 | 91精品久久久久久久久99蜜臂 | 毛片com| 亚洲第一色av | 国产精品123区 | 国产精品一区二区在线 | 黄色av免费网站 | 日韩久久中文字幕 | 久久国产精品免费视频 | 在线看av网址 | 欧美久久久久久 | 粉嫩一区二区三区四区公司1 | 国产精品一区二区av | 中文字幕在线视频免费观看 | 波多野结衣精品 | 精品产国自在拍 | 欧美日韩精品一区二区 | 亚洲欧美在线视频 | 国产精品综合久久 | 日韩第一夜 | 午夜精品久久久久久久久久久久久 | 97伦理 | 色婷综合网|