主要內(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ī)源程序如下:- #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; //定義復(fù)位按鍵
-
- sbit key1=P1^0; //定義1號(hào)表決人
- sbit key2=P1^1; //定義2號(hào)表決人
- sbit key3=P1^2; //定義3號(hào)表決人
- sbit key4=P1^3; //定義4號(hào)表決人
- sbit key5=P1^4; //定義5號(hào)表決人
- sbit key6=P1^5; //定義6號(hào)表決人
- sbit key7=P1^6; //定義7號(hào)表決人
-
- 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是初始倒計(jì)時(shí)時(shí)間
- //flag1~7用來保證在未開始表決之前誤按 flagD用來控制是否顯示倒計(jì)時(shí) bjs表決計(jì)數(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() //定時(shí)器0初始化
- {
- js=0;
- TMOD=0x01; //設(shè)置定時(shí)器0為工作方式1(M1M0為01)
- TH0=(65536-45872)/256; //裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
- TL0=(65536-45872)%256;
- ET0=1; //開定時(shí)器0中斷
- EA=1; //開總中斷
- }
-
- void timer0() interrupt 1 using 1 //定時(shí)器0中斷服務(wù)函數(shù)
- {
- TH0=(65536-45872)/256; //裝初值11.0592M晶振定時(shí)50ms數(shù)為45872
- TL0=(65536-45872)%256;
- js++; //疊加20次
- if(js==20)
- {
- js=0; //清空
- djs--; //產(chǎn)生1s的倒計(jì)時(shí)
- }
- }
-
- void djsxs() //顯示倒計(jì)時(shí)函數(shù)
- {
- int b1,b2;
- b1=djs/10;
- b2=djs%10; //將倒計(jì)時(shí)時(shí)間分成高低位
- P0=table[b1];
- smg2=0;
- delayms(3);
- smg2=1; //顯示十位數(shù)字
-
- P0=table[b2];
- smg3=0;
- delayms(3); //顯示個(gè)位數(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; //修改倒計(jì)時(shí)第一處,共兩處
- djs=10; //修改倒計(jì)時(shí)第二處,共兩處
- bjs=0; //表決計(jì)數(shù)
- Timer0_init(); //初始化定時(shí)器中斷
- while(1)
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(djs<=0) //倒計(jì)時(shí)10s時(shí)間到
- {
- flagD=0; //不再顯示時(shí)間
- TR0=0; //關(guān)閉定時(shí)器
- flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0; //關(guān)閉選手的按鍵
- 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(); //顯示倒計(jì)時(shí)函數(shù)
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(keyks==0) //開始按鍵
- {
- delayms(3); //去除按鍵抖動(dòng)
- if(keyks==0)
- {
- while(!keyks); //以上表示按下開始按鍵
- spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
- TR0=1; //啟動(dòng)定時(shí)器 開始倒計(jì)時(shí)
- flagD=1; //顯示倒計(jì)時(shí)函數(shù)
- bjs=0; //歸零
- flag1=1,flag2=1,flag3=1,flag4=1,flag5=1,flag6=1,flag7=1;//開啟使能使選手按鍵按下有效
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(keyqc==0) //復(fù)位按鍵
- {
- P3=0xff;
- delayms(3); //去除按鍵抖動(dòng)
- if(keyqc==0)
- {
- while(!keyqc); //以上表示按下開始按鍵
- spk=0;delayms(200);spk=1;delayms(200);spk=0;delayms(200);spk=1;//蜂鳴器響響
- TR0=0; //關(guān)閉定時(shí)器
- djs=djs1; //倒計(jì)時(shí)10s重新賦值
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////
- if(zt==0) //暫停系統(tǒng)
- {
- TR0=~TR0;
- while(zt==0);
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////
- if((key1==0)&&(TR0==1)&&(flag1==1)) //在定時(shí)器運(yùn)行狀態(tài)下,key1==0 則說明1號(hào)表決人按下按鍵
- {
- l1=0;
- delayms(3);
- if(key1==0)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 以上的Word格式文檔51黑下載地址(注意暫時(shí)不提供仿真文件):
7人多數(shù)表決器.doc
(757 KB, 下載次數(shù): 116)
2020-11-1 16:51 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|