基于51单片机的8路抢答器proteus仿真 汇编语言程序设计

硬件设计

上一篇讲了基于C语言的抢答器,下边讲一下基于汇编语言的抢答器。

仿真图:
在这里插入图片描述

程序设计

OK EQU 20H                       ;抢答开始标志位
        RING EQU 22H                     ;响铃标志位 
	DATA0 EQU 36H                    ;抢答按键口数据存放地址 
	ORG 0000H
        AJMP MAIN
        ORG 0003H  
        AJMP INTT0
        ORG 000BH
        AJMP T0INT
        ORG 001BH
        AJMP T1INT
        ORG 0040H
MAIN:   MOV R1,#14H                       ;初设抢答时间为20s
        MOV R2,#1EH                     ;初设答题时间为30s
        MOV 38H,#3CH                      ;启用锦囊时间从60s倒计时
        MOV TMOD,#11H                    ;设置未定时器/模式1
        MOV TH0,#0F0H
        MOV TL0,#0FFH                    ;越高发声频率越高,越尖
        MOV TH1,#3CH
        MOV TL1,#0B0H                    ;50ms为一次溢出中断
        SETB EA
        SETB ET0
        SETB ET1                         ;允许二个中断,T0/T1
        CLR OK
        CLR RING
         SETB TR1
         SETB TR0                        ;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
START:   MOV DATA0,#0FFH                 ;初始化 
         MOV R5,#0BH
         MOV R4,#0BH
         MOV R3,#0BH
         ACALL DISPLAY                   ;未开始抢答时候显示FFF 
	 JNB P3.3,SELSUB0
	 JNB P3.4,TZ3                    ;倒计时调整 
	 JB P3.0,NEXT
         ACALL DELAY
         JB P3.0,NEXT                    ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
         SETB EX0                        ;开放INT0 
	 ACALL BARK                      ;按键发声
         MOV A,R1
         MOV R6,A                    ;送R1->R6,因为R1中保存了抢答时间
         SETB OK                         ;抢答标志位,在使用锦囊时用作判断是抢答倒计时还是回答倒计时
         MOV R3,#0AH                     ;抢答只显示计时,灭号数
         AJMP COUNT                      ;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:    JNB P1.0,FALSE1
         JNB P1.1,FALSE2
         JNB P1.2,FALSE3
         JNB P1.3,FALSE4
         JNB P1.4,FALSE5
         JNB P1.5,FALSE6
         JNB P1.6,TZ1
         JNB P1.7,TZ2
         AJMP START 
TZ1:     AJMP FALSE7
TZ2:     AJMP FALSE8
TZ3:     AJMP SELSUB1
FALSE1: MOV R3,#01H
        AJMP ERROR
FALSE2: MOV R3,#02H		
        AJMP ERROR
FALSE3: MOV R3,#03H
        AJMP ERROR
FALSE4: MOV R3,#04H
        AJMP ERROR
FALSE5: MOV R3,#05H
        AJMP ERROR
FALSE6: MOV R3,#06H
        AJMP ERROR
FALSE7: MOV R3,#07H
        AJMP ERROR
FALSE8: MOV R3,#08H
        AJMP ERROR
SELSUB0: MOV A,R1
         MOV B,#0AH
         DIV AB
         MOV R5,A
         MOV R4,B
         MOV R3,#0AH
         ACALL DISPLAY                   ;先在两个时间LED上显示R1
         JNB P3.5,INC0                   ;P3.5为+1s键,如按下跳到INCO
         JNB P3.6,DEC0                   ;P3.6为-1s键,如按下跳到DECO
         JNB P3.1,BACK0                  ;P3.1为确定键,如按下跳到BACKO
         AJMP SELSUB0
INC0:   MOV A,R1
        CJNE A,#63H,ADD0                 ;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
        MOV R1,#00H
        ACALL DELAY1
        AJMP SELSUB0

链接:https://pan.baidu.com/s/1lK0JrtbPiB_jdukIuVxI_g

提取码:uv90