找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机做出租车计价器溢出(汇编)

[复制链接]
跳转到指定楼层
楼主
求大神解答,本程序里程超过10km价格溢出,请问该如何修改??
$NOMOD51
$INCLUDE (8051.MCU)

;==========================
; 常量/变量地址定义
;==========================
cDisplayBuffer        EQU        30H
cDisplayBit        EQU        3CH
Circumference  EQU 0B7H         ; 轮胎周长 = 183cm = 1.83m
StartpriceH        EQU 04H            ; 起步价高字节(0x04B0 = 1200 分 = 12 元)
StartpriceL        EQU 0B0H
PriceL         EQU 1AH          ; 每公里单价2.6元 × 10 = 26(十进制)

;==========================
; 启动中断向量
;==========================
ORG 0000H
JMP MAIN
ORG 0003H
JMP Milage
ORG 000BH
JMP Speed

;==========================
; 数码管段码表
;==========================
DispTable:       
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH

;==========================
; 数码管显示子程序
;==========================
Display:
    MOV        A, cDisplayBit
    MOV        P2, A
    MOV        DPTR, #DispTable
    MOV        A, #cDisplayBuffer
    ADD        A, cDisplayBit
    MOV        R0, A
    MOV        A, @R0
    MOVC        A, @A+DPTR
    MOV         P1, A
    INC         cDisplayBit
    ANL        cDisplayBit, #15
    RET

;==========================
; 延时
;==========================
Delay:
    MOV         R0, #10
    MOV          R1, #10
    DJNZ         R1, $
    DJNZ        R0, $-4
    RET

;==========================
; 二进制转 BCD(里程/价格通用)
;==========================
Bin:
    MOV        R0, #42H
    MOV        R1, #45H  
    CLR A
    MOV @R1,A
    INC R1
    MOV @R1,A
    INC R1
    MOV @R1,A
    INC R1
    MOV @R1,A
    PUSH 7
    MOV R7,#24
BD1:
    CLR C
    INC R0
    INC R0
    MOV A,@R0
    RLC A
    MOV @R0,A
    DEC R0
    MOV A,@R0
    RLC A
    MOV @R0,A
    DEC R0
    MOV A,@R0
    RLC A
    MOV @R0,A
    PUSH 1
    MOV A,@R1
    ADDC A,@R1
    DA A
    MOV @R1,A
    DEC R1
    MOV A,@R1
    ADDC A,@R1
    DA A
    MOV @R1,A
    DEC R1
    MOV A,@R1
    ADDC A,@R1
    DA A
    MOV @R1,A
    DEC R1
    MOV A,@R1
    ADDC A,@R1
    DA A
    MOV @R1,A
    POP 1
    DJNZ R7,BD1
    POP 7
    RET

;==========================
; 里程计算
;==========================
Calculatemilage:
      MOV A,R3
      MOV B,#Circumference
      MUL AB
      MOV 43H,B
      MOV 44H,A
      MOV A,R4
      MOV B,#Circumference
      MUL AB
      ADD A,43H
      MOV 43H,A
      MOV A,B
      ADDC A,#0
      MOV 42H,A
      RET

nextMilage:
      MOV A,47H
      MOV B,#10H
      DIV AB
      MOV 37H,A
      MOV A,46H
      MOV B,#10H
      DIV AB
      MOV 36H,B
      ADD A,#10
      MOV 35H,A
      MOV A,45H
      MOV B,#10H
      DIV AB
      MOV 34H,B
      RET
      
CalculateSPEED:
      MOV A,R6
      MOV B,#Circumference
      MUL AB
      MOV 42H,B
      MOV B,#24H
      MUL AB
      MOV 44H,A
      MOV 43H,B
      MOV A,42H
      MOV B,#24H
      MUL AB
      ADD A,43H
      MOV 43H,A
      MOV A,B
      ADDC A,#0
      MOV 42H,A
      
      RET
nextSPEED:
      MOV A,47H
      MOV B,#10H
      DIV AB
      MOV 3BH,B
      ADD A,#10
      MOV 3AH,A
      MOV A,46H
      MOV B,#10H
      DIV AB
      MOV 39H,B
      MOV 38H,A
      RET

CalculatePRICE:
      MOV A,34H
      CLR C
      SUBB A,#1
      JNC nextPRICE
      CLR C
      MOV A,35H
      SUBB A,#12
      JNC nextPRICE
      
      MOV 42H,#00H
      MOV 44H,#StartpriceL
      MOV 43H,#StartpriceH
      RET
      
      
nextPRICE:
      CLR C
      MOV A,36H
      SUBB A,#0
      MOV 44H,A
      MOV A,35H
      SUBB A,#12
      MOV 43H,A
      MOV A,34H
      SUBB A,#0
      MOV 42H,A
      
      MOV 46H,#00H
      MOV A,44H
      MOV B,#1
      MUL AB
      MOV 45H,A
      MOV A,43H
      MOV B,#10
      MUL AB
      ADD A,45H
      MOV 45H,A
      MOV A,#00
      ADDC A,#00
      MOV 46H,A
      MOV A,42H
      MOV B,#100
      MUL AB
      ADD A,45H
      MOV 45H,A
      MOV A,46H
      ADDC A,#00
      ADD A,B
      MOV 46H,A
      
      
      
      MOV A,45H
      MOV B,#priceL
      MUL AB
      MOV 53H,A
      MOV 52H,B

      
      MOV A,46H
      MOV B,#priceL
      MUL AB
      ADD A,52H
      MOV 52H,A
      MOV A,B
      ADDC A,#0
      MOV 51H,A
      
      MOV A,53H
      ADD A,#StartpriceL
      MOV 53H,A
      MOV A,52H
      ADDC A,#00
      ADD A,#StartpriceH
      MOV 52H,A
      MOV A,51H
      ADDC A,#00
      MOV 51H,A
      
      
      MOV 44H,53H
      MOV 43H,52H
      MOV 42H,51H

      
      RET
      
      
PlayPRICE:
      MOV A,48H
      MOV B,#10H
      DIV AB
      MOV 33H,B
      MOV 32H,A
      MOV A,47H
      MOV B,#10H
      DIV AB
      MOV 30H,A   
      MOV A,B
      ADD A,#10
      MOV 31H,A

      RET
MAIN:
      MOV R2,#100
       MOV    SP,#60H   
       MOV    TMOD,#01H
       MOV    TL1,#00H
       MOV    TH1,#0B8H
       SETB TR0
       SETB ET0
       SETB        IT0
       SETB        EX0
         SETB        EA  
DECIDE:
      JNB P3.7,WAIT
      SJMP DECIDE
WAIT:
     LCALL Calculatemilage
     LCALL Bin
     LCALL nextMilage
     LCALL CalculatePRICE
     LCALL Bin
     LCALL PlayPRICE
     LCALL CalculateSPEED
     LCALL Bin
     LCALL nextSPEED
     LCALL Display
     LCALL Delay
     JNB P3.7,WAIT
STOP:
     LCALL Display
     LCALL Delay
     JNB P3.7,RESTART
     SJMP STOP
RESTART:
      MOV R3,#00H
      MOV R4,#00H
      MOV R5,#00H
      MOV R6,#00H
      SJMP MAIN
     
     
Milage:
      PUSH PSW

      INC R3
      INC R5
      CJNE R3,#0FFH,OUT
      MOV R3,#0
      INC R4
      

OUT:
      POP PSW
      RETI

Speed:
      MOV 27H,A
      PUSH 27H
      PUSH PSW
     MOV    TL0,#00H
     MOV    TH0,#0B8H
     DJNZ R2,OUT2
     MOV A,R5
     MOV R6,A
     MOV R2,#100
     MOV R5,#00H
OUT2:
      POP PSW
      POP 27H
      MOV A,27H
      RETI
      END


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1155980 发表于 2025-7-4 15:45 | 只看该作者
这个计价的要求是“里程是否大于3km,若不大于,则显示为12元,若大于3km,则跳入计费程序,先把里程减去3km,然后剩余的里程与2.6元做乘法,换算进制后储存到相应的显示内存即可。”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表