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