搶答器
在知識競賽、文體娛樂活動(搶答賽活動)中,能準(zhǔn)確、公正、直觀地判斷出搶答者的座位號。更好的促進(jìn)各個團(tuán)體的競爭意識,讓選手門體驗到戰(zhàn)場般的壓力感
傳統(tǒng)搶答器只是大概判斷出搶答成功或犯規(guī)選手臺號,無法顯示出每個選手的搶答時間。而今搶答器可以通過數(shù)據(jù)來說明裁決結(jié)果的準(zhǔn)確性、公平性。使比賽大大增加了娛樂性的同時,也更加公平、公正。
新增無線搶答器更是搶答器史上的一大改革
軟件功能更強(qiáng)大:
搭配全新升級版軟件,采用嵌入式PPT設(shè)計,可支持三種格式題庫導(dǎo)入(文本文檔、WORD、Excel),15O道題導(dǎo)入只需20秒,導(dǎo)入的題目直接以PPT方式展現(xiàn),可直接在展現(xiàn)頁面進(jìn)行題目再修改。此款軟件還提供多種背景模板,供客戶選擇使用,點擊任何一款即可自動導(dǎo)入到題目中。非常簡單便捷。
搶答精度更高:
國內(nèi)首臺可以將所有選手搶答時間同步顯示出來并自動排序的搶答器,且精度高達(dá)0.00001秒。開創(chuàng)搶答領(lǐng)域新時代,讓比賽沒有爭議且更具娛樂性。
主機(jī)接線更少:一條
主線串連所有分組計分顯示屏;最大程度減少了布線的繁瑣。
搶答模式更齊全:根據(jù)
公司多年的大賽經(jīng)驗,將各類大型賽事所用的搶答模式歸結(jié)為四種:即淘汰模式、快速式、直接式、無限時式,全部納入此款軟件,所以功能相當(dāng)齊全。
搶答節(jié)奏可調(diào):
目前國內(nèi)搶答器搶答開始令的語音都是固定的,客戶無法調(diào)節(jié),新款搶答器增加了可調(diào)節(jié)功能,客戶可以根據(jù)自己的需要來自行調(diào)節(jié)比賽節(jié)奏,同時軟件還提供男生、女生兩種語音主持模式,更具人性化。
軟件操作更簡單:操作
方面進(jìn)行了多種自動識別功能,簡化比賽操作步驟,正式比賽時只需操作5、6個按鍵即可完成比賽。
電子搶答器
1電子搶答器的中心構(gòu)造一般都是由搶答器由單片機(jī)以及外圍電路組成,其搭配的配件不同又分為,非語音非記分搶答器和語音記分搶答器。
多適用于學(xué)校和企事業(yè)單位舉行的簡單的搶答活動。
非語音記分搶答器構(gòu)造很簡單,就是一個搶答器的主機(jī)和一個搶答按鈕組成,在搶答過程中選手是沒有記分的顯示屏。
語音記分搶答器是有一個搶答器的主機(jī)和主機(jī)的顯示屏和選手的記分顯示屏。
STC12C5A60S2的6路搶答器設(shè)計
搶答按鈕
根據(jù)公司多年的大賽經(jīng)驗搶答盒對比賽現(xiàn)場氣氛起到非常重要的作用。知識競賽是屬于娛樂學(xué)習(xí)的范疇,所以比賽的現(xiàn)場氣氛非常重要,搶答盒的2個技術(shù)指示燈可直接影響比賽氣圍:1,搶答盒行程多少。2,搶答盒體積大小。
1,搶答盒行行程。直接決定比賽的現(xiàn)場氣氛,而決定搶答盒行程的有2點:1,模具的行程。2,按鈕的行程。模具行程要在5~6MM為最佳,按鈕行程在2~3mm為最佳,這樣既能保證搶答的精確度,又可以保證比賽現(xiàn)場氛圍。搶答盒的行程如果小于5mm,,選手在搶答時場面就會顯得過于安靜,從現(xiàn)場看感覺還有搶答已經(jīng)搶答結(jié)束了。但行程在5~6mm的選手搶答幅度就會很大,比賽氣氛就會熱鬧很多。
2,搶答盒大小要適中,如果太小的話,搶答時一般用手指點搶答,這樣太輕也不利于比賽現(xiàn)場氣氛,本公司設(shè)計的這種搶答盒,適用手掌大力拍打來 搶答,這樣能很好的烘托出比賽的激烈程度。
總體方案設(shè)計
通過查閱大量相關(guān)技術(shù)資料,并結(jié)合自己的實際知識,我主要提出了兩種技術(shù)方案來實現(xiàn)系統(tǒng)功能。下面我將首先對這兩種方案的組成框圖和實現(xiàn)原理分別進(jìn)行說明,并分析比較它們的特點,然后闡述我最終選擇方案的原因。
搶答器采用STC12C5A60S2(或STC89C52)單片機(jī)作為控制核心,搶答器可以完成運算控制、信號識別以及顯示功能的實現(xiàn)。由于用了單片機(jī),使其技術(shù)比較成熟,應(yīng)用起來方便、簡單并且單片機(jī)周圍的輔助電路也比較少,便于控制和實現(xiàn)。整個系統(tǒng)具有極其靈活的可編程性,能方便地對系統(tǒng)進(jìn)行功能的擴(kuò)張和更改性。
單元模塊設(shè)計
搶答電路模塊
搶答器的工作原理是采用單片機(jī)最小系統(tǒng),用查詢式鍵盤進(jìn)行搶答。通過搶答按鍵模塊,鏈接按鍵進(jìn)行搶答。其工作原理為:主持人按清零鍵后,選手可按鍵搶答,單片機(jī)鎖存信號,屏蔽外界信號,同時通過5510顯示搶答成功的選手編號,并有蜂鳴器發(fā)聲。此時定時器工作,開始答題倒計時,到時間結(jié)束,主持人將系統(tǒng)清零。原理圖如下:
復(fù)位電路的設(shè)計
復(fù)位電路的設(shè)計該復(fù)位電路采用上電自動復(fù)位和手動復(fù)位兩種復(fù)位方式,要實現(xiàn)復(fù)位只需在,STC12C5A60S2單片機(jī)的RESET~I腳上加上5ms的高電平就可以了。上電復(fù)位是利用電容的充電來實現(xiàn)的,即上電瞬間RESET端的電位與Vcc相同,隨著電容上儲能增加,電容電壓也逐漸增大,充電電流減小,RESET端的電位。這樣就會建立一個脈沖電壓,調(diào)節(jié)電容與電阻的大小可對脈沖的持續(xù)時間進(jìn)行調(diào)節(jié)。通常若采用1 2MHz的晶振時,復(fù)位元件參數(shù)為10 LI F的電解電容和10kQ的電阻。按鈕復(fù)位電路是通過按下復(fù)位按鈕時,電源對RESET端,維持兩個機(jī)器周期的高電平實現(xiàn)復(fù)位的。
晶振電路的設(shè)計
STC12單片機(jī)的定時控制功能是用時鐘電路和振蕩器完成的,而根據(jù)硬件電路的不同,連接方式分為內(nèi)部時鐘方式和外部時鐘方式。內(nèi)部時鐘方式,是單片機(jī)內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,該高增益反相放大器的輸入端為芯片引腳XTAL1,輸出端引腳XTAL2。這兩個引腳跨接石英晶體振蕩器和微調(diào)電容,就構(gòu)成一個穩(wěn)定的自激振蕩器,電路如圖所示。
電路中電容C1、C2典型值通常選擇為30pF左右。對外接電容的值雖然沒有嚴(yán)格的要求,但電容的大小會影響振蕩器頻率的高低,振蕩器的穩(wěn)定性和起振的快速性。晶振的頻率通常在1.2MHZ-12MHZ之間。晶振的頻率越高,則系統(tǒng)的時鐘頻率也就越高,單片機(jī)的運行速度也就越快。本設(shè)計采用內(nèi)部時鐘方式。
蜂鳴器提示報警電路
其主要在于當(dāng)單片機(jī)執(zhí)行中斷后,當(dāng)輸出信號時能夠在很短的時間里讓揚聲器工并持續(xù)一定的時間。當(dāng)搶答器程序響應(yīng),使三極管導(dǎo)通,蜂鳴器的放大電路被接通,與此同時,喇叭發(fā)出聲響。由于自激蜂鳴器是直流電壓驅(qū)動的,不需要利用交流信號進(jìn)行驅(qū)動,只需對驅(qū)動口輸出驅(qū)動電平并通過三極管放大驅(qū)動電流就能使蜂鳴器發(fā)出聲音。單片機(jī)驅(qū)動他激蜂鳴器的方式有兩種:一種是PWM 輸出口直接驅(qū)動,另一種是利用I/O 定時翻轉(zhuǎn)電平產(chǎn)生驅(qū)動波形對蜂鳴器進(jìn)行驅(qū)動。
PWM 輸出口直接驅(qū)動是利用PWM 輸出口本身可以輸出一定的方波來直接驅(qū)動蜂鳴器。在單片機(jī)的軟件設(shè)置中有幾個系統(tǒng)寄存器是用來設(shè)置PWM 口的輸出的,可以設(shè)置占空比、周期等等,通過設(shè)置這些寄存器產(chǎn)生符合蜂鳴器要求的頻率的波形之后,只要打開PWM 輸出,PWM 輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅(qū)動蜂鳴器了。比如頻率為2000Hz 的蜂鳴器的驅(qū)動,可以知道周期為500μs,這樣只需要把PWM 的周期設(shè)置為500μs,占空比電平設(shè)置為250μs,就能產(chǎn)生一個頻率為2000Hz 的方波,通過這個方波再利用三極管就可以去驅(qū)動這個蜂鳴器了。
利用I/O 定時翻轉(zhuǎn)電平來產(chǎn)生驅(qū)動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉(zhuǎn)電平產(chǎn)生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅(qū)動蜂鳴器了。比如為2500Hz 的蜂鳴器的驅(qū)動,可以知道周期為400μs,這樣只需要驅(qū)動蜂鳴器的I/O 口每200μs 翻轉(zhuǎn)一次電平就可以產(chǎn)生一個頻率為2500Hz,占空比為1/2 duty的方波,再通過三極管放大就可以驅(qū)動這個蜂鳴器了。當(dāng)蜂鳴器發(fā)聲時,發(fā)光二激光點亮。
顯示電路
顯示電路可由LED或LCD來實現(xiàn)。此處選用ULF-3461BS來顯示。
本系統(tǒng)程序下載接口采用的是美信公司專門為電腦的RS-232標(biāo)準(zhǔn)串口設(shè)計的單電源電平轉(zhuǎn)換芯片MAX232,使用+5v單電源供電。
第一部分是電荷泵電路。由1、2、3、4、5、6腳和4只電容構(gòu)成。功能是產(chǎn)生+12v和-12v兩個電源,提供給RS-232串口電平的需要。第二部分是數(shù)據(jù)轉(zhuǎn)換通道。由7、8、9、10、11、12、13、14腳構(gòu)成兩個數(shù)據(jù)通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數(shù)據(jù)通道。8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數(shù)據(jù)通道。TTL/CMOS數(shù)據(jù)從T1IN、T2IN輸入轉(zhuǎn)換成RS-232數(shù)據(jù)從T1OUT、T2OUT送到電腦DB9插頭;DB9插頭的RS-232數(shù)據(jù)從R1IN、R2IN輸入轉(zhuǎn)換成TTL/CMOS數(shù)據(jù)后從R1OUT、R2OUT輸出。第三部分是供電。15腳GND、16腳VCC(+5v)。
鍵盤電路
鍵盤有很多種形式。比如獨立按鍵,矩陣鍵盤,編碼鍵盤等。在日常開發(fā)中經(jīng)常會
用到鍵盤。但鍵盤會占用大量的IO,比如說4*4矩陣鍵盤,會用到單片機(jī)的8個IO口。而AD鍵盤,既是利用AD轉(zhuǎn)換芯片,將鍵盤輸出的模擬電壓值進(jìn)行轉(zhuǎn)換,然后將轉(zhuǎn)換后的數(shù)字量傳送給單片機(jī),這樣就可以節(jié)省7個IO口,讓單片機(jī)流出其余的IO 口供其他外圍電路使用。
軟件設(shè)計
程序初始化:上電后,設(shè)置單片機(jī)的中斷入口及其他狀態(tài)標(biāo)志設(shè)置,清除相關(guān)中斷標(biāo)志,初始化外部顯示電路,顯示屏點亮。 端口設(shè)置及初始化:關(guān)顯示電路,按鍵電路對應(yīng)I/O口輸出LOC,以便進(jìn)行按鍵檢測。
搶答過程:顯示倒計時,掃描到有效按鍵按下,倒計時停止倒計,進(jìn)入答題倒計時,蜂鳴器鳴叫10S,然后等待復(fù)位。如果在搶答時間內(nèi),沒有掃描到有效按鍵,一直倒計時,到倒計為零的時候,沒搶答,蜂鳴器長鳴10S后,顯示“無人搶答”。 按鍵掃描:采用動態(tài)掃描,檢測到按鍵按下,軟件消抖,然后確認(rèn)按鍵。 搶答結(jié)束:清除本次搶答相關(guān)標(biāo)志,清倒計時和通道搶答確認(rèn)顯示。
系統(tǒng)能實現(xiàn)的功能:
本系統(tǒng)搶答器能實現(xiàn)如下功能:
?、?、由主持人控制答題開始,通過一個總的控制按鈕,并且蜂鳴器 發(fā)聲提示。再次按下時可以對單片機(jī)進(jìn)行復(fù)位。
?、凇⑼瑫r主持人按鈕控制著30S的搶答倒計時,當(dāng)時間到仍沒有人搶答時,蜂鳴器發(fā)聲報警,同時屏幕顯示無人搶答,等待主持人按鍵復(fù)位,進(jìn)行下一輪搶答 ③、當(dāng)有一個搶答按鈕被按下后,單片機(jī)進(jìn)行鎖存,屏蔽其他選手號,此時蜂鳴器報警提示,并進(jìn)入答題倒計時30S,若超時,則蜂鳴器報警,屏幕顯示答題超時,此時等待主持人復(fù)位。
六、主要程序
/*======================================================= 主函數(shù)
=======================================================*/ void main(void) {
system_init();//系統(tǒng)初始化 // IP = 0x20; while(1) {
seg_change();//轉(zhuǎn)換顯示的內(nèi)容 key_handle();//鍵盤處理函數(shù) switch(SPK_Flag) {
case SPK_NO: break;
case SPK_MUSIC: SpkMusic(); break; //播放音樂1 case SPK_ALARM: SpkAlarm(); break; } } }
/*======================================================= 系統(tǒng)初始化函數(shù)
=======================================================*/ void system_init(void) {
//定時器0 初始化 定時時間2ms TMOD = 0x01;
TH0 = 0x3c; //50微妙 TL0 = 0xb0;
EA = 1;
ET0 = 1; TR0 = 1;
SEG_RAM[0]=SEG_no; //這位不顯示 有人搶答時,s顯示搶答選手號 或則 無人搶答時 顯示 F
SEG_RAM[1]=SEG_no; SEG_RAM[2]=SEG_no; SEG_RAM[3]=SEG_no;
SEG_RAM[4]=SEG_no;//初始化記分器分?jǐn)?shù) SEG_RAM[5]=SEG_no; SEG_RAM[6]=SEG_no;
SEG_RAM[7]=SEG_0;//始終顯示0 }
/*======================================================= 鍵盤掃描函數(shù)
=======================================================*/ unsigned char key_scan(void) {
unsigned char keyvalue=NO_KEY; if(KEY_PORT != 0xff) {
delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); delay();delay();delay();delay(); switch (KEY_PORT) {
case 0xff: break;//無鍵按下 case 0xfe: keyvalue = PLAYER_1; break; case 0xfd: keyvalue = PLAYER_5; break; case 0xfb: keyvalue = PLAYER_2; break; case 0xf7: keyvalue = RST_KEY; break; case 0xef: keyvalue = PLAYER_3; break; case 0xdf: keyvalue = ADD_KEY; break; case 0xbf: keyvalue = PLAYER_4; break; case 0x7f: keyvalue = UP_KEY; break; }
while(KEY_PORT != 0xff);//松手檢測 }
return (keyvalue);
}
/*======================================================= 鍵盤處理函數(shù)
=======================================================*/ void key_handle(void) {
unsigned char keytemp; keytemp = key_scan(); switch(keytemp) {
case NO_KEY: break;
case PLAYER_1: case PLAYER_2: case PLAYER_3: case PLAYER_4: case PLAYER_5:
if(QD_Flag==QD_GO) {
QD_Flag = QD_OK; //切換到搶答成功狀態(tài) SEG_RAM[0] = table_duan[keytemp+1]; //第一個數(shù)碼管顯示搶答選手號
QD_show_num = keytemp;
SPK_Flag = SPK_MUSIC; //蜂鳴器 播放音樂 }
break; case RST_KEY:
QD_Flag = QD_GO; SPK_Flag = SPK_NO; QD_timectr=100;
SEG_RAM[0] = SEG_no; break; case ADD_KEY:
JFQ_ctr[QD_show_num]++; //對應(yīng)選手 記分器 加分 break; case UP_KEY:
QD_show_num++;
if(QD_show_num==5)QD_show_num=0;
SEG_RAM[0] = table_duan[QD_show_num+1];
break; } }
/*======================================================= 定時器0中斷服務(wù)程序
=======================================================*/ void Timer0_ISR(void) interrupt 1 {
static unsigned char t0_2ms_counter = 0,tt; //50毫秒計數(shù)器 ET2=0;
TL0 = 0x30; //2ms TH0 = 0xf8;
t0_2ms_counter++;
seg_display(); //2毫秒 掃描數(shù)碼管 if(t0_2ms_counter==250) //500ms / 2ms = 250 { //0.5s到 if(QD_timectr==0)
{ //搶答時間到,無人搶答,切換到搶答失敗狀態(tài) QD_Flag = QD_NO;
tt++;
if(tt==1)SPK_Flag = SPK_ALARM; //蜂鳴器 播放報警音 else SPK_Flag = SPK_NO; }
if(QD_Flag==QD_GO) QD_timectr-=5; //在搶答倒計時期間 倒計時減0.5
}
ET2=1; }
/*======================================================= 數(shù)碼管顯示函數(shù)
=======================================================*/ void seg_display(void) {
static unsigned char i=0; LED_WEI = table_wei[i]; LED_DUAN = SEG_RAM[i]; i++;
if(i》7) i=0; }
/*======================================================= 數(shù)碼管顯示轉(zhuǎn)換函數(shù)
=======================================================*/ void seg_change(void) {
if (QD_timectr《100) //取值為0~100
SEG_RAM[1]= SEG_no; //最高位為0則不顯示 else
SEG_RAM[1]= SEG_1; //最高位顯示1 SEG_RAM[2] = table_duandot[QD_timectr%100/10]; SEG_RAM[3] = table_duan[QD_timectr%10];
if(QD_Flag==2) SEG_RAM[0] = SEG_F; //顯示‘F’ 無人搶答 if(JFQ_ctr[QD_show_num]》=100) {
SEG_RAM[4]=table_duan[JFQ_ctr[QD_show_num]/100];
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《100 && JFQ_ctr[QD_show_num]》=10) {
SEG_RAM[4]=SEG_no;//不顯示0
SEG_RAM[5]=table_duan[JFQ_ctr[QD_show_num]%100/10]; SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; }
else if (JFQ_ctr[QD_show_num]《10 && JFQ_ctr[QD_show_num]》0) {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0
SEG_RAM[6]=table_duan[JFQ_ctr[QD_show_num]%10]; } else {
SEG_RAM[4]=SEG_no;//不顯示0 SEG_RAM[5]=SEG_no;//不顯示0 SEG_RAM[6]=SEG_no;//不顯示0 } }
/*======================================================= 延時函數(shù)(延時1毫秒)
=======================================================*/
void delay(void) //延時1MS {
unsigned char a,b; for(b=102;b》0;b--) for(a=3;a》0;a--); }
/*======================================================== 播放音樂 和 報警聲音
=======================================================*/ unsigned int g_ucSoundLongCNT; //
/************************************************* * 函數(shù)名稱:void T2Init(void) * 創(chuàng)建日期:2005.6.17
* 功能描述:定時器T2初始化 * 入口參數(shù):uT2Reg:定時器初值 * 返回值: 無 * 修改日志:
*************************************************/ void T2Init(unsigned int uT2Reg) {
CP_RL2=0; //16位自動重載
T2MOD=0x00; //計數(shù)增加,外部捕獲禁止 RCLK=0; TCLK=0;
TL2=RCAP2L=uT2Reg&0x00ff; TH2=RCAP2H=uT2Reg》》8;
TR2=1; // 啟動定時器 ET2=1; //t2開中斷 EA=1; }
/************************************************* * 函數(shù)名稱:void MusicPlay(uchar ucSL[],uint uST[]) * 創(chuàng)建日期:2005.7.12
* 功能描述:播放某首音樂的函數(shù)
* 入口參數(shù):ucSL[]:音節(jié)長度的數(shù)組;uST[]:音樂頻率的數(shù)組 * 返回值: 無 * 修改日志:
*************************************************/
void MusicPlay(unsigned char ucSL[],unsigned int uST[])
{
unsigned char i=0; //float fTmp=“0”;
while((ucSL[i]!=0)||(uST[i]!=0)) {
//fTmp=(float)11059/(float)12000;
T2Init(0xffff-uST[i]*((float)11059/(float)12000)*4); //11。0592M的晶體 //我添加了*5
g_ucSoundLongCNT=((3*ucSL[i]*75000L)/8)/uST[i]; //*1000我改為 75000
while(g_ucSoundLongCNT!=0); //等待計數(shù)器為0 TR2=0; //暫時關(guān)閉定時器 i++; }
BUZZER = 1; }
/************************************************* * 函數(shù)名稱:void T2Init(void) * 創(chuàng)建日期:2005.7.11
* 功能描述:用于音樂的音調(diào)半周期定時 * 入口參數(shù):無 * 返回值: 無 * 修改日志:
*************************************************/ void T2ISR(void) interrupt 5 using 1 {
TF2=0; //手動清除溢出標(biāo)志 if(g_ucSoundLongCNT!=0) {
g_ucSoundLongCNT--; }
BUZZER=~BUZZER; }
評論