要求:
1:主持人按下启动按钮才能开始抢答;
2:当没有人抢答30秒后题目作废;
3:抢答之后有10秒的考虑时间如果答不上来题目作废;
4:显示抢答人的号码;
5:显示30秒倒计时时间;
用mcs-51单片机做六人抢答器
全部回复(32)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
单片机六人抢答器
定时器0定时50ms 循环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 循环次数
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 边沿触发方式
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 循环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 循环次数
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 边沿触发方式
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循环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循环次数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边沿触发方式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循环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循环次数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边沿触发方式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
回复
提示