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