基于51单片机的八路抢答器汇编语言Proteus仿真原理图程序

功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.'开始’按键按下后,进入抢答倒计时,倒计时结束前,按下抢答键,完成抢答,并进入作答时间,作答时间结束返回初始状态,若无人抢答,返回初始状态
2.作答时间内,按下‘开始’,增加作答时间,按下‘停止’,提前结束
3.'抢答设置’按键按下后,可进入抢答时间调整
4.'回答设置’按键按下后,可进入作答时间调整
5.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

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 P3.7
         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
ADD0:   INC R1
        ACALL DELAY1
        AJMP SELSUB0
DEC0:   MOV A,R1
        JZ SETR1                         ;如果R1为0, R1就置99, 
        DEC R1
        ACALL DELAY1 
        AJMP SELSUB0
SETR1:  MOV R1,#63H
        ACALL DELAY1
        AJMP SELSUB0
BACK0:  AJMP START
SELSUB1: MOV A,R2
        MOV B,#0AH
        DIV AB
       MOV R5,A
       MOV R4,B
       MOV R3,#0AH
       ACALL DISPLAY
    JNB P3.5,INC1
    JNB P3.6,DEC1
    JNB P3.1,BACK1
    AJMP SELSUB1
INC1:   MOV A,R2
        CJNE A,#63H,ADD1
        MOV R2,#00H
        ACALL DELAY1
AJMP SELSUB1
ADD1:   INC R2
         ACALL DELAY1
         AJMP SELSUB1
DEC1:   MOV A,R2
     JZ SETR2
     DEC R2
    ACALL DELAY1
    AJMP SELSUB1
SETR2:  MOV R2,#63H
        ACALL DELAY1
        AJMP SELSUB1
BACK1: AJMP START
REPEAT:MOV A,38h                        ;使用锦囊时重新计时
       MOV R6,A
       CLR RING         ;当倒计时进入最后5秒的时候,启用锦囊能消除蜂鸣
	   SETB P3.7
COUNT:MOV R0,#00H                    ;重置定时器中断次数
        MOV TH1,#3CH
        MOV TL1,#0B0H                  ;重置定时器
RECOUNT:MOV A,R6                       ;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
        MOV B,#0AH
    DIV AB                             ;除十分出个位/十位
    MOV 30H,A                          ;十位存于(30H) 
    MOV 31H,B                          ;个位存于(31H) 
    MOV R5,30H                         ;取十位
    MOV R4,31H                         ;取个位
    MOV A,R6
    SUBB A,#07H
    JNC LARGER                   ;大于5s跳到LARGER,小于等于5s会提醒
    MOV A,R0
        CJNE A,#0AH,FULL               ;1s中0.5s向下运行
    CLR RING 
	SETB P3.7
    AJMP CHECK
FULL: CJNE A,#14H,CHECK              ;下面是1s的情况,响并显示号数并清R0,重新计
      SETB RING
      MOV A,R6
	  SETB P3.7
    JZ QUIT                            ;计时完毕
    MOV R0,#00H
    DEC R6                            ;一秒标志减1
      AJMP CHECK
LARGER: MOV A,R0
        CJNE A,#14H,CHECK          ;如果1s向下运行,否者跳到"停/显示"
        DEC R6                           ;计时一秒R6自动减1
        MOV R0,#00H
CHECK: JNB P3.1,QUIT         ;如按下停止键退出
        JNB OK,CHECKK      ;只在回答倒计时才有效 
        AJMP NEXTT
CHECKK:JNB P3.0,REPEAT    ;判断是否使用锦囊
NEXTT: ACALL DISPLAY
   JB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用) 
       AJMP RECOUNT
ACCOUT:MOV A,DATA0 
       JNB ACC.0,TRUE1
       JNB ACC.1,TRUE2
       JNB ACC.2,TRUE3
       JNB ACC.3,TRUE4
       JNB ACC.4,TRUE5
       JNB ACC.5,TRUE6
       JNB ACC.6,TZ7
      JNB ACC.7,TZ8
      AJMP RECOUNT
 TZ7: AJMP TRUE7
 TZ8: AJMP TRUE8   
 QUIT:  CLR OK                         ;如果按下了"停止键"执行的程序
   CLR RING
   SETB P3.7
   AJMP START
TRUE1: ACALL BARK
       MOV A,R2
       MOV R6,A              ;抢答时间R2送R6
       MOV R3,#01H
       CLR OK                ;因为答题的计时不再查询抢答,所以就锁了抢答
       AJMP COUNT
TRUE2:ACALL BARK
      MOV A,R2
      MOV R6,A
      MOV R3,#02H
      CLR OK
      AJMP COUNT
TRUE3:ACALL BARK
      MOV A,R2
      MOV R6,A
      MOV R3,#03H
      CLR OK
      AJMP COUNT
TRUE4:ACALL BARK
      MOV A,R2
      MOV R6,A
      MOV R3,#04H
      CLR OK 
      AJMP COUNT
TRUE5: ACALL BARK 
        MOV A,R2
        MOV R6,A
        MOV R3,#05H
        CLR OK
        AJMP COUNT
TRUE6:  ACALL BARK 
        MOV A,R2
        MOV R6,A
        MOV R3,#06H
        CLR OK
        AJMP COUNT
TRUE7:  ACALL BARK 
        MOV A,R2
        MOV R6,A
        MOV R3,#07H
        CLR OK
        AJMP COUNT
TRUE8:  ACALL BARK 
        MOV A,R2
        MOV R6,A
        MOV R3,#08H
        CLR OK
	AJMP COUNT
ERROR:  MOV R0,#00H
        MOV TH1,#3CH
        MOV TL1,#0B0H
        MOV 34H,R3                ;犯规号数暂存与(34H) 
HERE:   MOV A,R0
        CJNE A,#06H,FLASH         ;0.3s向下运行->灭并停响
        CLR RING
		SETB P3.7		
        MOV R3,#0AH
        MOV R4,#0AH
        MOV R5,#0AH               ;三灯全灭
        AJMP CHECK1 
FLASH:  CJNE A,#0CH,CHECK1        ;下面是0.8s的情况,响并显示号数并清R0,重新计
        SETB RING
        MOV R0,#00H
        MOV R3,34H                ;取回号数
        MOV R5,#0BH
        MOV R4,#0BH               ;显示FF和号数
        AJMP CHECK1
CHECK1: JNB P3.1,QUIT1
        ACALL DISPLAY
        AJMP HERE
QUIT1:  CLR RING
		SETB P3.7
        CLR OK
        AJMP START
DISPLAY:MOV DPTR,#DAT1           ;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出 
        MOV A,R3
        MOVC A,@A+DPTR
        MOV P2,#0efH
        MOV P0,A
        ACALL DELAY
        MOV DPTR,#DAT2
        MOV A,R5
        MOVC A,@A+DPTR
        MOV P2,#0bfH
        MOV P0,A
        ACALL DELAY
        MOV A,R4
        MOVC A,@A+DPTR
        MOV P2,#07fH
        MOV P0,A
        ACALL DELAY
        RET

仿真演示视频:
https://www.bilibili.com/video/BV1we411K7Vr/

实物演示视频:
https://www.bilibili.com/video/BV1wM411r7Jj/

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值