簡(jiǎn)易的單片機(jī)搶答控制器方案
利用單片機(jī)做搶答器,有很多種方案了,下面的鏈接,就是一個(gè)很簡(jiǎn)單的:
按照這個(gè)方案,做而論道設(shè)計(jì)了如下電路圖:
這是剛開(kāi)始(或者主持人按下了清零鍵)時(shí)的畫(huà)面。
主持人此時(shí)正在敘述題目,還沒(méi)有按下開(kāi)始鍵。如果這時(shí)有選手違規(guī),提前按鍵,本控制器就會(huì)鳴音報(bào)警,《違規(guī)》指示燈也會(huì)發(fā)光。
主持人按清零鍵后,再按下開(kāi)始鍵,《搶答中》指示燈就會(huì)發(fā)光,數(shù)碼顯示器顯示?30?秒倒計(jì)時(shí),在這以后,選手才可以按下?lián)尨疰I。
下面就是?5?號(hào)選手搶答成功的畫(huà)面。
本電路使用的程序如下:
;==========================================
KAI??BIT??P3.5?????????;開(kāi)始
FUW??BIT??P3.6?????????;清零(復(fù)位)
GAI??BIT??P3.7?????????;修改時(shí)間
;----------------------
SPK??BIT??P2.5?????????;揚(yáng)聲器
GRE??BIT??P2.6?????????;綠燈(用于搶答期間)
YEL??BIT??P2.7?????????;黃燈(用于違規(guī)警告)
;------------------------------------------?
????ORG???0000H
????JMP???START
????ORG???0003H
????JMP???X0_INT
????ORG???000BH
????JMP???T0_INT
START:
????MOV???TMOD,?#01H
????MOV???IE,?#82H
????MOV???SP,?#60H
????SETB??IT0??????????;下降沿觸發(fā)中斷
;----------------------;下面是清零(復(fù)位)
FUWEI:
????MOV???TH0,?#4CH????;50ms@11.0592MHz
????MOV???TL0,?#0
????MOV???R2,?#20??????;預(yù)置中斷次數(shù)
????MOV???R3,?#0???????;顯示秒數(shù)0
????MOV???R4,?#0???????;選手號(hào)碼
????MOV???20H,?#0??????;各個(gè)標(biāo)志清零
????MOV???P2,?#255?????;關(guān)閉所有顯示
????CLR???IE0
????SETB??EX0??????????;開(kāi)中斷,誰(shuí)提前搶答,將出錯(cuò)
;----------------------;下面等待按下"開(kāi)始"鍵
KAISHI:
????CALL??DISP
????JB????20H.1,?WG????;有選手提前按鍵,?違規(guī)
????JB????KAI,?KAISHI??;沒(méi)有按"開(kāi)始",就循環(huán)
;----------------------;按下了
????MOV???R3,?#30??????;秒數(shù)30
????SETB??TR0??????????;開(kāi)始倒計(jì)時(shí)
????CLR???GRE
WAIT:??????????????????;等待搶答
????CALL??DISP
????JB????20H.1,?XS????;有選手按鍵則轉(zhuǎn)
????JB????20H.2,?CHAOSHI???;超時(shí)了則轉(zhuǎn)
????JMP???WAIT?????????;繼續(xù)等待
;----------------------
XS:????????????????????;查找選手按鍵的位置
????JNB???21H.0,?J0
????JNB???21H.1,?J1
????JNB???21H.2,?J2
????JNB???21H.3,?J3
????JNB???21H.4,?J4
????JNB???21H.5,?J5
????JNB???21H.6,?J6
;????JMP??????????J7
J7:?INC???R4
J6:?INC???R4
J5:?INC???R4
J4:?INC???R4
J3:?INC???R4
J2:?INC???R4
J1:?INC???R4
J0:?INC???R4
????CLR???TR0
????SETB??GRE
????SETB??20H.3
????MOV???R5,?#0
????CALL??DISP
????DJNZ??R5,?$?-?2
;----------------------;下面等待按下復(fù)位鍵
W_FW:
????CLR???20H.3
????CALL??DISP
????JB????FUW,?W_FW????;沒(méi)有按,則轉(zhuǎn)
????JMP???FUWEI
;----------------------
CHAOSHI:???????????????;超時(shí)處理
????CLR???TR0
????SETB??20H.3????????;允許發(fā)音
????MOV???R5,?#100
????CALL??DISP?????????;邊顯示邊發(fā)音
????DJNZ??R5,?$?-?2
????JMP???W_FW?????????;去等待按下復(fù)位
;----------------------
WG:????????????????????;違規(guī)按鍵處理
????CLR???YEL
????SETB??20H.3
????MOV???R5,?#200
????CALL??DISP
????DJNZ??R5,?$?-?2
????JMP???W_FW?????????;去等待按下復(fù)位
;==========================================
;外部中斷0,?選手按鍵將觸發(fā)本中斷
;==========================================
X0_INT:????????????????;有選手按鍵了
????MOV???21H,?P1??????;立即讀入
????CLR???EX0??????????;關(guān)閉中斷,再也不響應(yīng)后來(lái)的按鍵
????SETB??20H.1????????;設(shè)置標(biāo)志
????RETI
;==========================================
;T0定時(shí)中斷,?每隔50ms中斷一次
;==========================================
T0_INT:????????????????;到了預(yù)定時(shí)間
????MOV???TH0,?#4CH;???;重裝50ms初始值
????DJNZ??R2,?T0_EXIT??;未滿20次,跳出
????MOV???R2,?#20
????DEC???R3???????????;秒數(shù)減一
????CJNE??R3,?#255,?T0_EXIT???;不到-1則轉(zhuǎn)
????INC???R3
????SETB??20H.2????????;超時(shí)標(biāo)志
T0_EXIT:
????RETI
;==========================================
;顯示子程序,?逐個(gè)顯示一遍
;==========================================
DISP:??????????????????;顯示一遍約有10ms
????PUSH??ACC
????PUSH??B
;------------------------
????MOV???A,?R4????????;取來(lái)選手號(hào)碼
????CALL??OUT_DM????;輸出段碼
????CLR???P2.3??????;顯示
????CALL??DELAY
????SETB??P2.3
;------------------------
????MOV???A,?#10
????CALL??OUT_DM????;輸出段碼
????CLR???P2.2??????;顯示'-'
????CALL??DELAY
????SETB??P2.2
;------------------------
????MOV???A,?R3????????;取來(lái)秒數(shù)
????MOV???B,?#10
????DIV???AB
????CALL??OUT_DM????;輸出段碼
????CLR???P2.1??????;顯示十位
????CALL??DELAY
????SETB??P2.1
;------------------------
????MOV???A,?B
????CALL??OUT_DM????;輸出段碼
????CLR???P2.0??????;顯示個(gè)位
????CALL??DELAY
????SETB??P2.0
;------------------------
????POP???B
????POP???ACC
????RET
;------------------------
OUT_DM:
????ADD???A,?#(D_TAB?-?$?-?3)
????MOVC??A,?@A?+?PC
????MOV???P0,?A
????RET
;------------------------
D_TAB:????
????DB???0C0H,0F9H,0A4H,0B0H,?99H?;共陽(yáng)極0-9
????DB????92H,?82H,0F8H,?80H,?90H,0BFH?;-
;------------------------------------------
DELAY:??????;延時(shí)約2500us
????JB????20H.3,?BEEP
????MOV???R6,?#5
????MOV???R7,?#50
????DJNZ??R7,?$
????DJNZ??R6,?$?-?2
????RET
;------------------------------------------
BEEP:
????MOV???R6,?#2????;
????CLR???SPK
????DJNZ??R7,?$
????SETB??SPK
????DJNZ??R7,?$
????DJNZ??R6,?BEEP?+?2
????RET
;==========================================
????END
程序有些長(zhǎng),故此,刪除了設(shè)置倒計(jì)時(shí)時(shí)間的程序段。
本程序?qū)Ω鱾€(gè)選手的按鍵處理,使用了中斷方式,這在一定的程度上,提高了對(duì)按鍵先、后的甄別能力。
當(dāng)有任意一個(gè)搶答鍵被按下,在?2us?之內(nèi),就會(huì)被單片機(jī)保存起來(lái)。
后按鍵的選手,只要晚了?2us,就不會(huì)進(jìn)入單片機(jī)。
如果有兩個(gè)或多個(gè)選手,都是在?2us?之內(nèi)按鍵,本程序?qū)⒄J(rèn)定其中編號(hào)最小的選手,是最先按下的。
呵呵,還是有些不公平啊?!
提高單片機(jī)的晶振頻率,可以提高對(duì)按鍵先后的甄別能力。
如果對(duì)甄別要求很高,就應(yīng)該使用純電子器件構(gòu)成的搶答判別電路。
這樣的電路,可以參考做而論道前面發(fā)表的博文。