8051单片机出租车计价器汇编代码解析
8051单片机出租车计价器汇编代码解析
$NOMOD51
$INCLUDE (8051.MCU)
cDisplayBuffer EQU 30H
cDisplayBit EQU 3CH
Circumference EQU 0B7H
StartpriceH EQU 03H
StartpriceL EQU 20H
PriceL EQU 1AH
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
Bin:
MOV R0, #42H ;42H为高位字节,43H为低位字节
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:
;MOV 23H,R3
;MOV 24H,R4
;MOV 25H,R5
;PUSH 3
;PUSH 4
;PUSH 5
PUSH PSW
INC R3
INC R5
CJNE R3,#0FFH,OUT
MOV R3,#0
INC R4
OUT:
POP PSW
;POP 25H
;POP 24H
;POP 23H
RETI
Speed:
;MOV 26H,R6
MOV 27H,A
;PUSH 5
;PUSH 6
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
;POP 26H
; POP 25H
MOV A,27H
RETI
END
代码解释
- 定义常量:
cDisplayBuffer定义LED显示缓冲区地址为 30HcDisplayBit定义LED显示位地址为 3CHCircumference定义轮胎周长为 0B7HStartpriceH和StartpriceL定义初始价格的高低字节PriceL定义价格的低字节
- 跳转指令:
ORG 0000H定义程序起始地址为 0000HJMP MAIN跳转到MAIN程序段ORG 0003H定义Milage子程序起始地址为 0003HJMP Milage跳转到Milage子程序ORG 000BH定义Speed子程序起始地址为 000BHJMP Speed跳转到Speed子程序
- LED 显示:
DispTable定义LED 显示的字符表Display子程序用于将数据显示到LED 显示屏
- 延时:
Delay子程序用于产生延时
- 二进制转十进制:
Bin子程序用于将二进制数据转换为十进制数据
- 里程计算:
Calculatemilage子程序用于计算里程nextMilage子程序用于将里程值转换为十进制显示
- 速度计算:
CalculateSPEED子程序用于计算速度nextSPEED子程序用于将速度值转换为十进制显示
- 价格计算:
CalculatePRICE子程序用于计算价格PlayPRICE子程序用于将价格值转换为十进制显示
- 主程序:
MAIN程序段为程序主程序,负责初始化、调用其他子程序并控制系统运行DECIDE程序段用于检测外部信号WAIT程序段用于等待外部信号并进行相应的计算STOP程序段用于停止计价RESTART程序段用于重新开始计价
- 中断程序:
Milage子程序用于计算里程Speed子程序用于计算速度
注意事项
- 代码中使用的寄存器和内存地址需要根据实际情况进行调整
- 代码中使用的常量需要根据实际需求进行修改
- 代码中使用到的外部信号需要根据实际硬件连接进行修改
- 代码中使用到的显示方式需要根据实际的显示器进行修改
代码分析
本代码主要实现以下功能:
- 读取里程传感器数据并计算里程
- 读取速度传感器数据并计算速度
- 根据里程和时间计算价格
- 将里程、速度和价格转换为十进制并显示到LED 显示屏上
代码中使用了循环、分支、中断等汇编指令,通过调用不同的子程序实现不同的功能。代码逻辑较为清晰,结构合理,能够较好地实现出租车计价器的功能。
代码学习
建议学习以下内容,帮助更好地理解代码:
- 8051 单片机基础知识
- 汇编语言基础知识
- LED 显示驱动
- 中断机制
- 时间管理
- 数据转换
代码应用
本代码可以应用于出租车计价器、里程表、速度计等设备的开发。
原文地址: http://www.cveoy.top/t/topic/oUbh 著作权归作者所有。请勿转载和采集!