qiangdaqi.txt

来自「有一个主持人控制开关和6路抢答按扭」· 文本 代码 · 共 658 行

TXT
658
字号
         OK EQU 20H 

         RING EQU 22H 

         ORG 0000H 

         AJMP MAIN 

         ORG 0003H 

         AJMP INT0SUB 

         ORG 000BH 

         AJMP T0INT 

         ORG 0013H 

         AJMP INT1SUB 

         ORG 001BH 

         AJMP T1INT 

         ORG 0040H 

MAIN:    MOV R1,#30

         MOV R2,#60

         MOV TMOD,#11H

         MOV TH0,#0F0H 

         MOV TL0,#0FFH

         MOV TH1,#3CH 

         MOV TL1,#0B0H 

         SETB EA 

         SETB ET0 

         SETB ET1 

         SETB EX0 

         SETB EX1 

         CLR OK 

         CLR RING 

         SETB TR1 

         SETB TR0 
;=====查询程序===== 

START:    MOV R5,#0BH 

          MOV R4,#0BH 

          MOV R3,#0BH 

          ACALL DISPLAY

          JB P3.0,NEXT

          ACALL DELAY 

          JB P3.0,NEXT

          ACALL BARK

          MOV A,R1 

          MOV R6,A 

          SETB OK 

          MOV R7,#01H  

          MOV R3,#0AH

          AJMP 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,FALSE7 

          JNB P1.7,FALSE8 
   
          AJMP START 

;=====非法抢答处理程序===== 

  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 

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

  INT0SUB:MOV A,R1 

          MOV B,#0AH 

          DIV AB 

          MOV R5,A 

          MOV R4,B 

          MOV R3,#0AH 

          ACALL DISPLAY

          ACALL DELAY 

          JNB P3.4,INC0 

          ACALL DELAY 

          JNB P3.5,DEC0

	  ACALL DELAY 

          JNB P3.1,BACK0

          AJMP INT0SUB 

    INC0: MOV A,R1 

          CJNE A,#63H,ADD0  

          MOV R1,#00H 

          ACALL DELAY1 

          AJMP INT0SUB 

    ADD0: INC R1 

          ACALL DELAY1 

          AJMP INT0SUB 

    DEC0: MOV A,R1 

          JZ SETR1 

          DEC R1 

          ACALL DELAY1 

          AJMP INT0SUB 

    SETR1:MOV R1,#63H 

          ACALL DELAY1 

          AJMP INT0SUB 

          BACK0: RETI 

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

INT1SUB:MOV A,R2 

        MOV B,#0AH 

        DIV AB 

        MOV R5,A 

        MOV R4,B 

        MOV R3,#0AH 

        ACALL DISPLAY 

        ACALL DELAY 

        JNB P3.4,INC1 

        ACALL DELAY 

        JNB P3.5,DEC1 

        JNB P3.1,BACK1 

        AJMP INT1SUB 

  INC1: MOV A,R2 

        CJNE A,#63H,ADD1 

        MOV R2,#00H 

        ACALL DELAY1 

        AJMP INT1SUB 

   ADD1:INC R2 

        ACALL DELAY1 

        AJMP INT1SUB 

   DEC1:MOV A,R2 

        JZ SETR2 

        DEC R2 

        ACALL DELAY1 

        AJMP INT1SUB 

  SETR2:MOV R2,#63H 

        ACALL DELAY1 

        AJMP INT1SUB 

  BACK1:RETI 

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

 REPEAT:MOV A,R2   

        MOV R6,A 

        CLR RING 

 COUNT: MOV R0,#00H

        MOV TH1,#3CH 

        MOV TL1,#0B0H 

RECOUNT:MOV A,R6

        MOV B,#0AH 

        DIV AB

        MOV 30H,A

        MOV 31H,B

        MOV R5,30H 

        MOV R4,31H 

        MOV A,R6 

        SUBB A,#07H 

        JNC LARGER 

        MOV A,R0 

        CJNE A,#0AH,FULL 

        CLR RING 

        AJMP CHECK 

   FULL:CJNE A,#14H,CHECK

        SETB RING 

        MOV A,R6 

        JZ QUIT

        MOV R0,#00H 

        DEC R6

        AJMP CHECK 

LARGER: MOV A,R0 

        CJNE A,#14H,CHECK

        DEC R6 

        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,36H 

         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,TZ1 

         JNB ACC.7,TZ2 

         AJMP RECOUNT 

     TZ1:JMP TRUE7 

     TZ2:JMP TRUE8 

    QUIT: CLR OK

          CLR RING 

          AJMP START 

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

   TRUE1: ACALL BARK 

          MOV A,R2 

          MOV R6,A

          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

    HERE: MOV A,R0 

          CJNE A,#06H,FLASH

          CLR RING 

          MOV R3,#0AH 

          MOV R4,#0AH 

          MOV R5,#0AH

          AJMP CHECK1 

   FLASH: CJNE A,#0CH,CHECK1 

          SETB RING 

          MOV R0,#00H 

          MOV R3,34H

          MOV R5,#0BH 

          MOV R4,#0BH

          AJMP CHECK1 

   CHECK1:JNB P3.1,QUIT1 

          ACALL DISPLAY 
 
          AJMP HERE 

   QUIT1: CLR RING 

          CLR OK 

          AJMP START 

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

  DISPLAY:MOV DPTR,#DAT1 

          MOV A,R3 

          MOVC A,@A+DPTR 

          MOV P2,#0fbH

          MOV P0,A 

          ACALL DELAY2 

          MOV DPTR,#DAT2 

          MOV A,R5 

          MOVC A,@A+DPTR 

          MOV P2,#0feH

          MOV P0,A 

          ACALL DELAY2 

          MOV A,R4 

          MOVC A,@A+DPTR 

          MOV P2,#0fdH

          MOV P0,A 

          ACALL DELAY2 

          RET 

DAT1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,00H

;"灭","1","2","3","4","5","6","7","8","9","灭","F" 

DAT2:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,00H
;第一个为零,其他与上相同,因为十位如果为零显示熄灭 

;====加减时间延时(起到不会按下就加 N 个数)====== 

  DELAY1: MOV 35H,#08H 

   LOOP0: ACALL DISPLAY 

          DJNZ 35H,LOOP0 

          RET 

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

   DELAY: MOV 32H,#12H 

    LOOP: MOV 33H,#0AFH 

   LOOP1: DJNZ 33H,LOOP1 

          DJNZ 32H,LOOP 

          RET 

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

  DELAY2: MOV 32H,#43H 

  LOOP3:  MOV 33H,#1EH 

          MOV A,R7 

          JNZ AAAA1  
                                                               
          LOOP2: DJNZ 33H,LOOP2 

          DJNZ 32H,LOOP3 

          RET 

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


   AAAA1: MOV A,P1 

          CJNE A,#0FFH,AA1   

     AA0: MOV 36H,A   

          AJMP LOOP2 

     AA1: DEC R7 

          AJMP AA0 

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

    BARK: SETB RING 

          ACALL DELAY1 

          ACALL DELAY1 

          CLR RING

          RET 

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

   T0INT: MOV TH0,#0ECH 

          MOV TL0,#0FFH 

          JNB RING,OUT; 

          CPL P3.6 

     OUT: RETI 

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

   T1INT: MOV TH1,#3CH 

          MOV TL1,#0B0H 

          INC R0 

          RETI 

          END 



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?