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

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

QQ登錄

只需一步,快速開始

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

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

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

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

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

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



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

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

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

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

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

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

3.4 顯示模塊

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

圖3-4  顯示模塊圖

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

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

圖4-1  主程序設(shè)計(jì)流程圖

4.2子程序設(shè)計(jì)
4.2.1 子程序設(shè)計(jì)1

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

圖4-2  子程序設(shè)計(jì)1流程圖

4.2.2 子程序設(shè)計(jì)2

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

圖4-2  子程序設(shè)計(jì)2圖

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

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

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

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

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

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

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

單片機(jī)源程序如下:
  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;              //定義復(fù)位按鍵

  9. sbit key1=P1^0;                            //定義1號(hào)表決人            
  10. sbit key2=P1^1;                            //定義2號(hào)表決人
  11. sbit key3=P1^2;                            //定義3號(hào)表決人
  12. sbit key4=P1^3;                            //定義4號(hào)表決人
  13. sbit key5=P1^4;                            //定義5號(hào)表決人
  14. sbit key6=P1^5;                            //定義6號(hào)表決人
  15. sbit key7=P1^6;                            //定義7號(hào)表決人

  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是初始倒計(jì)時(shí)時(shí)間            
  26. //flag1~7用來保證在未開始表決之前誤按   flagD用來控制是否顯示倒計(jì)時(shí)  bjs表決計(jì)數(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()                                          //定時(shí)器0初始化
  37. {
  38.     js=0;
  39.               TMOD=0x01;                                                        //設(shè)置定時(shí)器0為工作方式1(M1M0為01)
  40.               TH0=(65536-45872)/256;              //裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
  41.               TL0=(65536-45872)%256;                           
  42.               ET0=1;                                                                                    //開定時(shí)器0中斷
  43.               EA=1;                                                                                    //開總中斷
  44. }

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

  56. void djsxs()   //顯示倒計(jì)時(shí)函數(shù)
  57. {            
  58.               int b1,b2;
  59.               b1=djs/10;
  60.               b2=djs%10;                                                          //將倒計(jì)時(shí)時(shí)間分成高低位
  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);                                                        //顯示個(gè)位數(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;                                             //修改倒計(jì)時(shí)第一處,共兩處
  158.               djs=10;                                           //修改倒計(jì)時(shí)第二處,共兩處
  159.               bjs=0;                                                                         //表決計(jì)數(shù)
  160.               Timer0_init();             //初始化定時(shí)器中斷
  161.               while(1)
  162.               {
  163. ////////////////////////////////////////////////////////////////////////////////////////////////                                                                                      
  164.               if(djs<=0)                                               //倒計(jì)時(shí)10s時(shí)間到
  165.               {
  166.                 flagD=0;                                                            //不再顯示時(shí)間
  167.                 TR0=0;                                                           //關(guān)閉定時(shí)器
  168.                 flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0;              //關(guān)閉選手的按鍵
  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();                 //顯示倒計(jì)時(shí)函數(shù)
  185. ////////////////////////////////////////////////////////////////////////////////////////////////
  186.               if(keyks==0)  //開始按鍵
  187.               {            
  188.                  delayms(3);                            //去除按鍵抖動(dòng)
  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;                                             //啟動(dòng)定時(shí)器 開始倒計(jì)時(shí)
  194.                   flagD=1;                               //顯示倒計(jì)時(shí)函數(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)  //復(fù)位按鍵
  201.               {            
  202.                             P3=0xff;
  203.                  delayms(3);                            //去除按鍵抖動(dòng)
  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;                                             //關(guān)閉定時(shí)器
  209.                   djs=djs1;                               //倒計(jì)時(shí)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))              //在定時(shí)器運(yùn)行狀態(tài)下,key1==0 則說明1號(hào)表決人按下按鍵
  220.               {                           
  221.                             l1=0;
  222.                  delayms(3);
  223.               if(key1==0)
  224. ……………………

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

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

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 久久综合一区二区三区 | 欧美久久精品一级黑人c片 91免费在线视频 | 成人免费视频网站在线观看 | 亚洲一区二区视频 | 99热视| 国产午夜精品久久久 | 青春草在线 | 久久www免费人成看片高清 | 成人在线小视频 | 日日日干干干 | 亚洲精品欧美一区二区三区 | 亚洲在线视频 | 日韩精品极品视频在线观看免费 | 精品国产欧美一区二区 | 亚洲欧美日韩电影 | 精品日韩在线观看 | 成人精品视频在线 | 国产精品久久久久久久久久久免费看 | 免费视频99| 久久久久久久久久久久久久av | 91精品久久久久久久久中文字幕 | 蜜桃传媒av | 爱高潮www亚洲精品 中文字幕免费视频 | 欧美中文字幕一区二区三区 | 国产亚洲精品综合一区 | 国产成人精品一区二三区在线观看 | 国产二区精品视频 | 日韩亚洲一区二区 | 偷拍亚洲色图 | 日韩国产高清在线观看 | 福利社午夜影院 | 在线观看国产精品一区二区 | 日韩精品在线观看视频 | 国产男女猛烈无遮掩视频免费网站 | 亚洲精品成人在线 | av日韩高清 | 成人av大全| 91精品国产乱码久久久 | 中文字幕乱码视频32 | 日韩视频在线观看一区二区 |