抢答器原版汇编程序Word文档下载推荐.docx
《抢答器原版汇编程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《抢答器原版汇编程序Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
CLROK
CLRRING
SETBTR1
SETB
TR0;
一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
;
=====查询程序=====
START:
MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLDISPLAY;
未开始抢答时候显示FFF
JB,NEXT;
ddddddd
ACALLDELAY
去抖动,如果"
开始键"
按下就向下执行,否者跳到非法抢答查询
ACALLBARK;
按键发声
MOVA,R1
MOVR6,A;
送R1->
R6,因为R1中保存了抢答时间
SETBOK;
抢答标志位,用于COUNT只程序中判断是否查询抢答
MOVR7,#01H;
读抢答键数据信号标志,这里表示只读一次有用信号
MOVR3,#0AH;
抢答只显示计时,灭号数
AJMPCOUNT;
进入倒计时程序,"
查询有效抢答的程序"
在COUNT里面
NEXT:
JNB,FALSE1
JNB,FALSE2
JNB,FALSE3
JNB,FALSE4
JNB,FALSE5
JNB,FALSE6
JNB,FALSE7
JNB,FALSE8
AJMPSTART
=====非法抢答处理程序=====
FALSE1:
MOVR3,#01H
AJMPERROR
FALSE2:
MOVR3,#02H
FALSE3:
MOVR3,#03H
AJMP
ERROR
FALSE4:
MOVR3,#04H
FALSE5:
MOVR3,#05H
FALSE6:
MOVR3,#06H
FALSE7:
MOVR3,#07H
FALSE8:
MOVR3,#08H
=====INT0(抢答时间R1调整程序)=====
INT0SUB:
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
先在两个时间LED上显示R1
JNB,INC0;
为+1s键,如按下跳到INCO
JNB,DEC0;
为-1s键,如按下跳到DECO
JNB,BACK0;
为确定键,如按下跳到BACKO
INC0:
MOVA,R1
CJNEA,#63H,ADD0;
如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
ADD0:
INCR1
DEC0:
JZSETR1;
如果R1为0,R1就置99,
DECR1
SETR1:
MOVR1,#63H
INT0SUB
BACK0:
RETI
=====INT1(回答时间R2调整程序)=====
INT1SUB:
MOVA,R2
ACALLDISPLAY
JNB,INC1
JNB,DEC1
JNB,BACK1
INC1:
MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ADD1:
INCR2
DEC1:
JZSETR2
DECR2
SETR2:
MOVR2,#63H
BACK1:
=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
REPEAT:
MOVA,R2;
使用锦囊时重新计时
MOVR6,A
COUNT:
MOVR0,#00H;
重置定时器中断次数
重置定时器
RECOUNT:
MOVA,R6;
R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
DIVAB;
除十分出个位/十位
MOV
30H,A;
十位存于(30H)
MOV31H,B;
个位存于(31H)
MOVR5,30H;
取十位
MOVR4,31H;
取个位
MOVA,R6
SUBBA,#07H
JNCLARGER;
大于5s跳到LARGER,小于等于5s会提醒
MOVA,R0
CJNEA,#0AH,FULL;
1s中向下运行
AJMPCHECK
FULL:
CJNEA,#14H,CHECK;
下面是1s的情况,响并显示号数并清R0,重新计
SETBRING
JZQUIT;
计时完毕
MOVR0,#00H
DECR6;
一秒标志减1
LARGER:
MOVA,R0
CJNEA,#14H,CHECK;
如果1s向下运行,否者跳到查"
停/显示"
计时一秒R6自动减1
CHECK:
JNB,QUIT;
如按下停止键退出
JNBOK,CHECKK;
只在回答倒计时才有效
AJMPNEXTT
CHECKK:
JNB,REPEAT;
判断是否使用锦囊
NEXTT:
ACALLDISPLAY
JBOK,ACCOUT;
如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPRECOUNT
ACCOUT:
MOVA,36H
JNB,TRUE1
JNB,TRUE2
JNB,TRUE3
JNB,TRUE4
JNB,TRUE5
JNB,TRUE6
JNB,TZ1
JNB,TZ2
TZ1:
JMP
TRUE7
TZ2:
JMPTRUE8
QUIT:
CLROK;
如果按下了"
停止键"
执行的程序
=====正常抢答处理程序=====
TRUE1:
ACALLBARK
抢答时间R2送R6
MOVR3,#01H
CLROK;
因为答题的计时不再查询抢答,所以就锁了抢答
AJMPCOUNT
TRUE2:
ACALLBARK
MOVR3,#02H
TRUE3:
MOVR3,#03H
TRUE4:
MOVR3,#04H
TRUE5:
MOVR3,#05H
TRUE6:
MOVR3,#06H
TRUE7:
ACALL
BARK
MOVR3,#07H
TRUE8:
MOVR3,#08H
=====犯规抢答程序=====
ERROR:
MOVR0,#00H
MOVTL1,#0B0H
MOV34H,R3;
犯规号数暂存与(34H)
HERE:
CJNEA,#06H,FLASH;
向下运行->
灭并停响
MOVR4,#0AH
MOVR5,#0AH;
三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#0CH,CHECK1;
下面是的情况,响并显示号数并清R0,重新计
MOVR3,34H;
取回号数
MOVR5,#0BH
MOVR4,#0BH;
显示FF和号数
CHECK1:
JNB,QUIT1
AJMPHERE
QUIT1:
CLRRING
=====显示程序=====
DISPLAY:
MOVDPTR,#DAT1;
查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOVA,R3
MOVCA,@A+DPTR
P2,#0feH
MOVP0,A
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVP2,#0fdH
MOVA,R4
MOVP2,#0fbH
RET
DAT1:
DB00h,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
"
灭"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
F"
DAT2:
DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
第一个为零,其他与上相同,因为十位如果为零显示熄灭
====加减时间延时(起到不会按下就加N个数)======
DELAY1:
MOV35H,#08H
LOOP0:
DJNZ35H,LOOP0
=====延时4236个机器周期(去抖动用到)=====
DELAY:
MOV32H,#12H
LOOP:
MOV33H,#0AFH
LOOP1:
DJNZ33H,LOOP1
DJNZ32H,LOOP
=====延时4236个机器周期(显示用到)=====
DELAY2:
MOV32H,#43H
LOOP3:
MOV33H,#1EH
MOVA,R7;
每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理
JNZAAAA1;
没读到有效数据时继续转到AAAA1
LOOP2:
DJNZ33H,LOOP2
DJNZ
32H,LOOP3
=====读抢答按键数据口程序=====
由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.
故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性
AAAA1:
MOVA,P1
CJNEA,#0FFH,AA1;
当不全为1时的数据为有效数据
AA0:
MOV36H,A;
将有效数据送到36H暂存
AJMPLOOP2
AA1:
DECR7
AJMPAA0
=====发声程序=====
BARK:
SETBRING
CLRRING;
=====TO溢出中断(响铃程序)=====
T0INT:
MOVTH0,#0ECH
MOVTL0,#0FFH
JNBRING,OUT;
CPL;
RING标志位为1时候口不短取反使喇叭发出一定频率的声音
OUT:
=====T1溢出中断(计时程序)=====
T1INT:
MOVTH1,#3CH
INCR0
RETI
END