很多單位在開展文娛活動時有搶答一項,需要用到搶答器,普通搶答器使用通用集成電路制成,價格高、顯示方式簡單,性價比較差。而一般單位都有計算機,如果利用計算機就可以很方便地構成一臺功能強大而價格十分低廉的搶答器。下面介紹的是筆者實際制作使用的電路。
一、打印口工作原理簡介
參照圖1,PC機上的打印接口共有25根連線,其中18-25都是地線,因此實際
共有17根線,分成三類,8根數據線,可進行數據輸出,5根狀態線,輸入,4根控制線,輸出。這三組線分別由打印口的三個寄存器控制,即378H(數據口),379H(狀態口),37AH(控制口),只要對這三個地址的寄存器讀或寫,就可以輸入或輸出數據。而對這三個地址的讀寫可以用C語言中的函數outportb(int port,int data)和 inportb(int port)來進行,十分方便。
二、硬件電路圖
使用一片廉價的八緩沖器74LS244。
74LS244介紹:參考圖2,74LS244是三態輸出的八緩沖器,由2組、每組四路輸入、輸出構成。每組有一個控制端,由控制端的高或低電平決定該組數據被接通還是斷開,功能表如下表所示。
電路介紹(參考圖3):將74LS244的控制端和分別接到打印機控制端口的兩個輸出端,接到一個端口也可以,但要增加一個反相器,因控制端口有多余線可用,就分別接兩根線,可以省些硬件。利用這兩個端口分別接通兩組中的一組,將兩組的輸出端對應并聯起來,接入打印機的狀態端口,這樣就可以輸入8路數據了。如再接入一片74LS244,可以把輸入擴展到16路。打印口控制端的另一根線接入一個交流晶閘管型光耦(型號為MC3020),光耦的另一端接一個雙向晶閘管和一個電燈,按圖示,當該口為低電平時,指示燈亮表示可以開始搶答。
三、程序的編制
這個制作的核心程序編寫是非常簡單的,只要使打印口的控制端口的低兩位分時為低電平,然后分別讀入狀態端口的數據,就可以判斷是否有人搶答了。這部份的程序如下:
#define CTRL_H 0x03 /*第一組切入,此時第16腳為0,17腳為1*/
#define CTRL_L 0x0f /*第二組切入,此時第17腳為0,16腳為1*/
for(;;)
{ outportb(port_ctrl,CTRL_H); /*port_ctrl為控制端口地址,見下說明*/
inp_data_h=inportb(port_inp); /*讀輸入口數據*/
outportb(port_ctrl,CTRL_L); /*切入第二組*/
inp_data_l=inportb(port_inp); /*讀輸入口數據*/
inp_data=((inp_data_h&&0xf0)||(inp_data_l》》4); /*兩次讀到的數據合并*/
if(inp_data!=0x77) /*高4位輸入端無任何腳接地時,應讀到7,請參考圖1及電路圖3*/
break; /*每組僅用高4位,兩組合并后0x77為兩次均無任何腳接地*/
delay(10); /*延時10毫秒,實際可在此作一些界面變化的處理,增加美觀*/
}
在實際制作中為充分利用PC機的資源,充分美化搶答器,采用了全圖形化的編程,并加入了聲音功能。即將搶答的組數在顯示器上用大字顯示出,并同時利用PC機上的聲卡報出相應組數。具體程序由各人及計算機檔次而定,筆者編的程序可在386機上流暢地運行。
四、注意事項
如果讀者實際制作這個電路,還要注意以下幾個問題:
1.打印口地址的確定,并非每一臺計算機的打印口地址都是以上所列的地址,最常見的還有278H,279H,27AH。因此針對不同的計算機自動尋找打印口很重要,在計算機的內存中存放有打印口地址,自動查找打印口可用如下程序:
unsigned int far *fpb=(unsigned far * )0x00400008; /*在內存40:08H處單元中有打印地址*/
port_data=*fpb; /*取打印機數據口的地址*/
port_inp=*fpb+1; /*狀態端口為數據口地址加1*/
port_ctrl=*fpb+2; /*控制端口為數據端口加2*/
2. 以上設計是基于標準的打印口設置,如果主板的打印口設計不標準,則以上編程會有問題。以筆者的調查,所找到的所有386、586兼容機(約10個不同品種的主板)及以上機均能正常工作,但486機主板較混亂,筆者找了5、6種486兼容機,沒一臺能用。但所有的品牌機都沒有發現有這方面的問題,為謹慎起見,自制前最好對自已所用計算機的打印口檢測一下,即將狀態線分別接地,然后讀出狀態口數據,看是否與接線相符。在計算機用語音報出‘開始’后要先檢測一次輸入,如果已有人按下按鈕,則屬范規,如無人按下,再點亮指示燈,表示搶答可以開始。DOS下的聲卡發聲程序編起來比較麻煩,而且一定要計算機有聲卡才行,如果打算讓舊計算機發揮余熱,而又想有聲音功能,那不妨多花上十多元錢按圖4做一個發聲電路。這是一個D/A轉換器,只要讀出WAV文件的數據并逐一送往數據端口,就可以發聲了,這部份程序如下:
void wave(char *file) /*發聲函數,參數為文件名*/
{ char ch=‘