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显示缓冲区地址为 30H
    • cDisplayBit 定义LED显示位地址为 3CH
    • Circumference 定义轮胎周长为 0B7H
    • StartpriceHStartpriceL 定义初始价格的高低字节
    • PriceL 定义价格的低字节
  • 跳转指令:
    • ORG 0000H 定义程序起始地址为 0000H
    • JMP MAIN 跳转到 MAIN 程序段
    • ORG 0003H 定义 Milage 子程序起始地址为 0003H
    • JMP Milage 跳转到 Milage 子程序
    • ORG 000BH 定义 Speed 子程序起始地址为 000BH
    • JMP Speed 跳转到 Speed 子程序
  • LED 显示:
    • DispTable 定义LED 显示的字符表
    • Display 子程序用于将数据显示到LED 显示屏
  • 延时:
    • Delay 子程序用于产生延时
  • 二进制转十进制:
    • Bin 子程序用于将二进制数据转换为十进制数据
  • 里程计算:
    • Calculatemilage 子程序用于计算里程
    • nextMilage 子程序用于将里程值转换为十进制显示
  • 速度计算:
    • CalculateSPEED 子程序用于计算速度
    • nextSPEED 子程序用于将速度值转换为十进制显示
  • 价格计算:
    • CalculatePRICE 子程序用于计算价格
    • PlayPRICE 子程序用于将价格值转换为十进制显示
  • 主程序:
    • MAIN 程序段为程序主程序,负责初始化、调用其他子程序并控制系统运行
    • DECIDE 程序段用于检测外部信号
    • WAIT 程序段用于等待外部信号并进行相应的计算
    • STOP 程序段用于停止计价
    • RESTART 程序段用于重新开始计价
  • 中断程序:
    • Milage 子程序用于计算里程
    • Speed 子程序用于计算速度

注意事项

  • 代码中使用的寄存器和内存地址需要根据实际情况进行调整
  • 代码中使用的常量需要根据实际需求进行修改
  • 代码中使用到的外部信号需要根据实际硬件连接进行修改
  • 代码中使用到的显示方式需要根据实际的显示器进行修改

代码分析

本代码主要实现以下功能:

  1. 读取里程传感器数据并计算里程
  2. 读取速度传感器数据并计算速度
  3. 根据里程和时间计算价格
  4. 将里程、速度和价格转换为十进制并显示到LED 显示屏上

代码中使用了循环、分支、中断等汇编指令,通过调用不同的子程序实现不同的功能。代码逻辑较为清晰,结构合理,能够较好地实现出租车计价器的功能。

代码学习

建议学习以下内容,帮助更好地理解代码:

  1. 8051 单片机基础知识
  2. 汇编语言基础知识
  3. LED 显示驱动
  4. 中断机制
  5. 时间管理
  6. 数据转换

代码应用

本代码可以应用于出租车计价器、里程表、速度计等设备的开发。

8051单片机出租车计价器汇编代码解析

原文地址: http://www.cveoy.top/t/topic/oUbh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录