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

📄 1.txt

📁 用单片机进行速度与里程的计数,就像出租车的计价器一样可以显示总里程,实时行驶速度等.
💻 TXT
字号:
;############T0 中断子程序##100MS时(用于时钟定时)###############
INT0TIME:
       PUSH  PSW                ;状态字堆栈保护
       PUSH  ACC                ;累加器堆栈保护
       CLR   TR0                ;关T0中断
       MOV   TH0,#03CH          ;T0重新赋值
       MOV   TL0,#0B0H
       DJNZ  TEMP0,RETUNT       ;计数中间变量TEMP0自减1,10*100ms=1s
       MOV   TEMP0,#0AH         ;计数中间变量TEMP0重新加载10
;####################################################################
;                     时钟子程序
;####################################################################
       MOV   A,#01H
       ADD   A,SECOND
       DA    A
       MOV   SECOND,A
       CJNE  A,#60H,RETUNT
       MOV   SECOND,#00H
       MOV  A,#01H
       ADD  A,MINUTE
       DA   A
       MOV  MINUTE,A
       CJNE A,#60H,RETUNT
       MOV  MINUTE,#00H
       MOV  A,#01H
       ADD  A,HOUR
       DA   A
       MOV  HOUR,A
       CJNE A,#24H,RETUNT
       MOV  HOUR,#00H
;####################################################################
RETUNT:SETB  TR0             ;T0重新开中断
       POP   ACC             ;累加器出堆栈
       POP   PSW             ;状态字出堆栈
       RETI
;####################################################################
;                      外部中断子程序
;####################################################################
INTEX0: PUSH  ACC            ;累加器堆栈保护
        PUSH  PSW            ;状态字堆栈保护
        PUSH  02H            ;R2入栈保护
        PUSH  DECIMAL        ;小数点入栈保护
        CLR   TR1            ;关T1中断
;####################################################################
;                     下降沿计数子程序段
;####################################################################
        MOV   A,#01H
        ADD   A,CIRCLESL     ;圈数加一
        MOV   CIRCLESL ,A
        CJNE  A,#0FFH,CIRCLES_OVER
        MOV   CIRCLESL ,#00H ;圈数清零
;####################################################################
CIRCLES_OVER:
        ACALL DISTANCE       ;调用距离计算子程序
;####################################################################
;                       速度计算子程序
;####################################################################
       ACALL  CSPEED          ;调用距离计算子程序
       MOV    R6,SPEEDHIG
       MOV    R7,SPEEDLOW
       ACALL  CHBCD           ;调用双字节十六进制转换为BCD码子程序
       MOV    BCDSPEEDH  ,R3  ;存放速度的BCD码值(3个字节)
       MOV    BCDSPEEDM  ,R4
       MOV    BCDSPEEDL  ,R5
       SETB   TR1             ;开T1中断
       POP    DECIMAL         ;小数点位置出栈
       POP    02H             ;出栈处理
       POP    PSW
       POP    ACC
       RETI
;####################################################################;
;                          里程显示控制子程序
;####################################################################;
DISTANCE:
        ACALL  DISTANCE0        ;计算距离
        MOV    R6,MULTP1        ;放大倍数的高位
        MOV    R7,MULTP0        ;放大倍数的低位
        ACALL  DISTANCE1        ;调用距离计算
        MOV    R6,DISTANHIG     ;里程计算结果
        MOV    R7,DISTANLOW
        ACALL  CHBCD            ;调用BCD 转换
        MOV    BCDDISTANH,R3    ;存放里程的十进制值
        MOV    BCDDISTANM,R4
        MOV    BCDDISTANL  ,R5
        RET
;####################################################################;
;                        里程处理子程序1
;####################################################################;
DISTANCE0:   PUSH   PSW        ;状态字堆栈保护
        PUSH   ACC             ;累加器堆栈保护
        MOV    A,CIRCLESH
        JZ     SHORTDIST
        MOV    MULTP1,#00H     ;放大倍数1倍
        MOV    MULTP0,#01H
        AJMP   LONGDIST
SHORTDIST:
        MOV    MULTP1,#00H     ;放大倍数1倍
        MOV    MULTP0,#01H
        MOV    A, CIRCLESL
        SUBB   A,#05H
        JC     LI
        AJMP   LI0
LI:     MOV    R6,#07H         ;圈数范围小于06H
        MOV    R7,#07H         ;计算的周长1799,扩大1000倍
        MOV    DECIMAL1,#01H   ;3位小数
        AJMP   DDMUL
LI0:    MOV    A, CIRCLESL
        SUBB   A,#38H
        JNC     LI1
        MOV    R6,#00H         ;圈数范围大于6H小于38H的距离计算
        MOV    R7,#0B4H        ;计算的周长为180,扩大100倍
        MOV    DECIMAL1,#02H   ;2位小数
        AJMP   DDMUL
LI1:
        MOV    R6,#00H         ;计算的周长18,扩大10倍
        MOV    R7,#012H        ;计算的周长18,扩大10倍
        MOV    DECIMAL1,#03H   ;1位小数
        AJMP   DDMUL
LONGDIST:
        MOV    R6,#00H         ;计算的周长18,扩大10倍
        MOV    R7,#012H        ;计算的周长18,扩大10倍
        MOV   DECIMAL1,#03H    ;1位小数
;####################################################################
;              DDMUL为两字节乘两字节乘法子程序段   R2R3*R6R7=R2R3R4R5
;####################################################################
DDMUL:
        MOV    R2,CIRCLESH     ;读圈数到R2,R3中
        MOV    R3,CIRCLESL
        MOV    A,R3 	       ;计算R3乘R7
        MOV    B,R7
        MUL    AB
        MOV    R4,B 	       ;暂存部分积
        MOV    R5,A
        MOV    A,R3            ;计算R3乘R6
        MOV    B,R6
        MUL    AB
        ADD    A,R4            ;累加部分积
        MOV    R4,A
        CLR    A
        ADDC   A,B
        MOV    R3,A
        MOV    A,R2            ;计算R2乘R7
        MOV    B,R7
        MUL    AB
        ADD    A,R4            ;累加部分积
        MOV    R4,A
        MOV    A,R3
        ADDC   A,B
        MOV    R3,A
        CLR    A
        RLC    A
        XCH    A,R2            ;计算R2乘R6
        MOV    B,R6
        MUL    AB
        ADD    A,R3            ;累加部分积
        MOV    R3,A
        MOV    A,R2
        ADDC   A,B
        MOV    R2,A
        MOV    60H,R2	       ;暂存值
        MOV    61H,R3
        MOV    62H,R4
        MOV    63H,R5
        POP    PSW             ;恢复堆栈
        POP    ACC
        RET
;####################################################################;
;                         处理里程子程序2
;####################################################################;
DISTANCE1:
        PUSH   PSW
        PUSH   ACC
        MOV    R2,60H         ;被除数
        MOV    R3,61H
        MOV    R4,62H
        MOV    R5,63H
DIVD11: CLR    C              ;比较被除数和除数
        MOV    A,R3
        SUBB   A,R7
        MOV    A,R2
        SUBB   A,R6
        JC     DVD111
        SETB   OV             ;溢出
        RET
DVD111: MOV    B,#10H         ;计算双字节商
DVD211: 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
        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     DVD311
        MOV    R2,A           ;够减,存放新的余数
        MOV    A,R1
        MOV    R3,A
        INC    R5             ;商的低位置1
DVD311: DJNZ   B,DVD211       ;计算完十六位商(R4R5)
        MOV    A,R4           ;将商移到R2R3中
        MOV    R2,A
        MOV    A,R5
        MOV    R3,A
        CLR    OV             ;设立成功标志
        MOV    DISTANHIG,R2   ;存储距离计算值
        MOV    DISTANLOW,R3
        POP    ACC
        POP    PSW
        NOP
        RET
;####################################################################
;               T1中断子程序---1MS(定时速度时间)
;####################################################################
INT1CONT:
       PUSH   PSW
       PUSH   ACC
       MOV    TH1,#0FCH
       MOV    TL1,#018H
;#############################################
       MOV    A,#01H
       ADD    A,COUNTLOW
       MOV    COUNTLOW ,A
       CJNE   A,#0FFH,SPEED_OVER
       MOV    COUNTLOW ,#00H
       MOV    A,#01H
       ADD    A,COUNTHIG
       MOV    COUNTHIG,A
       CJNE   A,#0FFH,SPEED_OVER
       ACALL  CSPEED
       MOV    COUNTHIG,#00H
;##############################################
SPEED_OVER:
       MOV    A,SPEEDHIG
       SUBB   A,#3AH
       JNC    WARMING
       CLR    P1.4
       POP    ACC
       POP    PSW
       RETI
WARMING:
       CPL    P1.4
       POP    ACC
       POP    PSW
       RETI
;####################################################################
;                     速度运算子程序:
;R2R3R4R5/R6R7=R2R3           (SUMM 、SUML)
;####################################################################
CSPEED:
        MOV    R2,#00H        ;计算M/S用的周长
        MOV    R3,#019H
        MOV    R4,#0C9H
        MOV    R5,#08FH       ;1689999=1.689999*100 0000
        MOV    R6,COUNTHIG    ;#00H;
        MOV    R7,COUNTLOW    ;#0B0H;
        MOV    COUNTHIG,#00H
        MOV    COUNTLOW,#00H
        ACALL  DIVD
        MOV    SPEEDHIG,R2
        MOV    SPEEDLOW,R3
        RET
;####################################################################
;双字节二进制无符号数除法子程序
;####################################################################
DIVD:
       CLR C                   ;比较被除数和除数
       MOV A,R3
       SUBB A,R7
       MOV A,R2
       SUBB A,R6
       JC DVID1
       SETB OV                 ;溢出
       RET
DVID1: MOV B,#10H              ;计算双字节商
DVDI2: 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 DVID3
       MOV R2,A                ;够减,存放新的余数
       MOV A,R1
       MOV R3,A
       INC R5                  ;商的低位置一
DVID3: DJNZ B,DVDI2            ;计算完十六位商(R4R5)
       MOV A,R4                ;将商移到R2R3中
       MOV R2,A
       MOV A,R5
       MOV R3,A
       CLR OV                  ;设立成功标志
       RET
;####################################################################
;                  16进制到压缩BCD码的变换子程序
;####################################################################
CHBCD:  PUSH   ACC
        PUSH   PSW
        CLR    A               ;BCD码初始化
        MOV    R3,A
        MOV    R4,A
        MOV    R5,A
        MOV    R2,#10H         ;转换双字节十六进制整数
BECO:   MOV    A,R7             ;从高端移出待转换数的一位到CY中
        RLC    A
        MOV    R7,A
        MOV    A,R6
        RLC    A
        MOV    R6,A
        MOV    A,R5            ;BCD码带进位自身相加,相当于乘2
        ADDC   A,R5
        DA     A               ;十进制调整
        MOV    R5,A
        MOV    A,R4
        ADDC   A,R4
        DA     A
        MOV    R4,A
        MOV    A,R3
        ADDC   A,R3
        MOV    R3,A             ;双字节十六进制数的万位数不超过6,不用调整
        DJNZ   R2,BECO         ;处理完16bit
        POP    PSW
        POP    ACC
        NOP
        RET
;;####################################################################
;                    压缩码到非压缩码的变换子程序
;;####################################################################
DIVIDE: PUSH  00H
        PUSH  01H
        PUSH  07H
;#############小数点处理关键点#############
        CJNE  R1,#BCDDISTANL  ,NEXT0  ;判断小数点指针位置
        MOV   R6,DECIMAL1
        AJMP  NEXT1
NEXT0:  MOV   R6,DECIMAL
NEXT1:  MOV   R7,#03H
;#######################################
        MOV   R0,#SHOWLED0
LZH:    MOV   A,@R1      ;SECOND  ,MINUTE   HOUR
        ANL   A,#00FH
        MOV   @R0,A
        INC   R0
        MOV   A,@R1
        ANL   A,#0F0H
        SWAP  A
        MOV   @R0,A
        INC   R0
        INC   R1
        DJNZ  R7,LZH
        POP   07H
        POP   01H
        POP   00H
        RET
;#################################################################
;                     显示子程序
;#################################################################
SHOW:   PUSH 00H
        PUSH 01H
        PUSH 05H
        MOV  R0,#04H          ;显示4位LED
        MOV  R5,#7FH          ;LED位选择
SHOWREP:MOV  A,R5
        RL   A
        MOV  R5,A
        MOV  P2,A
        MOV  A,@R1
        DJNZ R6,POINT         ;显示小数点
        MOV  DPTR,#TABLE1     ;表头地址(带小数点)
        AJMP SHOW0
POINT:  MOV  DPTR,#TABLE    ;表头地址(不带小数点)
SHOW0:  MOVC A,@A+DPTR
        MOV  P0,A
        ACALL DELAY10         ;显示延迟10ms
        DEC  R1
        DJNZ R0,SHOWREP
        POP  05H
        POP  01H
        POP  00H
        RET
;#################################################################
;                      延时10ms子程序
;#################################################################
DELAY10:PUSH 00H
        PUSH 01H
        MOV  R0,#20H
REPET:  MOV  R1,#04H
        DJNZ R1,$
        DJNZ R0,REPET
        POP  01H
        POP  00H
        RET
;##############################  表    #############################
TABLE: DB 3FH,06H,5BH,4FH, 66H,6DH,7DH,07H,7FH,6FH,40H,39H,09H,0FH
          ;0   1   2   3   4    5   6   7   8   9   -
TABLE1:DB 0BFH,86H,0DBH,0CFH, 0E6H,0EDH,0FDH,87H,0FFH,0EFH ,40H
          ;0   1    2    3      4   5    6    7    8    9    -
        END

⌨️ 快捷键说明

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