📄 1.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 + -