📄 89lpc933(修改充电过程).asm
字号:
CJNE A, #46, PWNEXT243
PWNEXT243:
JNC PWNEXT244
;在43-45之间, 认为合理!(即10A的充电电流)
JMP PWNEXT281 ;显示处理
PWNEXT244:
;充电电流偏大
MOV A, AD0DAT3
CJNE A, #250, PWNEXT2441
PWNEXT2441:
JNC PWNEXT2442
;小于250,加1(调高DA转换值),使输出电流下降
INC A
MOV AD0DAT3, A
PWNEXT2442:
JMP PWNEXT281 ;显示处理
PWNEXT24:
CJNE A, #186, PWNEXT25
PWNEXT25:
JNC PWNEXT26
;电池电压在10.5-14.5(186)之间
MOV A, PWUPSTU
CJNE A, #0H, KPP1
;等于0,属于浮充阶段
JMP KPW3
KPP1:
CJNE A, #0AAH, KPP2
MOV PWUPSTU, #55H
KPP2:
;属于恒流阶段!
SETB V2_C ;打开DC-DC高压电源
;充电电流限制为50A,次级线圈平均电流约为4.2A,采样值约为2.85V
MOV A, PWIOAV
CJNE A, #216, PWNEXT261
PWNEXT261:
JNC PWNEXT262
;小于216
MOV A, AD0DAT3
CJNE A, #13, PWNEXT2621
PWNEXT2621:
JC PWNEXT2622
;大于13,减1(调低DA转换值),使输出电流回升
DEC A
MOV AD0DAT3, A
PWNEXT2622:
JMP PWNEXT281 ;显示处理
PWNEXT262:
CJNE A, #220, PWNEXT263
PWNEXT263:
JNC PWNEXT264
;在216-219之间, 认为合理!(即50A的充电电流)
JMP PWNEXT281 ;显示处理
PWNEXT264:
;充电电流偏大
MOV A, AD0DAT3
CJNE A, #200, PWNEXT2641
PWNEXT2641:
JNC PWNEXT2642
;小于200,加1(调高DA转换值),使输出电流下降
INC A
MOV AD0DAT3, A
PWNEXT2642:
JMP PWNEXT281 ;显示处理
PWNEXT26:
;电池电压在14.5V以上(不是恒压过渡阶段,就是恒压阶段)
SETB V2_C ;打开DC-DC高压电源
CJNE A, #200, PWNEXT27
PWNEXT27:
JC PWNEXT28
;>大于15.5V
;要关闭V2_C控制信号
CLR V2_C ;关闭DC-DC高压电源
JMP KPW3
PWNEXT28:
;电池电压在14.5-15.5之间
MOV A, PWUPSTU
CJNE A, #55H, KPW1
;说明曾经经历过50A恒流充电过程,充电电压应该允许达到14.7V
MOV PWUPSTU, #5AH ;进入恒流到恒压的过渡阶段
JMP PWNEXT281
KPW1:
CJNE A, #5AH, KPW2
;处于恒流到恒压的过渡阶段
MOV A, BATV
CJNE A, #190, KPW21
KPW21:
JNC KPW22
;小于190,即电池电压在14.6-14.7V!属于恒流到恒压的过渡阶段,电流任其变化
MOV AD0DAT3, #85 ;先将DA转换器输出预先置为1.1V
MOV PWTIME, #200 ;充电电流定时时间
JMP PWNEXT281
KPW22:
;达到了14.7V,即应该进入恒压充电阶段
;????
MOV PWUPSTU, #0A5H ;进入恒压充电状态
MOV AD0DAT3, #127 ;先将DA转换器输出预先置为1.65V
;????
JMP PWNEXT281
KPW2:
CJNE A, #0A5H, KPW3
;处于恒压状态充电状态,对充电电流进行判别
MOV A, PWIOAV
CJNE A, #27, KPW31 ;如果切换点不是5A,则可在25-30之间选择
KPW31:
JNC KPW32
;充电电流小于5A!切换充电方式
MOV A, PWTIME
CJNE A, #1, KPW321
KPW321:
JC KPW322
DEC PWTIME ;经历了200*20ms,即4S后才清除标志
SJMP PWNEXT281 ;时间未到,退出!
KPW322:
;时间已经减到0,说明可以切换充电方式!
;????
MOV AD0DAT3, #154 ;先将DA转换器输出预先置为2.0V
;????
MOV PWUPSTU, #00H ;浮充状态
JMP PWNEXT281
KPW32:
;当电流未下降到5A时,还是属于恒压阶段,应对充电电压进行监控!
;输出电压稳定在14.7V(189-192)之间,不满足则调整DA转换值(100-190)
MOV PWTIME, #200 ;充电电流定时时间
MOV A, BATV
CJNE A, #189, KPW33
KPW33:
JNC KPW34
;输出电压小于14.7
;小于189,应该适当提高充电电流(即减小DA转换值)
MOV A, AD0DAT3
CJNE A, #100, KPW341
KPW341:
JC KPW342
;大于100, 应减小DA转换值,使输出电压回升!
DEC A
MOV AD0DAT3, A
KPW342:
SJMP PWNEXT281
KPW34:
CJNE A, #192, KPW35
KPW35:
JNC KPW36
;在190-191之间,合理!
SJMP PWNEXT281
KPW36:
;大于192,应该适当降低充电电流(即提高DA转换值)
MOV A, AD0DAT3
CJNE A, #190, KPW361
KPW361:
JNC KPW362
;增加DA转换值!
INC A
MOV AD0DAT3, A
KPW362:
SJMP PWNEXT281
KPW3:
;此外属于浮充状态!
;属于浮充状态(电压应该稳定在13.8附近),DA转换调整范围在125-210之间
MOV A, BATV
CJNE A, #177, KPW41
KPW41:
JNC KPW42
;在于177(即13.8V),应该调小DA转换值,使电压回升
MOV A, AD0DAT3
CJNE A, #125, KPW421
KPW421:
JC KPW422
DEC A
MOV AD0DAT3, A
KPW422:
SJMP PWNEXT281
KPW42:
CJNE A, #179, KPW43
KPW43:
JNC KPW44
;在177-178之间,合理!
SJMP PWNEXT281
KPW44:
;大于13.8V, 应该调大DA转换值,使电压下降!
MOV A, AD0DAT3
CJNE A, #210, KPW431
KPW431:
JNC KPW432
INC A
MOV AD0DAT3, A
; SJMP PWNEXT281
KPW432:
;索性关闭充电器
; CLR PWON ;关闭充电器
; SJMP PWNEXT282 ;仅仅显示电压
SJMP PWNEXT281
PWNEXT281:
;显示处理
ANL LEDSTU1, #11001100B
ORL LEDSTU1, #00001100B;b3、b2为11(D205常亮)
SETB TEMPIN ;输出高电平
SETB PWON ;启动充电器
MOV A, LEDSTU2
ANL A, #00110000B
CJNE A, #00, PWNEXT282
;b5、b4为00(D203灭),说明不处于电压显示状态
ANL LEDSTU2, #11001100B
ORL LEDSTU2, #00001100B ;处于电流显示状态
;b3、b2置为11(D202常亮),显示充电电流
;为减小显示闪烁性,每1S显示刷新一次
JNB TIME05SB, EXIT
CLR TIME05SB ;清除显示标志
MOV R1, PWIOAV
MOV R4, #01H
MOV R3, #0F4H ;比例因此,500(1F4H)
MOV R2, #220 ;为分母,要完成(R4,R3)*A/R2计算
;入口参数:
;R1为当前读数,R4,R3为比例因子
;R2为分母,计算R1*(R4,R3)/R2
;出口参数:;商在R4\R3中, 余数在R5中。
;已经验证过,正确!
LCALL CAL2 ;计算R1*(R4,R3)/R2
LCALL H16_BCD ;把(R4,R3中的)16进制数(不超过999)转换
;为BCD码,并送显示缓冲区
ANL 2DH, #7FH ;显示小数点
SJMP EXIT
PWNEXT282:
;显示电池电压
ANL LEDSTU2, #11010000B
MOV A, PWUPSTU
CJNE A, #00, PWNEXT283
;为00,表示已经充满
ORL LEDSTU2, #00110000B;b5、b4为11(D203常亮,已满)
SJMP PWNEXT292
PWNEXT283:
;未充满,用慢闪
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪,即在正在充电中)
PWNEXT292:
MOV A, BATV ;显示电压
MOV B, #138 ;乘积因子
MOV R2, #178 ;除数
;入口参数:
;A为当前读数,B为比例因子
;R2为分母,计算A*B/R2
;出口参数:商在A中,余数在R3中;使用了R1
LCALL CAL1 ;多字节除法运算(16位除8位)
LCALL HEXTOBCD ;把存放在A中的进制转化为十进制,并显示缓冲区
ANL 2DH, #7FH ;显示小数点
EXIT:
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
;入口参数:
;R1为当前读数,R4,R3为比例因子
;R2为分母,计算R1*(R4,R3)/R2
;出口参数:商在R4\R3中, 余数在R5中。
;已经验证过,正确!
PROC CAL2 ;计算R1*(R4,R3)/R2
CAL2:
;计算16位乘8位
MOV A, R3 ;取被乘数的低8位
MOV B, R1 ;取乘数
MUL AB
MOV R3, A ;乘积低8位送R3
MOV A, R4 ;取乘数的高8位
MOV R4, B ;乘积高8位送R4
MOV B, R1 ;取乘数
MUL AB ;计算A*C部分
ADD A, R4 ;加AB的高8位
MOV R4, A
MOV A, B ;取成绩的高8位
ADDC A, #0 ;加上进位标志
mov R5, A ;最高8位(即b23-b16)
MOV R1, #16 ;移位16次(已经除数不小于128,即b7为1,
;利用C进行扩展)
LOOP1:
CLR C
MOV A, R3
RLC A
MOV R3, A
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV F0, C
CLR C
SUBB A, R2 ;考虑连同标志位在内相减
ANL C, /F0
JC NEXT1
;够减,取差
MOV R5, A ;送差值
MOV A, R3
ORL A, #01H ;商b0位置1
MOV R3, A
NEXT1:
DJNZ R1, LOOP1
;商在R4\R3中, 余数在R5中。
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
;把(R4,R3中的)16进制数(不超过999)转换为BCD码,并显示
PROC H16_BCD ;把(R4,R3中的)16进制数(不超过999)转换为BCD码,并显示
H16_BCD:
MOV R5, #0 ;百位码
LOOP2:
CLR C
MOV A, R3
SUBB A, #100
MOV R6, A ;暂时保存在R6中
MOV A, R4
SUBB A, #0 ;减进位标志
MOV R7, A ;暂时保存在R7中
JC NEXT2
;够减, 承认差,商加+1
MOV A, R7
MOV R4, A
MOV A, R6
MOV R3, A
INC R5
SJMP LOOP2
NEXT2:
;保留原来的值(由于差已小于99),即实际上只有R3有效
MOV A, R3
MOV B, #10
DIV AB
MOV DPTR, #DPDATA
MOVC A, @A+DPTR
MOV 2DH, A ;笔段码送2DH单元(十位)
MOV A, B ;个位码
MOVC A, @A+DPTR
MOV 2CH, A ;笔段码送2CH单元(个位)
MOV A, R5 ;取百
MOVC A, @A+DPTR
MOV 2EH, A ;笔段码送2EH单元(百位)
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC FMQ1 ;蜂鸣器快闪烁设置(过热)造成
FMQ1:
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #00, NEXT1
;空闲,应该快响
SJMP NEXT2
NEXT1:
CJNE A, #0C0H, EXIT
;11,应该快响
NEXT2:
ANL LEDSTU1, #10111111B
ORL LEDSTU1, #10000000B ;快响
EXIT:
;01,即低压时不改变
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC FMQEND ;关闭蜂鸣器故障音
FMQEND:
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #40H, NEXT1
;慢响,应该关闭
SJMP NEXT2
NEXT1:
CJNE A, #80H, EXIT
;10,即快响,应该关闭
NEXT2:
ANL LEDSTU1, #00111111B
EXIT:
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC DC_ACSTU ;检查逆变状态,管理逆变器
DC_ACSTU:
MOV A, DABA_TC
JNB ACC.7, PWNEXT1
;DC-AC散热片过热
ANL LEDSTU2, #11110000B
ORL LEDSTU2, #00110000B;b5、b4为11(D203快闪)
SJMP PWNEXT21
PWNEXT1:
JNB ACC.3, PWNEXT2
;电池过热
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT21:
CLR V2_C ;关闭DC-DC高压电源
SETB LFACON ;关闭DC-AC
LCALL FMQ1 ;蜂鸣器快响设置(过热)造成
ANL LEDSTU1, #11100000B
ORL LEDSTU1, #00100000B;b5、b4为10(D206快闪)
JMP PWNEXTD2 ;显示电压
;*****软件陷阱
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -