制作出來的實物圖如下:
八路搶答器元件清單
1) 9*15萬用板
2) 四位一體共陰數(shù)碼管
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仿真工程文件可到本帖附件中下載)
采用單片機作為整個控制核心,控制系統(tǒng)主要由:顯示模塊、控制模塊、報警模塊、搶答模塊組成。搶答模塊可以采用獨立按鍵或矩陣鍵盤,顯示模塊可以采用數(shù)碼管的動態(tài)掃描或LCD1602液晶顯示屏。
八路搶答器需要按鈕不是太多,獨立按鍵相比于矩陣鍵盤,可以直接讀取,檢測占用時間少,程序簡單,能使搶答器更加快捷,簡單。選手搶答更方便,所以選用獨立按鍵。對于顯示模塊而言,數(shù)碼管便宜,利用動態(tài)掃描完全可以實現(xiàn)多位數(shù)字,LCD1602液晶顯示屏,液晶顯示屏顯示的功能強大,可顯示大量文字、圖形,雖然LCD1602液晶屏進行顯示可以顯示32個字符,但本設計用不到那么多顯示,而數(shù)碼管滿足需求,且性價比更好,所以選擇數(shù)碼管。
搶答器的工作原理是采用單片機最小系統(tǒng),用程序查詢方式采用動態(tài)顯示組號。主持人按下開始搶答鍵才可以搶答。主持人按下開始搶答按紐(P3.0),數(shù)碼管60秒倒計時開始(60秒內(nèi)必須回答完問題),選手準備搶答,60秒內(nèi)有人搶答則蜂鳴器響聲提示并在數(shù)碼管顯示他的組號及剩余時間,60秒內(nèi)無選手搶答,則在最后五秒倒計時發(fā)出警報。答題結束,需主持人復位還原。單片機最小系統(tǒng)、搶答按鍵模塊(四位并行數(shù)碼顯示)、顯示模塊、顯示驅(qū)動模塊、搶答開關模塊、蜂鳴器音頻輸出模塊。
單片機復位電路通常采用上電自動復位和按鈕復位兩種方式。本次設計的復位電路是通過外部電路的電容充放電來實現(xiàn)的。只要Vcc的上升時間不超過1ms,就可以實現(xiàn)自動上電復位。
電路中當一個問題結束主持人后按下復位開關后進行下一題的準備。
選手搶答鍵
89C51的P1口做一個為選手搶答的輸入按鍵引腳,P1.0至P1.7輪流輸出低電位,給每一個選手編號1至8,當選手按下按鈕時,P1口個端口的電平變化從P1口輸入,經(jīng)單片機處理后從P0輸出由數(shù)碼管顯示搶答者編號。
顯示與顯示驅(qū)動電路包括顯示和驅(qū)動,顯示采用數(shù)碼管,驅(qū)動用P2口,搶答成功者編號和回答問題時間60秒倒計時所剩時間均在數(shù)碼管上顯示,數(shù)碼管采用動態(tài)顯示。驅(qū)動電路P2口,查詢顯示程序利用P0口做段選碼口輸出P2低3位做位選碼輸出,當為低電平則能驅(qū)動數(shù)碼管使其顯示數(shù)字。在+5V電壓下接1k的電阻,保證正常壓降。
蜂鳴器輸出電路
通過控制不同頻率的矩形脈沖來控制蜂鳴器發(fā)聲。此次設計中只需要一些簡單的提示聲音,搶答成功、搶答時間用完后,得到提示聲。
顯示初始界面,如需要調(diào)整倒計時時間,按下按鈕進入倒計時設置界面,設置成功返回到主界面,搶答開始,主持人按下開始按鈕,進入主程序,數(shù)碼管開始倒計時,有選手搶答,則跳入搶答子程序,顯示選手序號及倒計時所剩時間。若無選手搶答,則程序一直執(zhí)行,在最后5秒發(fā)出警報直到倒計時結束。待到下一次使用,按下復位鍵就可以執(zhí)行上述操作。
選手搶答成功,發(fā)出警報提示,告知其他選手已有選手搶答成功,數(shù)碼管顯示選手序號和倒計時所剩時間,在選手答題完畢后,主持人按下復位按鈕。繼續(xù)下一輪搶答。
測試結果和分析
軟件調(diào)試中的模塊包括顯示功能模塊,調(diào)整時間功能模塊,搶答功能模塊以及報警功能模塊。各個獨立模塊功能調(diào)試成功后,將這些模塊程序通過主程序合并在一起,最后再對合并后的總程序進行調(diào)試。仿真和實物實現(xiàn)功能一致。數(shù)碼管上選手序號顯示正確,蜂鳴器在規(guī)定范圍內(nèi)發(fā)出報警。
當主持人按下開始鍵時,向單片機P3.0引腳輸入一個低電平信號,表示整個電路開始工作,此時數(shù)碼管前兩位顯示選手編號(無人搶答顯示00),后兩位顯示倒計時剩余時間。若在60秒內(nèi)仍然無人搶答,蜂鳴器在最后5秒發(fā)出連續(xù)報警,提示搶答時間快要結束;若在60秒內(nèi)有人搶答,并且搶答成功,則將選手編號顯示在數(shù)碼管前兩位上,后兩位顯示搶答剩余時間,同時蜂鳴器發(fā)出一聲報警,提示其他沒有搶答的選手此題已被人搶答成功。若在搶答過程中遇見特殊情況,主持人則可以通過時間加,時間減按鍵來進行時間調(diào)節(jié)。若要開始新的一輪搶答,主持人按下復位鍵再按開始鍵即可。
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- sbit smg1=P2^0; //定義數(shù)碼管第一位
- sbit smg2=P2^1; //定義數(shù)碼管第二位
- sbit smg3=P2^2; //定義數(shù)碼管第三位
- sbit keyks=P3^0; //定義開始按鍵
- sbit keytz=P3^1; //定義停止按鍵
- sbit keyqc=P3^2; //定義清除按鍵
- 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 key8=P1^7; //定義8號搶答選手
- sbit spk=P3^7; //定義蜂鳴器
- int djs=30,js=0; //djs和bt是初始倒計時時間,可修改
- //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};
- void delayms(int x) //延時函數(shù)
- {
- unsigned int i;
- while(x--)
- {
- for(i=20;i>0;i--);
- }
- }
- void Timer0_init() //定時器0初始化
- {
- js=0;
- TMOD=0x01; //T0為定時器方式1
- TH0=0x3c;
- TL0=0xb0;
- //TR0=1;//IT1=1;
- ET0=1;//EX1=1;
- EA=1;
- }
- void timer0() interrupt 1 using 1 //定時器0中斷服務函數(shù)
- {
- // TF0=0;
- TH0=0x3c;
- TL0=0xb0; //賦初值
- js++;
- if(js>=20)
- { js=0;
- djs--; //產(chǎn)生1s的倒計時
- //led1=~led1;
- }
- }
- 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 djsxs22()
- {
- P0=0x40;
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示-
- P0=0x40;
- smg2=0;
- delayms(3); //第三位數(shù)碼管顯示-
- smg2=1;
- P0=0x40;
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示-
- }
- void djsxs1()
- {
- P0=table[1];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示1
- }
- void djsxs2()
- {
- P0=table[2];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示2
- }
- void djsxs3()
- {
- P0=table[3];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示3
- }
- void djsxs4()
- {
- P0=table[4];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示4
- }
- void djsxs5()
- {
- P0=table[5];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示5
- }
- void djsxs6()
- {
- P0=table[6];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示6
- }
- void djsxs7()
- {
- P0=table[7];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示7
- }
- void djsxs8()
- {
- P0=table[8];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示8
- }
- void main()
- {
- int djs1=60;
- Timer0_init(); //初始化定時器中斷
- spk=1; //蜂鳴器不響
- djs=60; //倒計時賦值
- while(1)
- {
-
- LOOP1: djs=djs1;
- djsxs22(); //LOOP1是標號,顯示 - --
-
- if(key1==0) //在定時器運行狀態(tài)下,key1==0 則說明1號選手按下按鍵
- {
- delayms(300);
- if(key1==0)
- {
- while(!key1); //去除按鍵抖動后,重新在判斷,是否確實按下
- djs=60;
- while(1)
- {
- TR0=0; //定時器停止
- djsxs();
- if(key2==0)
- {
- delayms(300); //去除抖動
- if(key2==0) //再次判斷是否按下
- {
- while(!key2); //如果按下
- djs++;
- djs1=djs;
- }
- }
- if(key3==0)
- {
- delayms(300); //去除抖動
- if(key3==0) //再次判斷是否按下
- {
- while(!key3); //如果按下
- djs--;
- djs1=djs;
- }
- }
- if(key1==0)
- {
- delayms(100); //去除抖動
- if(key1==0) //再次判斷是否按下
- {
- while(!key1); //如果按下
- goto LOOP1; //goto語句,回到loop1表號處
- }
- }
- }
- }
- }
- if(keyks==0)
- {
- //spk=0;
- delayms(300); //去除按鍵抖動
- if(keyks==0)
- {
- while(!keyks); //以上表示按下開始按鍵
- //spk=1; //蜂鳴器不響
- TR0=1; //啟動定時器 開始倒計時
- while(1)
- {
- djsxs();
- if(keytz==0)
- {
- delayms(300); //此處表示出去抖動, 以后不一一標出
- if(keytz==0)
- {
- while(!keytz); //以上表示按下停止按鍵后
- TR0=0; //定時器停止
- }
- }
- if(keyks==0)
- {
- //spk=0;
- delayms(300);
- if(keyks==0)
- {
- while(!keyks); //以上表示按下清楚按鍵后
- //spk=1; //蜂鳴器不響
- TR0=1; //定時器啟動
- }
- }
- /***************************以下是八個選手搶答,key1表示1號選手,依次類推,注釋只寫第一位選手,其他和第一個完全一致,************************************/
- if((key1==0)&&(TR0==1)) //在定時器運行狀態(tài)下,key1==0 則說明1號選手按下按鍵
- {
- spk=0; //蜂鳴器響
- delayms(3);
- if(key1==0)
- {
- while(!key1); //去除按鍵抖動后,重新在判斷,是否確實按下
- spk=1; //蜂鳴器不響
- while(1)
- {
- TR0=0; //定時器停止
- djsxs1(); //顯示選手編號
- djsxs(); //顯示剩余倒計時時間
- if(keyqc==0)
- {
- delayms(3); //去除抖動
- if(keyqc==0)
- {
- while(!keyqc); //如果按下清楚鍵,則回到- --狀態(tài)
- goto LOOP1; //goto語句,回到loop1表號處
- }
- }
- }
- }
- }
- if((key2==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key2==0)
- {
- while(!key2);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs2();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key3==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key3==0)
- {
- while(!key3);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs3();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key4==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key4==0)
- {
- while(!key4);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs4();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key5==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key5==0)
- {
- while(!key5);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs5();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key6==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key6==0)
- {
- while(!key6);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs6();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key7==0)&&(TR0==1))
- {
- spk=0;
- delayms(3);
- if(key7==0)
- {
- while(!key7);
- spk=1;
- while(1)
- {
- TR0=0;
- djsxs7();
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
仿真代碼51hei附件下載:
仿真程序.7z
(1.29 MB, 下載次數(shù): 34)
2021-12-16 02:52 上傳
點擊文件名下載附件
|