⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 13.asm

📁 汽车速度测试器,以1米的间隔放置光感应器,含3个按键,RESET START/STOP/ 三位数码显示
💻 ASM
📖 第 1 页 / 共 2 页
字号:
ORG     0000H
                AJMP    START
                        ORG     0003H
                        AJMP    E_INT0
                        ORG     000BH
                        AJMP    INT_T0
          START:        ACALL        INSTALL
                        MOV     SP,#1FH
                        SETB    EA
                        ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                            SETB     ET0
                            SETB     EX0
                            SETB     IT0
                            SETB     PX0
                            MOV      TMOD,#1
                            MOV      TH0,#0FEH
                            MOV      TL0,#0BFH
                            MOV      STOP,#0    ;设定一个标志,表示当前状态是正在记时还是等待触发?'0'表示等待.
                            MOV      R1,#N
                            MOV      @R1,#0
                            INC      R1
                            MOV      @R1,#5
                            ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

                ACALL   CU
             AG:ACALL   SHOW_N  ;用100000去除以'N',将结果放到 je_go 单元中。
                ACALL   M_KM    ;将结果*3.6后保存到je_go1中去.
                ACALL   TEST    ;将结果bcd转换后送入bcd缓冲区,再取三位有效数送显存。
               ;######################
                ACALL   TEST_N
                ACALL   SCREEN                ;送出到p1口显示。
                ACALL   TEST_KEY
                AJMP    AG

                ;******************************************************************
                ;******************************************************************
         BUFFER: DS      3
         JE_GO:  DS      4
         DOT:    DS 1                    ;小数点的位置。
         SUM:    DS 6
         KMM:    DS 1
         N:      DS 2                    ;记数器的记数结果。
         STOP:    DS       1             ;外部中断的启动/停止(记数器)标志。


                ;******************************************************************
        CU:      MOV  KMM,#0
                 MOV  R1,#N
                 MOV  @R1,#0FEH
                 INC  R1
                 MOV  @R1,#0FEH
                 RET
      SHOW_N:
                 ACALL  LOAD_N
                 ACALL  DIVD
      MOV R1,#JE_GO
      MOV A,R2
      MOV @R1,A
      INC R1
      MOV A,R3
      MOV @R1,A         ;将结果存放在je_go的存储单元中。
                RET
     LOAD_N:     MOV    R2,#0H
                 MOV    R3,#01H
                 MOV    R4,#086H
                 MOV    R5,#0A0H
               MOV   R1,#N
               MOV   A,@R1
               MOV   R6,A
               INC   R1
               MOV   A,@R1
               MOV   R7,A
               RET
        SCREEN:

                MOV  R1,#BUFFER               ;可送入0---F显示,送17显示黑屏.
                MOV  DPTR,#TAB                ;小数点由dot的数值决定。=0无小
                MOV  A,@R1                    ;数点,=1有一位小数,=2有二位小
                MOVC  A,@A+DPTR               ;数。
                MOV  P1,A
                CLR   P3.3
                MOV   A,DOT
                CJNE  A,#2,SCR_NEXT0
                CLR  P1.0
   SCR_NEXT0:   ACALL    DELAY1
                INC  R1
                MOV  A,@R1
                MOVC  A,@A+DPTR
                MOV   P1,A
                SETB  P3.3
                CLR   P3.4
                MOV   A,DOT
                CJNE  A,#1,SCR_NEXT1
                CLR  P1.0
    SCR_NEXT1:  ACALL    DELAY1
                INC  R1
                MOV  A,@R1
                MOVC  A,@A+DPTR
                MOV   P1,A
                SETB  P3.4
                CLR   P3.5
                ACALL    DELAY1
                SETB  P3.5
                RET


                ;******************************************************************
    TEST_KEY:    MOV   A,KMM
                 JNZ   KEY_NT0
                 SETB  P3.7
                 AJMP  KEY_NT1
                 KEY_NT0:
                 CLR     P3.7
     KEY_NT1:    SETB    P3.0
                 SETB    P3.1
                 JNB      P3.0,KEY_KM
                 JNB      P3.1,CLEAR
                 RET
     KEY_KM:     ACALL  DELAY1
                 ACALL  DELAY1
                 JNB    P3.0,KEY_KMNT0
                 RET
                 KEY_KMNT0:
                 MOV    A,KMM
                 CPL    ACC.0
                 MOV    KMM,A
                 KEY_LP0:
                 JNB    P3.0,KEY_LP0
                 ACALL  DELAY1
                 ACALL  DELAY1
                 JNB    P3.0,KEY_LP0
                 ACALL  TEST
                 RET
     CLEAR:      ACALL  DELAY1
                 ACALL  DELAY1
                 JNB    P3.1,CLEAR_NT1
                 RET
                 CLEAR_NT1:
                 MOV    R1,#N
                 MOV    @R1,#0FEH
                 INC    R1
                 MOV    @R1,#0FEH
                 MOV    R1,#JE_GO
                 MOV    @R1,#0
                 INC    R1
                 MOV    @R1,#0
                 INC    R1
                 MOV    @R1,#0
                 INC    R1
                 MOV    @R1,#0
                 MOV    STOP,#0
                 CLR    TR0

                 ;ACALL   TEST_N   ;对N测试,如果N<5或N>0FEH,显示E00,N=FC显示000.
                 CLEAR_NT0:
                 JNB    P3.1,CLEAR_NT0
                 ACALL  DELAY1
                 ACALL  DELAY1
                 JNB    P3.1,CLEAR_NT0
                 RET

                 ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


     TEST:       ACALL  BCD_CODE
                 ACALL  DSP_DATA    ;从6位数的结果中取出三位有效数,(前三位不为0的数)
                 NOP                ;送入显示缓冲区中.
                 RET
      DSP_DATA: MOV     R1,#SUM
                MOV     R0,#BUFFER
                INC     R1
                MOV     A,@R1
                JNZ      DSP_NT0


                INC     R1
                MOV     A,@R1
                JNZ      DSP_NT0
                INC      R1
     DSP_NT2:   MOV     R7,#3
     DSP_LP2:   MOV     A,@R1
                MOV     @R0,A
                INC     R0
                INC     R1
                DJNZ    R7,DSP_LP2
                RET


     DSP_NT1:   MOV     R7,#3
     DSP_LP1:   MOV     A,@R1
                MOV     @R0,A
                INC     R0
                INC     R1
                DJNZ    R7,DSP_LP1
                RET

     DSP_NT0:   MOV     R7,#3
     DSP_LP0:   MOV     A,@R1
                MOV     @R0,A
                INC     R0
                INC     R1
                DJNZ    R7,DSP_LP0
                RET

      ;(7) 标号: DIVD 功能:双字节二进制无符号数除法
      ;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
      ;出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
      ;影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节

     DIVD:
      MOV   A,R6
      INC   A
      JNZ   DIV_NEXT0
      MOV   A,R7
      INC   A
      JNZ   DIV_NEXT0
      ACALL EROO
      RET
      DIV_NEXT0:
      CLR C ;比较被除数和除数
      MOV A,R3
      SUBB A,R7
      MOV A,R2
      SUBB A,R6
      JC DVD1
      SETB OV ;溢出
      ACALL   EROO
      RET

      DVD1: MOV B,#10H ;计算双字节商
      DVD2: CLR C ;部分商和余数同时左移一位
      MOV A,R5
      RLC A
      MOV R5,A
      MOV A,R4
      RLC A
      MOV R4,A
      MOV A,R3
      RLC A
      MOV R3,A
      XCH A,R2
      RLC A
      XCH A,R2
      MOV F0,C ;保存溢出位
      CLR C
      SUBB A,R7 ;计算(R2R3-R6R7)
      MOV R1,A
      MOV A,R2
      SUBB A,R6
      ANL C,/F0 ;结果判断
      JC DVD3
      MOV R2,A ;够减,存放新的余数
      MOV A,R1
      MOV R3,A
      INC R5 ;商的低位置一
      DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
      MOV A,R4 ;将商移到R2R3中
      MOV R2,A
      MOV A,R5
      MOV R3,A
      CLR OV ;设立成功标志
      ;以下程序为追加。
      RET

BCD_CODE:

      MOV    R1,#JE_GO
      MOV    A,KMM
      JZ     JEGO1     ;检测km/m的状态,如果为m(f0=0)则往下执行,为km(f0-1)则je_go=je_go*3.6
      INC     R1
      INC     R1
      JEGO1:
      MOV A,@R1
      MOV R6,A
      INC R1
      MOV A,@R1
      MOV R7,A
      ACALL   CG_BCD    ;转换成bcd码
      MOV     R1,#SUM   ;将转换后的bcd数存放在sum的六个单元内.

⌨️ 快捷键说明

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