主要內(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é)束圖 單片機源程序如下:- #include<reg51.h>
- #include<intrins.h>
-
- sbit smg1=P2^4; //定義數(shù)碼管第一位
- sbit smg2=P2^6; //定義數(shù)碼管第二位
- sbit smg3=P2^7; //定義數(shù)碼管第三位
- sbit smg4=P2^5; //定義數(shù)碼管第四位
-
- sbit keyks=P2^2; //定義開始按鍵
- sbit keyqc=P2^0; //定義復位按鍵
-
- sbit key1=P1^0; //定義1號表決人
- sbit key2=P1^1; //定義2號表決人
- sbit key3=P1^2; //定義3號表決人
- sbit key4=P1^3; //定義4號表決人
- sbit key5=P1^4; //定義5號表決人
- sbit key6=P1^5; //定義6號表決人
- sbit key7=P1^6; //定義7號表決人
-
- sbit l1=P3^0; //定義第1燈
- sbit l2=P3^1; //定義第2燈
- sbit l3=P3^2; //定義第3燈
- sbit l4=P3^3; //定義第4燈
- sbit l5=P3^4; //定義第5燈
- sbit l6=P3^5; //定義第6燈
- sbit l7=P3^6; //定義第7燈
-
- sbit zt=P2^1; //定義暫停
- sbit spk=P1^7; //定義蜂鳴器
-
- int djs,js=0; //djs和bt是初始倒計時時間
- //flag1~7用來保證在未開始表決之前誤按 flagD用來控制是否顯示倒計時 bjs表決計數(shù)
- int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0,flagD=0,bjs=0;
- int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80,0x9b};
- // 0 1 2 3 4 5 6 7 8 9 E
- void delayms(unsigned z)
- {
- unsigned x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
-
- void Timer0_init() //定時器0初始化
- {
- js=0;
- TMOD=0x01; //設置定時器0為工作方式1(M1M0為01)
- TH0=(65536-45872)/256; //裝初值11.0592M晶振定時50ms數(shù)為45872
- TL0=(65536-45872)%256;
- ET0=1; //開定時器0中斷
- EA=1; //開總中斷
- }
-
- void timer0() interrupt 1 using 1 //定時器0中斷服務函數(shù)
- {
- TH0=(65536-45872)/256; //裝初值11.0592M晶振定時50ms數(shù)為45872
- TL0=(65536-45872)%256;
- js++; //疊加20次
- if(js==20)
- {
- js=0; //清空
- djs--; //產(chǎn)生1s的倒計時
- }
- }
-
- void djsxs() //顯示倒計時函數(shù)
- {
- int b1,b2;
- b1=djs/10;
- b2=djs%10; //將倒計時時間分成高低位
- P0=table[b1];
- smg2=0;
- delayms(3);
- smg2=1; //顯示十位數(shù)字
-
- P0=table[b2];
- smg3=0;
- delayms(3); //顯示個位數(shù)字
- smg3=1;
- }
- void djsxs10() //第一位數(shù)碼管顯示 0
- {
- P0=0x5f; //第一位數(shù)碼管顯示0
- smg1=0;
- delayms(3);
- smg1=1;
- }
- void djsxs11() //第一位數(shù)碼管顯示1
- {
- P0=0x44; //第一位數(shù)碼管顯示1
- smg1=0;
- delayms(3);
- smg1=1;
- }
- void djsxs20() //第二位數(shù)碼管顯示 -
- {
- P0=0x80; //第二位數(shù)碼管顯示-
- smg4=0;
- delayms(3);
- smg4=1;
- }
- void djsxs30() //第三位數(shù)碼管顯示 -
- {
- P0=0x80; //第三位數(shù)碼管顯示-
- smg2=0;
- delayms(3);
- smg2=1;
- }
- void djsxs0() //第四位數(shù)碼管顯示0
- {
- P0=table[0];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示0
-
- }
- void djsxs1() //第四位數(shù)碼管顯示1
- {
- P0=table[1]; //第四位數(shù)碼管顯示1
- smg3=0;
- delayms(3);
- smg3=1;
-
- }
- void djsxs2() //第四位數(shù)碼管顯示2
- {
- P0=table[2];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示2
-
- }
- void djsxs3() //第四位數(shù)碼管顯示3
- {
- P0=table[3];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示3
-
- }
- void djsxs4() //第四位數(shù)碼管顯示4
- {
- P0=table[4];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示4
-
- }
- void djsxs5() //第四位數(shù)碼管顯示5
- {
- P0=table[5];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示5
-
- }
- void djsxs6() //第四位數(shù)碼管顯示6
- {
- P0=table[6];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示6
-
- }
- void djsxs7() //第四位數(shù)碼管顯示7
- {
- P0=table[7];
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示7
- }
-
-
- void main()
- {
- int djs1=10; //修改倒計時第一處,共兩處
- djs=10; //修改倒計時第二處,共兩處
- bjs=0; //表決計數(shù)
- Timer0_init(); //初始化定時器中斷
- while(1)
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(djs<=0) //倒計時10s時間到
- {
- flagD=0; //不再顯示時間
- TR0=0; //關閉定時器
- flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0; //關閉選手的按鍵
- djsxs20();djsxs30(); //顯示結(jié)果,此處顯示 --
- switch(bjs) //顯示結(jié)果,此處顯示 1或0(通不通過) -- 同意人數(shù)
- {
- case 0: djsxs0();djsxs10(); break;
- case 1: djsxs1();djsxs10(); break;
- case 2: djsxs2();djsxs10(); break;
- case 3: djsxs3();djsxs10(); break;
- case 4: djsxs4();djsxs11(); break;
- case 5: djsxs5();djsxs11(); break;
- case 6: djsxs6();djsxs11(); break;
- case 7: djsxs7();djsxs11(); break;
- default: ;
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(flagD==1) djsxs(); //顯示倒計時函數(shù)
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(keyks==0) //開始按鍵
- {
- delayms(3); //去除按鍵抖動
- if(keyks==0)
- {
- while(!keyks); //以上表示按下開始按鍵
- spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
- TR0=1; //啟動定時器 開始倒計時
- flagD=1; //顯示倒計時函數(shù)
- bjs=0; //歸零
- flag1=1,flag2=1,flag3=1,flag4=1,flag5=1,flag6=1,flag7=1;//開啟使能使選手按鍵按下有效
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(keyqc==0) //復位按鍵
- {
- P3=0xff;
- delayms(3); //去除按鍵抖動
- if(keyqc==0)
- {
- while(!keyqc); //以上表示按下開始按鍵
- spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
- TR0=0; //關閉定時器
- djs=djs1; //倒計時10s重新賦值
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(zt==0) //暫停系統(tǒng)
- {
- TR0=~TR0;
- while(zt==0);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////
- if((key1==0)&&(TR0==1)&&(flag1==1)) //在定時器運行狀態(tài)下,key1==0 則說明1號表決人按下按鍵
- {
- l1=0;
- delayms(3);
- if(key1==0)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 以上的Word格式文檔51黑下載地址(注意暫時不提供仿真文件):
7人多數(shù)表決器.doc
(757 KB, 下載次數(shù): 116)
2020-11-1 16:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|