王法杰
(西安航空職業技術學院 電子工程學院, 西安 710089)
隨著各類比賽和娛樂活動的層出不窮,對搶答器功能和性能要求越來越高,目前市場上的智力競賽搶答器多數是由數字電路設計組成,雖然功能強大,但是線路復雜,可靠性、穩定性不高,功能相對簡單,當搶答器路數多時,成品面積較大、運維較困難[1]。因此設計以單片機為核心的新型智能搶答器,利用STC12C5A60S2單片機及外圍接口實現搶答系統,結合單片機的定時器的功能,將軟件編程與硬件設計結合起來,使得系統能夠準確地進行計時,通過數碼管顯示選手號和時間,能夠準確、公平、公正判斷出搶答選手,該系統制作過程簡單,易于安裝和維護,具有一定的使用和推廣價值。
八路搶答器系統采用STC12C5A60S2單片機為控制芯片,與四位一體共陽數碼管SM410561D3B和10只自復位輕觸開關按鍵組成[2]。系統的總框圖如圖1所示。

圖1 八路搶答器系統框圖
按鍵模塊包括搶答復位和搶答開始按鍵,用于電路的復位和主持人提示搶答開始進行倒計時,以及八位選手進行搶答的八個按鍵,如果選手搶答成功則數碼管顯示該選手按鍵號,同時對應選手按鍵的LED小燈發光,數碼管的后兩位顯示答題時間,倒計時5S時,蜂鳴器報警提示[3]。由于數碼管的段選和位選均由單片機P0口控制,所以通過74HC573鎖存器來確定位選和段選,鎖存器的使能端由單片機P2.6和P2.7控制。
八位選手的按鍵由P3口的八位分別控制,P2.0控制搶答器復位按鍵,P2.1控制搶答開始按鍵,P1 口的八位分別控制與八位選手按鍵相對應的八只LED小燈。程序設計時,將按鍵模塊設計一個“KEY.H”頭文件供主函數調用[4]。按鍵函數對十個按鍵進行編程控制,根據硬件電路圖,先通過程序進行按鍵消抖,對選手按鍵操作時,用“if語句”判斷按鍵是否按下,延時一段時間后再確定是否按下,如果按鍵按下,數碼管則顯示相應的按鍵序號,同時與該按鍵對應小燈發光,按鍵標示為清零,例如判斷按鍵1是否按下,主要代碼“if(flag==1) { if(key1==0) { delay(10); if(key1==0) { num=1; flag=0; P1=0xfe;} }”,其中,“flag==1”表示主持人已按下“開始”按鍵標志位,當“flag==0”時,表示按下開始按鍵的前提條件下,進一步判斷是哪位選手搶答成功,并執行“ if(flag==0) {show(num,11,temp2/10,temp2%10);}”語句,將選手號“num”顯示在第一位數碼管上,第二位數碼管“g”段發光,第三位數碼管顯示答題時間的十位,第四位數碼管顯示答題時間的個位。其他七位選手按鍵操作類似,只是對應調整判斷按鍵號碼,即第一位數碼管顯示數值和小燈對應點亮即可。
由于LED數碼管顯示的位選與段選都由P0口控制,所以用74HC573進行位選或段選存儲。當74HC573鎖存器的使能端為有效電平即高電平時,則改變輸入端的電平,則相應的輸出端與輸入端電平一致,若使能端為低電平,則輸出端的電平為前一次狀態輸入電平不變,一直保持到使能端有效[5]。程序設計時,先選擇位碼,使位碼控制的鎖存器使能端高電平有效,再進行位掃描刷新,然后位碼使能端設置低電平,進行段碼顯示,給P0口送入要顯示的數據,到數碼管顯示數組里獲取相應的數值顯示到數碼管再對數碼管段顯示使能清零,數碼管顯示數組賦初值定義為“uchar code table_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x7f};”用來顯示“0-9”數字,數碼管滅,“g”段點亮和小數點點亮[6],主要代碼如下:
void display()
{ uchar sx;
for(sx=0;sx<4;sx++)//四位數碼管
{ wela=1;//位選使能
P0=0x01< wela=0;//位選關閉 P0=0xff; dula=1;//段選使能 P0=table_seg[seg[sx]];//數碼管顯示 dula=0; delay(800); }} 主持人按下開始按鍵后3秒鐘開始搶答,數碼管前兩位不顯示后兩位顯示倒計時時間,到時間沒人搶答,則進定時器T0中斷進行蜂鳴器報警,同時,四位數碼管的中間段,即“g”段發光,說明此次搶答無效。若在規定時間內有選手按下按鍵進行搶答,答題時間為90秒,5秒倒計時提示,進中斷蜂鳴器報警[7]。程序設計主要包含主函數和中斷函數,在主函數里配置定時器T0為工作模式1,打開定時器,并且開定時器T0中斷,賦定時器T0中斷初值為50ms,調用前面的按鍵與數碼管顯示頭文件函數,“ key( );”和“display( );”,用“if語句”判斷“flag”標志位,當“if(flag==1)”時,說明按下“開始”按鍵P2.1,按鍵消抖后,執行按鍵函數里的語句“ if(key10==0) { TR0=1;flag=1;flag1=1; }”,置位按鍵開始和搶答時間標志,同時,調用數碼管顯示函數,執行語句“ if(flag==1) {show(10,10,temp1/10,temp1%10); }”顯示倒計時時間, 當時間到無人按下按鍵搶答時,進中斷進行蜂鳴器報警“if(temp1==0){ temp1=0;TR0=0;flag=2;beep=0; }”;當“flag==2”時,數碼管“g”段點亮,“if(flag==2){ show(11,11,11,11);}”; 當復位標志“flag==3”時,則執行語句“ if(flag==3) {show(12,12,12,12);}”,四位數碼管顯示小數點[8]。此外,在中斷函數里要對答題5s進行報警提示,其流程圖如圖2所示。 圖2 中斷流程圖 中斷函數里的主要代碼如下: if(num!=0) //有選手按下按鍵 {temp2--; //90 s倒計時,初值為90 if(temp2<=5) //倒計時5 s {beep=~beep;//蜂鳴器報警 if(temp2==0)//答題時間到 {temp2=0; TR0=0; beep=1; delay(50000); beep=0; //蜂鳴器報警 } } } 程序編譯通過后,先下載到proteus仿真軟件電路圖里進行調試,仿真無誤后焊接硬件電路,這樣可以減少由于電路或程序的問題而導致實物調試的故障。仿真電路圖如圖3所示。 單片機的P0口的8位依次和74HC573的“D0-D7”相連,“P2.7”和“P2.6”進行數碼管位碼和段碼的控制,P3口的八位接搶答選手按鍵,P1口八位接八個LED小燈[9]。鎖存器74HC573芯片的/OE為高電平時,輸出為高阻態,芯片處于不可控制狀態,在本電路中,如圖3所示,/OE接低電平。 LE是輸出端狀態改變使能端,當LE為低電平,輸出端Q始終保持上一次存儲的信號,當LE為高電平時,Q緊隨D的狀態變化,并將D的狀態鎖存,電路中,U2和U3的LE分別接單片機“P2.7”和“P2.6”進行數碼管位碼和段碼的控制。仿真運行時可以模擬搶答過程,例如“6號選手”按下搶答器按鍵時,對應“D6”點亮,同時,數碼管顯示從90 s開始倒計時到了3 s,蜂鳴器報警[10],實物制作如圖4所示。 圖4 八路搶答器實物制作圖 以STC12C5A60S2單片機為核心設計的八路搶答器,采用LED數碼管進行顯示,自動鎖存顯示結果,主持人按下“開始”按鍵后,根據不同選手搶答信號的輸入,經過單片機的控制處理并產生與輸入信號相對應的輸出信號,通過數碼管顯示相應的選手號和答題時間,在規定時間內無選手搶答或答題時間結束前5S,蜂鳴器報警提示[11]。該系統經過實驗驗證穩定可靠具有一定的實用價值。2.3 報警模塊設計

3 軟件仿真與實物制作

4 總結