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