要求:
1:主持人按下啟動按鈕才能開始搶答;
2:當沒有人搶答30秒后題目作廢;
3:搶答之后有10秒的考慮時間如果答不上來題目作廢;
4:顯示搶答人的號碼;
5:顯示30秒倒計時時間;
用mcs-51單片機做六人搶答器
全部回復(32)
正序查看
倒序查看
@xing1234
如果我用89C51做的話:硬件1、晶振選高,用24M2、用P0.0做啟動開關.3、用P1做搶答開關.4、P2、P3做LED顯示(靜態(tài)).程序1、啟動顯示復位;2、一直查詢P0.0到按下啟動開關;3、P0.0為非后打開定時器計數,1秒更新一次顯示,其余時間查詢并記錄比較P1;4、新讀出的P1與上次讀的數按位比較;
這辦法太差,優(yōu)先級太難保證,有可能搞的順序錯亂,2個人同時按的話有時就區(qū)分不出來的,用51實現這個功能太簡單了,如果軟硬件搭配的好的,也不存在什么優(yōu)先級的問題,時鐘越快,區(qū)分度越高,
0
回復
單片機六人搶答器
定時器0定時50ms 循環(huán)20次完成定時一秒 ;
用串行口做顯示輸出
外部搶答按鈕用防抖開關用中斷做的鍵盤掃描.
P1.0 做燈光報警
P1.1做聲音報警
ORG 0000H
AJMP MAIN
ORG 0003H 定義外部0中斷
AJMP INT0SEV
ORG 000BH 定義定時器0中斷
AJMP T0SEV
ORG 0030H
MAIN:
MOV SP , #60H
MOV TMOD ,#01H 定義定時器T0的工作模式
MOV TH0 ,, #3CH 給定時器賦初值
MOV TL0 ,#0B0H
MOV R2 , # 20 循環(huán)次數
MOV R3 , #0 個位顯示
MOV R4 , #3 十位顯示
SETB EA 開總中斷
SETB ET0 開定時器中斷
SETB P0.0 給p0.0賦初值
LCALL XIANSHI 調用顯示子程序
CLR P1.0
JB P0.0 , $
LCAII K3
SETB P1.0 開始按鈕
SETB IT0 邊沿觸發(fā)方式
SETB TR0 開啟定時器
SETB EX0 開啟外部中斷
JB P0.1 , $
AJMP MAIN
定時中斷
T0SEV :
MOV th0 , #3CH
MOV TL0 , #0B0H
DJNZ R2 , LOOP
MOV R2 , #20
CJNE R3 , #0 , K1
CJNE R4 , #0 , K2
CLR TR0
CLR EA
CLR ET0
CLR EX0
AJMP LOOP
K2:
MOV R3 , #9
DEC R4
AJMP LOOP
K1:
DEC R3
LOOP:
LCALL XIANSHI
RETI
外部中斷服務
INT0SEV:
CLR EA
CLR TR0
JNB P0.2 , KEY1
JNB P0.3 , KEY2
JNB P0.4 , KEY3
JNB P0.5 , KEY4
JNB P0.6 , KEY5
JNB P0.7 , KEY6
KEY1:
MOV R3 , #1
MOV R4 , #0
LCALL XIANSHI
RETI
KEY2:
MOV R3 , #2
MOV R4 , #0
LCALL XIANSHI
RETI
KEY3:
MOV R3 , #3
MOV R4 , #0
LCALL XIANSHI
RETI
KEY4:
MOV R3 , #4
MOV R4 , #0
LCALL XIANSHI
RETI
KEY5:
MOV R3 , #5
MOV R4 , #0
LCALL XIANSHI
RETI
KEY6:
MOV R3 , #6
MOV R4 , #0
LCALL XIANSHI
RETI
顯示子程序:
XIANSHI :
MOV SCON , #00H
MOV DPTR ,#TAB
MOV A , R3
MOVC A , @A+DPTR
MOV SBUF ,A
JNB TI , $
CLR TI
MOV A , R4
MOVC A , @A+DPTR
MOV SBUF ,A
JNB TI , $
CLR TI
RET
聲音報警
K3:
MOV R5 ,#50
K4:
MOV R6 ,#FFH
K5:
DJNZ R6 , K5
CPL P1.1
DJNZ R5 , K4
RET
END
定時器0定時50ms 循環(huán)20次完成定時一秒 ;
用串行口做顯示輸出
外部搶答按鈕用防抖開關用中斷做的鍵盤掃描.
P1.0 做燈光報警
P1.1做聲音報警
ORG 0000H
AJMP MAIN
ORG 0003H 定義外部0中斷
AJMP INT0SEV
ORG 000BH 定義定時器0中斷
AJMP T0SEV
ORG 0030H
MAIN:
MOV SP , #60H
MOV TMOD ,#01H 定義定時器T0的工作模式
MOV TH0 ,, #3CH 給定時器賦初值
MOV TL0 ,#0B0H
MOV R2 , # 20 循環(huán)次數
MOV R3 , #0 個位顯示
MOV R4 , #3 十位顯示
SETB EA 開總中斷
SETB ET0 開定時器中斷
SETB P0.0 給p0.0賦初值
LCALL XIANSHI 調用顯示子程序
CLR P1.0
JB P0.0 , $
LCAII K3
SETB P1.0 開始按鈕
SETB IT0 邊沿觸發(fā)方式
SETB TR0 開啟定時器
SETB EX0 開啟外部中斷
JB P0.1 , $
AJMP MAIN
定時中斷
T0SEV :
MOV th0 , #3CH
MOV TL0 , #0B0H
DJNZ R2 , LOOP
MOV R2 , #20
CJNE R3 , #0 , K1
CJNE R4 , #0 , K2
CLR TR0
CLR EA
CLR ET0
CLR EX0
AJMP LOOP
K2:
MOV R3 , #9
DEC R4
AJMP LOOP
K1:
DEC R3
LOOP:
LCALL XIANSHI
RETI
外部中斷服務
INT0SEV:
CLR EA
CLR TR0
JNB P0.2 , KEY1
JNB P0.3 , KEY2
JNB P0.4 , KEY3
JNB P0.5 , KEY4
JNB P0.6 , KEY5
JNB P0.7 , KEY6
KEY1:
MOV R3 , #1
MOV R4 , #0
LCALL XIANSHI
RETI
KEY2:
MOV R3 , #2
MOV R4 , #0
LCALL XIANSHI
RETI
KEY3:
MOV R3 , #3
MOV R4 , #0
LCALL XIANSHI
RETI
KEY4:
MOV R3 , #4
MOV R4 , #0
LCALL XIANSHI
RETI
KEY5:
MOV R3 , #5
MOV R4 , #0
LCALL XIANSHI
RETI
KEY6:
MOV R3 , #6
MOV R4 , #0
LCALL XIANSHI
RETI
顯示子程序:
XIANSHI :
MOV SCON , #00H
MOV DPTR ,#TAB
MOV A , R3
MOVC A , @A+DPTR
MOV SBUF ,A
JNB TI , $
CLR TI
MOV A , R4
MOVC A , @A+DPTR
MOV SBUF ,A
JNB TI , $
CLR TI
RET
聲音報警
K3:
MOV R5 ,#50
K4:
MOV R6 ,#FFH
K5:
DJNZ R6 , K5
CPL P1.1
DJNZ R5 , K4
RET
END
0
回復
@qb_0007
單片機六人搶答器定時器0定時50ms循環(huán)20次完成定時一秒;用串行口做顯示輸出外部搶答按鈕用防抖開關用中斷做的鍵盤掃描.P1.0做燈光報警P1.1做聲音報警ORG 0000HAJMP MAINORG 0003H 定義外部0中斷AJMP INT0SEVORG 000BH 定義定時器0中斷AJMP T0SEV ORG 0030HMAIN:MOV SP, #60HMOV TMOD,#01H定義定時器T0的工作模式MOV TH0,,#3CH 給定時器賦初值MOV TL0 ,#0B0HMOV R2 , #20循環(huán)次數MOV R3 , #0個位顯示MOV R4 , #3十位顯示SETB EA開總中斷SETB ET0開定時器中斷SETB P0.0給p0.0賦初值LCALL XIANSHI調用顯示子程序CLR P1.0JB P0.0 , $LCAII K3SETB P1.0開始按鈕SETB IT0邊沿觸發(fā)方式SETB TR0開啟定時器SETB EX0開啟外部中斷JB P0.1 , $AJMP MAIN定時中斷T0SEV:MOV th0 , #3CHMOV TL0 , #0B0HDJNZ R2 , LOOPMOV R2 , #20CJNE R3 , #0 , K1CJNE R4 , #0 , K2CLR TR0CLR EACLR ET0CLR EX0AJMP LOOPK2:MOV R3 , #9DEC R4AJMP LOOPK1:DEC R3LOOP:LCALL XIANSHIRETI外部中斷服務INT0SEV:CLR EACLR TR0JNB P0.2, KEY1JNB P0.3, KEY2JNB P0.4, KEY3JNB P0.5, KEY4JNB P0.6, KEY5JNB P0.7, KEY6KEY1:MOV R3 , #1MOV R4 , #0LCALL XIANSHIRETIKEY2:MOV R3 , #2MOV R4 , #0LCALL XIANSHIRETIKEY3:MOV R3 , #3MOV R4 , #0LCALL XIANSHIRETIKEY4:MOV R3 , #4MOV R4 , #0LCALL XIANSHIRETIKEY5:MOV R3 , #5MOV R4 , #0LCALL XIANSHIRETIKEY6:MOV R3 , #6MOV R4 , #0LCALL XIANSHIRETI顯示子程序:XIANSHI:MOV SCON , #00HMOV DPTR ,#TABMOV A ,R3MOVC A , @A+DPTRMOV SBUF ,AJNB TI , $CLR TIMOV A ,R4MOVC A , @A+DPTRMOV SBUF ,AJNB TI , $CLR TIRET聲音報警K3:MOV R5 ,#50K4:MOV R6 ,#FFHK5:DJNZ R6 , K5CPL P1.1DJNZ R5 , K4RETEND
望各位高手給予指導謝謝!!!
0
回復
@qb_0007
單片機六人搶答器定時器0定時50ms循環(huán)20次完成定時一秒;用串行口做顯示輸出外部搶答按鈕用防抖開關用中斷做的鍵盤掃描.P1.0做燈光報警P1.1做聲音報警ORG 0000HAJMP MAINORG 0003H 定義外部0中斷AJMP INT0SEVORG 000BH 定義定時器0中斷AJMP T0SEV ORG 0030HMAIN:MOV SP, #60HMOV TMOD,#01H定義定時器T0的工作模式MOV TH0,,#3CH 給定時器賦初值MOV TL0 ,#0B0HMOV R2 , #20循環(huán)次數MOV R3 , #0個位顯示MOV R4 , #3十位顯示SETB EA開總中斷SETB ET0開定時器中斷SETB P0.0給p0.0賦初值LCALL XIANSHI調用顯示子程序CLR P1.0JB P0.0 , $LCAII K3SETB P1.0開始按鈕SETB IT0邊沿觸發(fā)方式SETB TR0開啟定時器SETB EX0開啟外部中斷JB P0.1 , $AJMP MAIN定時中斷T0SEV:MOV th0 , #3CHMOV TL0 , #0B0HDJNZ R2 , LOOPMOV R2 , #20CJNE R3 , #0 , K1CJNE R4 , #0 , K2CLR TR0CLR EACLR ET0CLR EX0AJMP LOOPK2:MOV R3 , #9DEC R4AJMP LOOPK1:DEC R3LOOP:LCALL XIANSHIRETI外部中斷服務INT0SEV:CLR EACLR TR0JNB P0.2, KEY1JNB P0.3, KEY2JNB P0.4, KEY3JNB P0.5, KEY4JNB P0.6, KEY5JNB P0.7, KEY6KEY1:MOV R3 , #1MOV R4 , #0LCALL XIANSHIRETIKEY2:MOV R3 , #2MOV R4 , #0LCALL XIANSHIRETIKEY3:MOV R3 , #3MOV R4 , #0LCALL XIANSHIRETIKEY4:MOV R3 , #4MOV R4 , #0LCALL XIANSHIRETIKEY5:MOV R3 , #5MOV R4 , #0LCALL XIANSHIRETIKEY6:MOV R3 , #6MOV R4 , #0LCALL XIANSHIRETI顯示子程序:XIANSHI:MOV SCON , #00HMOV DPTR ,#TABMOV A ,R3MOVC A , @A+DPTRMOV SBUF ,AJNB TI , $CLR TIMOV A ,R4MOVC A , @A+DPTRMOV SBUF ,AJNB TI , $CLR TIRET聲音報警K3:MOV R5 ,#50K4:MOV R6 ,#FFHK5:DJNZ R6 , K5CPL P1.1DJNZ R5 , K4RETEND
大致瀏覽了你的程序,沒細看,有幾點建議:
1:顯示最好用中斷做(前提是你在練習,不是做產品),這對你以後的顯示程序有很大的幫助,可以做成模塊!不管做什麼,特別是匯編,如果不做模塊,你的每個案子都會是新的,這樣會很累的!
2:不管你在做什麼,標識千萬不要用K1,X1(變量或者子程序名)之類的,最好用相應的英文或者中文拼音(不能怕這樣麻煩),這樣有助與你的寫作程序,不然程序大了會很麻煩!你會不知道哪個是哪個的!
3:不能用P1.X的方式吧,應該重新定義或者改為P1^X的方式
至於其它的沒細看,不好評論!
1:顯示最好用中斷做(前提是你在練習,不是做產品),這對你以後的顯示程序有很大的幫助,可以做成模塊!不管做什麼,特別是匯編,如果不做模塊,你的每個案子都會是新的,這樣會很累的!
2:不管你在做什麼,標識千萬不要用K1,X1(變量或者子程序名)之類的,最好用相應的英文或者中文拼音(不能怕這樣麻煩),這樣有助與你的寫作程序,不然程序大了會很麻煩!你會不知道哪個是哪個的!
3:不能用P1.X的方式吧,應該重新定義或者改為P1^X的方式
至於其它的沒細看,不好評論!
0
回復