抢答器使用说明.docx
《抢答器使用说明.docx》由会员分享,可在线阅读,更多相关《抢答器使用说明.docx(23页珍藏版)》请在冰豆网上搜索。
抢答器使用说明
图中
1~8号按键选手按键
9:
复位键
10:
开始/重答键
11:
停止/确定键
12:
抢答时间调节键
13:
回答时间调节键
14:
时间调节、分数调节加一键
15:
时间调节、分数调节减一键
16:
分数查看/犯规处理/回答完毕
使用说明:
1、抢答、答题
在EEE状态(初始状态)下,按下键10,则开始进入抢答中,若无人抢答,当计时结束后跳回初始状态。
若有人抢答,则进入回答等待状态,当再次按下键10则开始计时,在计时没结束之前可以按下键10重新回答。
当计时结束或按下键16表示回答完毕,进入分数修改程序。
按键14/15修改分数后,再按键11返回。
2、查看分数
当数码管显示EEE状态时,点击键16会进入分数查看程序,初始时显示选手1的等分情况,每位选手初试分数为10分,当长按下各选手的抢答开关,就会显示对应选手的得分。
开关断开,又会回到初始状态,当按下键11即可恢复到EEE状态。
3、抢答犯规程序
当数码管显示EEE时,若有选手抢答则是违规的,数码将显示抢答位数,点击键16进入分数修改程序,按键14/15实现对分数的加减,修改完毕按键11,确定并退出。
4、抢答时间/回答时间修该
按下键12/13进入分数修改程序,按键14/15实现对分数的加减,修改完毕按键11,确定并退出。
5、复位
按下键9则复位单片机,清除一切数据。
程序:
OKEQU20H;抢答开始标志位
RINGEQU22H;响铃标志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPQTIM0
ORG000BH
AJMPOVERR
ORG0013H
AJMPASKTIM0
ORG001BH
AJMPOVERT
ORG0040H
MAIN:
MOVR1,#20;初设抢答时间为20s
MOVR2,#60;初设答题时间为60s
MOV50H,#10
MOV51H,#10
MOV52H,#10
MOV53H,#10
MOV54H,#10
MOV55H,#10
MOV56H,#10
MOV57H,#10;初始化各选说分数为10分
MOVTMOD,#11H;设置定时器/不受外部中断控制/定时/模式1
MOVTH0,#0F0H
MOVTL0,#0FFH;越高发声频率越高,越尖
MOVTH1,#3CH
MOVTL1,#0B0H;50ms为一次溢出中断
SETBEA;CPU开中断
SETBET0
SETBET1
SETBEX0
SETBEX1;允许四个中断,T0/T1/INT0/INT1
CLROK
CLRRING
SETBTR1
SETBTR0;一开始就运行定时器,以开始显示EEE.如果想重新计数,重置TH1/TL1就可以了
;*****查询程序*****
START:
MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLXIANSHI;未开始抢答时候显示EEE
JNBP3.6,SCOCH
JBP3.0,NEX;如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALLBARK;按键发声
MOVA,R1
MOVR6,A;送R1->R6,因为R1中保存了抢答时间
SETBOK;抢答标志位,用于BACKT只程序中判断是否查询抢答
MOVR7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
MOVR3,#0AH;抢答只显示计时,灭号数
AJMPBACKT;进入倒计时程序,"查询有效抢答的程序"在BACKT里面
NEX:
AJMPNEXT
;*****分数查询******
STAR:
ACALLBARK
AJMPSTART
SCOCH:
ACALLBARK
AJMPSCOCHA
SCOCHA:
JNBP3.1,STAR
JNBP1.0,S1
JNBP1.1,S2
JNBP1.2,S3
JNBP1.3,S4
JNBP1.4,S5
JNBP1.5,S6
JNBP1.6,S7
JNBP1.7,S8
S1:
MOVR3,#01H
MOVA,50H
AJMPSS
S2:
MOVR3,#02H
MOVA,51H
AJMPSS
S3:
MOVR3,#03H
MOVA,52H
AJMPSS
S4:
MOVR3,#04H
MOVA,53H
AJMPSS
S5:
MOVR3,#05H
MOVA,54H
AJMPSS
S6:
MOVR3,#06H
MOVA,55H
AJMPSS
S7:
MOVR3,#07H
MOVA,56H
AJMPSS
S8:
MOVR3,#08H
MOVA,57H
AJMPSS
SS:
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
ACALLDELAY1
AJMPSCOCHA
NEXT:
MOVA,P1
MOV36H,A
JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
JNBP1.6,FALSE7
JNBP1.7,FALSE8
AJMPSTART
;*****非法抢答处理程序*****
FALSE1:
MOVR3,#01H
AJMPERROR
FALSE2:
MOVR3,#02H
AJMPERROR
FALSE3:
MOVR3,#03H
AJMPERROR
FALSE4:
MOVR3,#04H
AJMPERROR
FALSE5:
MOVR3,#05H
AJMPERROR
FALSE6:
MOVR3,#06H
AJMPERROR
FALSE7:
MOVR3,#07H
AJMPERROR
FALSE8:
MOVR3,#08H
AJMPERROR
;*****抢答时间R1调整程序*****
QTIM0:
ACALLBARK
QTIME:
MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLXIANSHI;先在两个时间LED上显示R1
JNBP3.4,INC0;P3.4为+1s键,如按下跳到INCO
JNBP3.5,DEC0;P3.5为-1s键,如按下跳到DECO
JNBP3.1,BACK0;P3.1为确定键,如按下跳到BACKO
AJMPQTIME
INC0:
ACALLBARK
MOVA,R1
CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
AJMPQTIME
ADD0:
ACALLBARK
INCR1
ACALLDELAY1
AJMPQTIME
DEC0:
ACALLBARK
MOVA,R1
JZSETR1;如果R1为0,R1就置99,
DECR1
ACALLDELAY1
AJMPQTIME
SETR1:
ACALLBARK
MOVR1,#63H
ACALLDELAY1
AJMPQTIME
BACK0:
RETI
;*****回答时间R2调整程序*****
ASKTIM0:
CLROK
CLRRING
ACALLBARK
ASKTIME:
MOVA,R2
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLXIANSHI
JNBP3.4,INC1
JNBP3.5,DEC1
JNBP3.1,BACK1
AJMPASKTIME
INC1:
ACALLBARK
MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ACALLDELAY1
AJMPASKTIME
ADD1:
INCR2
ACALLDELAY1
AJMPASKTIME
DEC1:
ACALLBARK
MOVA,R2
JZSETR2
DECR2
ACALLDELAY1
AJMPASKTIME
SETR2:
MOVR2,#63H
ACALLDELAY1
AJMPASKTIME
BACK1:
RETI
;*********分数修改********
SCORES:
MOVA,R7
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
ACALLXIANSHI
JNBP3.4,INC2
JNBP3.5,DEC2
JNBP3.1,BACK2
AJMPSCORES
INC2:
ACALLBARK
MOVA,R7
CJNEA,#63H,ADD2
MOVR7,#00H
ACALLDELAY1
AJMPSCORES
ADD2:
INCR7
ACALLDELAY1
AJMPSCORES
DEC2:
ACALLBARK
MOVA,R7
JZSETR3;若A为零转SETR2
DECR7
ACALLDELAY1
AJMPSCORES
SETR3:
MOVR7,#63H
ACALLDELAY1
AJMPSCORES
BACK2:
RET
;*****抢答倒计时和回答倒计时程序*****
REASK:
MOVA,R2;重答重新计时
MOVR6,A
CLRRING
BACKT:
MOVR0,#00H;重置定时器中断次数
MOVTH1,#3CH
MOVTL1,#0B0H;重置定时器
BACKTIM:
MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
MOVB,#0AH
DIVAB;除十分出个位/十位
MOV30H,A;十位存于(30H)
MOV31H,B;个位存于(31H)
MOVR5,30H;取十位
MOVR4,31H;取个位
MOVA,R6
SUBBA,#07H;(A)-CY-#07H-->A
JNCLARGER;大于5s跳到LARGER,小于等于5s会提醒
MOVA,R0
CJNEA,#0AH,FULL;1s中0.5s向下运行
CLRRING
AJMPCHECK
FULL:
CJNEA,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
SETBRING
MOVA,R6
JZTUICH00;计时完毕
MOVR0,#00H
DECR6;一秒标志减1
AJMPCHECK
LARGER:
MOVA,R0
CJNEA,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
DECR6;计时一秒R6自动减1
MOVR0,#00H
CHECK:
JNBOK,AGAIN;只在回答倒计时才有效
JNBP3.1,TUICHU;如按下停止键退出
AJMPNEXTT
AGAIN:
JNBP3.0,REASK;判断是否重新答题
JNBP3.6,TUICH00;是否预先结束
NEXTT:
ACALLXIANSHI
JBOK,FIND;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPBACKTIM
TUICH00:
JBOK,TUICHU;判断退出时是否在抢答中
AJMPTUICHU0
FIND:
MOVA,36H
JNBACC.0,TRUE1
JNBACC.1,TRUE2
JNBACC.2,TRUE3
JNBACC.3,TRUE4
JNBACC.4,TRUE5
JNBACC.5,TRUE6
JNBACC.6,TRUE7
JNBACC.7,TR8
AJMPBACKTIM
TR8:
AJMPTRUE8
TUICHU:
CLROK;如果按下了"停止键"执行的程序
CLRRING
ACALLBARK
SETBP2.7;指示灯熄灭
AJMPSTART
;*****正常抢答处理程序*****
TRUE1:
ACALLBARK
MOVA,R2
MOVR6,A;答题时间R2送R6
MOVR3,#01H
CLRP2.4
CLRP2.5
CLRP2.6;显示抢答结果
AJMPTRUEE
TRUE2:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#02H
SETBP2.4
CLRP2.5
CLRP2.6
AJMPTRUEE
TRUE3:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#03H
CLRP2.4
SETBP2.5
CLRP2.6
AJMPTRUEE
TRUE4:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#04H
SETBP2.4
SETBP2.5
CLRP2.6
AJMPTRUEE
TRUE5:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#05H
CLRP2.4
CLRP2.5
SETBP2.6
AJMPTRUEE
TRUE6:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#06H
SETBP2.4
CLRP2.5
SETBP2.6
AJMPTRUEE
TRUE7:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#07H
CLRP2.4
SETBP2.5
SETBP2.6
AJMPTRUEE
TRUE8:
ACALLBARK
MOVA,R2
MOVR6,A
MOVR3,#08H
SETBP2.4
SETBP2.5
SETBP2.6
AJMPTRUEE
TRUEE:
CLRP2.7;启动74138
CLROK;封锁抢答
ASK:
MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
MOVB,#0AH
DIVAB;除十分出个位/十位
MOV30H,A;十位存于(30H)
MOV31H,B;个位存于(31H)
MOVR5,30H;取十位
MOVR4,31H
ACALLXIANSHI
JBP3.0,ASK;等待开始答题指令
ACALLBARK
AJMPBACKT
;*****选择分数修改位*****
TUICHU0:
CLROK
CLRRING
MOVA,36H
JNBACC.0,SCO1
JNBACC.1,SCO2
JNBACC.2,SCO3
JNBACC.3,SCO4
JNBACC.4,SCO5
JNBACC.5,SCO6
JNBACC.6,SCO7
JNBACC.7,SC8
SC8:
AJMPSCO8
TUICHUU:
SETBP2.7;指示灯熄灭
AJMPSTART
SCO1:
ACALLBARK
MOVR7,50H
MOVR3,#01H
ACALLSCORES
MOV50H,R7
AJMPTUICHUU
SCO2:
ACALLBARK
MOVR7,51H
MOVR3,#02H
ACALLSCORES
MOV51H,R7
AJMPTUICHUU
SCO3:
ACALLBARK
MOVR7,52H
MOVR3,#03H
ACALLSCORES
MOV52H,R7
AJMPTUICHUU
SCO4:
ACALLBARK
MOVR7,53H
MOVR3,#04H
ACALLSCORES
MOV53H,R7
AJMPTUICHUU
SCO5:
ACALLBARK
MOVR7,54H
MOVR3,#05H
ACALLSCORES
MOV54H,R7
AJMPTUICHUU
SCO6:
ACALLBARK
MOVR7,55H
MOVR3,#06H
ACALLSCORES
MOV55H,R7
AJMPTUICHUU
SCO7:
ACALLBARK
MOVR7,56H
MOVR3,#07H
ACALLSCORES
MOV56H,R7
AJMPTUICHUU
SCO8:
ACALLBARK
MOVR7,57H
MOVR3,#08H
ACALLSCORES
MOV57H,R7
AJMPTUICHUU
;*****抢答犯规程序*****
ERROR:
MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯规号数暂存与(34H)
HERE:
MOVA,R0
CJNEA,#06H,FLASH;0.3s向下运行->灭并停响
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
SETBRING
MOVR0,#00H
MOVR3,34H;取回号数
MOVR5,#0BH
MOVR4,#0BH;显示EE和号数
AJMPCHECK1
CHECK1:
JNBP3.6,TUICHU1;处理犯规
JNBP3.1,STOP;退出犯规处理
ACALLXIANSHI
AJMPHERE
TUICHU1:
CLRRING
CLROK
AJMPTUICHU0
STOP:
AJMPTUICHU
;*****显示程序*****
XIANSHI:
MOVDPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOVA,R3
MOVCA,@A+DPTR
SETBP2.2
CLRP2.0
MOVP0,A
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
SETBP2.0
CLRP2.1
MOVP0,A
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
SETBP2.1
CLRP2.2
MOVP0,A
ACALLDELAY2
RET
DAT1:
DB00H,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,79H
;"灭","1","2","3","4","5","6","7","8","9","灭","E"
DAT2:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,79H
;第一个为零,其他与上相同,因为十位如果为零显示熄灭
;****加减时间延时******
DELAY1:
MOV35H,#08H
LOOP0:
ACALLXIANSHI
DJNZ35H,LOOP0
RET
;*****延时去抖动用到*****
DELAY:
MOV32H,#10H
LOOP:
MOV33H,#0AFH
LOOP1:
DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;*****延时用于显示*****
DELAY2:
MOV32H,#43H
LOOP3:
MOV33H,#1EH
MOVA,R7;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理
JNZREAD0;没读到有效数据时继续转到READ0
LOOP2:
DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
;*****读抢答按键数据口程序*****
;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
;然而在检测按键口时动态扫描要调用三次延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.
;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性
READ0:
MOVA,P1
CJNEA,#0FFH,AA1;当不全为1时的数据为有效数据
AA0: