这是我大二辅修计算机学院单片机的最终任务
上大学以来第一次独立完成这样的任务(大二下学期完成了这个任务)特别感谢我的伙伴Mr.关 @黑河豚 备注:代码共300多行,难以忘记那时候和黑河豚天天打代码,不过最终漂亮地完成后那种喜悦非常强烈。
运行视频在此:https://www.bilibili.com/video/BV1gE411L7w2
一. 设计要求 1、用Proteus设计原理图,要求显示出里程,速度,总价 2、用信号发生器来产生出租车的模拟信号,每个脉冲相当于轮胎转了一圈。 3、出租车轮胎周长按1.83米计算。2公里以内按8元计算,超过2公里每公里按2.6元计算。不考虑其他费用。 4、速度的单位为公里/小时,里程的单位为公里(有两位小数)。当信号发生器的输出为10HZ时,速度应该为65.8公里/小时。 二. 设计思路 里程:利用INT0号中断在中断进程中使得寄存器R3每中断一次加一,加满后向R4进位,然后乘以表示轮胎周长的常量Circumference,经过换算后就可以得到十进制的里程数,再将其转移到相应的显示内存中。 速度:同样利用INT0中断每中断一次使得R5加一,再利用计时器记10ms,在记满一秒时将R5中内容转移到R6中,R6中内容是每秒钟轮胎旋转的圈数,可以表示出租车行驶的速度,换算单位和进制后存储在相应的显示内存中,就可以显示速度。 费用:先判断里程是否大于2km,若不大于,则显示为2元,若大于2km,则跳入计费程序,先把里程减去2km,然后剩余的里程与2.6元做乘法,换算进制后储存到相应的显示内存即可。 按钮暂停计费/重新计费:若按钮从未按下到按下,则使循环包括更新显示内容和显示,若按钮松开,则只显示而不更新,若再次按下,则先使得R3;R4;R5;R6内容清零再更新与显示 三. 模块划分 Display:播放程序 Delay:延时程序 Bin:三位16进制数转四位十进制数程序 Calculatemilage:通过R3计算出里程数的程序 nextMilage:将里程数搬入显示内存的程序 CalculateSPEED:通过R6计算速度的程序 nextSPEED:将速度搬入显示内存的程序 CalculatePRICE:通过里程数判断并计算费用的程序 PlayPRICE:将费用搬入显示内存的程序 MAIN:中断设定 WAIT:主循环 Milage:里程,速度中断计数程序 Speed:速度定时读取程序 代码如下:
;作者:云树阿云
;协助者:黑河豚
;指导老师:知足常乐(朱老师)
$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
|