抢答器原版汇编程序.docx

上传人:b****8 文档编号:9013487 上传时间:2023-02-02 格式:DOCX 页数:15 大小:156.08KB
下载 相关 举报
抢答器原版汇编程序.docx_第1页
第1页 / 共15页
抢答器原版汇编程序.docx_第2页
第2页 / 共15页
抢答器原版汇编程序.docx_第3页
第3页 / 共15页
抢答器原版汇编程序.docx_第4页
第4页 / 共15页
抢答器原版汇编程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

抢答器原版汇编程序.docx

《抢答器原版汇编程序.docx》由会员分享,可在线阅读,更多相关《抢答器原版汇编程序.docx(15页珍藏版)》请在冰豆网上搜索。

抢答器原版汇编程序.docx

抢答器原版汇编程序

 

抢答器原版汇编程序(总15页)

OKEQU20H;抢答开始标志位

RINGEQU22H;响铃标志位

ORG0000H

AJMPMAIN

ORG0003H

AJMPINT0SUB

ORG000BH

AJMPT0INT

ORG0013H

AJMPINT1SUB

ORG001BH

AJMPT1INT

ORG0040H

MAIN:

MOVR1,#30;初设抢答时间为30s

MOVR2,#60;初设答题时间为60s

MOVTMOD,#11H;设置未定时器/模式1

MOVTH0,#0F0H

MOVTL0,#0FFH;越高发声频率越高,越尖

MOVTH1,#3CH

MOVTL1,#0B0H;50ms为一次溢出中断

SETBEA

SETBET0

SETBET1

SETBEX0

SETBEX1;允许四个中断,T0/T1/INT0/INT1

CLROK

CLRRING

SETBTR1

SETB

TR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了

;=====查询程序=====

START:

MOVR5,#0BH

MOVR4,#0BH

MOVR3,#0BH

ACALLDISPLAY;未开始抢答时候显示FFF

JB,NEXT;ddddddd

ACALLDELAY

JB,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询

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

AJMPERROR

FALSE3:

MOVR3,#03H

AJMP

ERROR

FALSE4:

MOVR3,#04H

AJMPERROR

FALSE5:

MOVR3,#05H

AJMPERROR

FALSE6:

MOVR3,#06H

AJMPERROR

FALSE7:

MOVR3,#07H

AJMPERROR

FALSE8:

MOVR3,#08H

AJMPERROR

;=====INT0(抢答时间R1调整程序)=====

INT0SUB:

MOVA,R1

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY;先在两个时间LED上显示R1

JNB,INC0;为+1s键,如按下跳到INCO

JNB,DEC0;为-1s键,如按下跳到DECO

JNB,BACK0;为确定键,如按下跳到BACKO

AJMPINT0SUB

INC0:

MOVA,R1

CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。

MOVR1,#00H

ACALLDELAY1

AJMPINT0SUB

ADD0:

INCR1

ACALLDELAY1

AJMPINT0SUB

DEC0:

MOVA,R1

JZSETR1;如果R1为0,R1就置99,

DECR1

ACALLDELAY1

AJMPINT0SUB

SETR1:

MOVR1,#63H

ACALLDELAY1

AJMP

INT0SUB

BACK0:

RETI

;=====INT1(回答时间R2调整程序)=====

INT1SUB:

MOVA,R2

MOVB,#0AH

DIVAB

MOVR5,A

MOVR4,B

MOVR3,#0AH

ACALLDISPLAY

JNB,INC1

JNB,DEC1

JNB,BACK1

AJMPINT1SUB

INC1:

MOVA,R2

CJNEA,#63H,ADD1

MOVR2,#00H

ACALLDELAY1

AJMPINT1SUB

ADD1:

INCR2

ACALLDELAY1

AJMPINT1SUB

DEC1:

MOVA,R2

JZSETR2

DECR2

ACALLDELAY1

AJMPINT1SUB

SETR2:

MOVR2,#63H

ACALLDELAY1

AJMPINT1SUB

BACK1:

RETI

;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====

REPEAT:

MOVA,R2;使用锦囊时重新计时

MOVR6,A

CLRRING

COUNT:

MOVR0,#00H;重置定时器中断次数

MOVTH1,#3CH

MOVTL1,#0B0H;重置定时器

RECOUNT:

MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6

MOVB,#0AH

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中向下运行

CLRRING

AJMPCHECK

FULL:

CJNEA,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计

SETBRING

MOVA,R6

JZQUIT;计时完毕

MOVR0,#00H

DECR6;一秒标志减1

AJMPCHECK

LARGER:

MOVA,R0

CJNEA,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"

DECR6;计时一秒R6自动减1

MOVR0,#00H

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

AJMPRECOUNT

TZ1:

JMP

TRUE7

TZ2:

JMPTRUE8

QUIT:

CLROK;如果按下了"停止键"执行的程序

CLRRING

AJMPSTART

;=====正常抢答处理程序=====

TRUE1:

ACALLBARK

MOVA,R2

MOVR6,A;抢答时间R2送R6

MOVR3,#01H

CLROK;因为答题的计时不再查询抢答,所以就锁了抢答

AJMPCOUNT

TRUE2:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#02H

CLROK

AJMPCOUNT

TRUE3:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#03H

CLROK

AJMPCOUNT

TRUE4:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#04H

CLROK

AJMPCOUNT

TRUE5:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#05H

CLROK

AJMPCOUNT

TRUE6:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#06H

CLROK

AJMPCOUNT

TRUE7:

ACALL

BARK

MOVA,R2

MOVR6,A

MOVR3,#07H

CLROK

AJMPCOUNT

TRUE8:

ACALLBARK

MOVA,R2

MOVR6,A

MOVR3,#08H

CLROK

AJMPCOUNT

;=====犯规抢答程序=====

ERROR:

MOVR0,#00H

MOVTH1,#3CH

MOVTL1,#0B0H

MOV34H,R3;犯规号数暂存与(34H)

HERE:

MOVA,R0

CJNEA,#06H,FLASH;向下运行->灭并停响

CLRRING

MOVR3,#0AH

MOVR4,#0AH

MOVR5,#0AH;三灯全灭

AJMPCHECK1

FLASH:

CJNEA,#0CH,CHECK1;下面是的情况,响并显示号数并清R0,重新计

SETBRING

MOVR0,#00H

MOVR3,34H;取回号数

MOVR5,#0BH

MOVR4,#0BH;显示FF和号数

AJMPCHECK1

CHECK1:

JNB,QUIT1

ACALLDISPLAY

AJMPHERE

QUIT1:

CLRRING

CLROK

AJMPSTART

;=====显示程序=====

DISPLAY:

MOVDPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,

MOVA,R3

MOVCA,@A+DPTR

MOV

P2,#0feH

MOVP0,A

ACALLDELAY2

MOVDPTR,#DAT2

MOVA,R5

MOVCA,@A+DPTR

MOVP2,#0fdH

MOVP0,A

ACALLDELAY2

MOVA,R4

MOVCA,@A+DPTR

MOVP2,#0fbH

MOVP0,A

ACALLDELAY2

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:

ACALLDISPLAY

DJNZ35H,LOOP0

RET

;=====延时4236个机器周期(去抖动用到)=====

DELAY:

MOV32H,#12H

LOOP:

MOV33H,#0AFH

LOOP1:

DJNZ33H,LOOP1

DJNZ32H,LOOP

RET

;=====延时4236个机器周期(显示用到)=====

DELAY2:

MOV32H,#43H

LOOP3:

MOV33H,#1EH

MOVA,R7;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理

JNZAAAA1;没读到有效数据时继续转到AAAA1

LOOP2:

DJNZ33H,LOOP2

DJNZ

32H,LOOP3

RET

;=====读抢答按键数据口程序=====

;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口

;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.

;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性

AAAA1:

MOVA,P1

CJNEA,#0FFH,AA1;当不全为1时的数据为有效数据

AA0:

MOV36H,A;将有效数据送到36H暂存

AJMPLOOP2

AA1:

DECR7

AJMPAA0

;=====发声程序=====

BARK:

SETBRING

ACALLDELAY1

ACALLDELAY1

CLRRING;按键发声

RET

;=====TO溢出中断(响铃程序)=====

T0INT:

MOVTH0,#0ECH

MOVTL0,#0FFH

JNBRING,OUT;

CPL;RING标志位为1时候口不短取反使喇叭发出一定频率的声音

OUT:

RETI

;=====T1溢出中断(计时程序)=====

T1INT:

MOVTH1,#3CH

MOVTL1,#0B0H

INCR0

RETI

END

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1