📄 89lpc933(修改充电过程).asm
字号:
MOV A, LEDTIME
MOV B, #10
DIV AB
MOV A, B
CJNE A, #0, LEDNEXT3
;1s时间到标志
;处理录码时间
MOV A, LUTIME
CJNE A, #0, LUMNEXT1
SJMP LUMEXIT
LUMNEXT1:
DEC LUTIME ;录码时间减1
LUMEXIT:
CPL TIME05S ;1S时间到标志取反
SETB LEDRUN ;允许LED执行指令
SJMP LEDEXIT
LEDNEXT3:
CPL TIME01S ;0.1S时间到标志取反
SETB LEDRUN ;允许LED执行指令
LEDEXIT:
JB KEY2STU, NODISPEXIT
;在关闭状态下执行,否则录码灯无效
JNB LEDRUN, NODISPEXIT
LCALL LEDROC ;指示灯及鸣响处理
CLR LEDRUN
NODISPEXIT:
;0.5S时间到标志检测
MOV A, LEDTIME
MOV B, #10
DIV AB
MOV A, B
CJNE A, #0, TIME05SEXND
SETB TIME05SB ;充电状态下电流显示0.5S时间到标志
TIME05SEXND:
JNB LVTIMEB, LVEXIT
DJNZ LVTIME, LVEXIT
;1s延迟时间到,关闭逆变部分
CLR V2_C ;切断DC-DC部分驱动电源
SETB LFACON ;关闭DC-AC部分启动信号
CLR LVTIMEB ;取消标志信号
MOV A, ACSTU
JB ACC.3, LVEXIT
;没有交流,即不处于充电状态,关闭主机!
CLR KEY2STU ;即不处于充电状态,关闭主机!
LVEXIT:
;处理蜂鸣器时间
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #40H, BETTNEXT1
;为01态,即慢响
DJNZ TIMEBELL, BETTEXIT
MOV TIMEBELL, #10 ;1S(响1S-停1S)
CPL BELL ;取反
SJMP BETTEXIT
BETTNEXT1:
CJNE A, #80H, BETTNEXT2
;为10态,即快响
DJNZ TIMEBELL, BETTEXIT
MOV TIMEBELL, #3 ;0.3S(响0.3S-停0.3S)
CPL BELL ;取反
SJMP BETTEXIT
BETTNEXT2:
CJNE A, #0C0H, BETTNEXT3
;为11态,单音
DJNZ TIMEBELL, BETTEXIT
BETTNEXT3:
;肯定为00态,不动作
MOV TIMEBELL, #3
SETB BELL ;关闭蜂鸣器
ANL LEDSTU1, #3FH ;清除状态
BETTEXIT:
;上电延迟时间处理
mov A, PUTIME
CJNE A, #0, PUNEXT1
SJMP PUEXIT
PUNEXT1:
DJNZ PUTIME, PUEXIT
PUEXIT:
;过流、过载延迟关闭
JNB ACIO_OV, ACIOEXIT
MOV A, ACIO_TIME
CJNE A, #0, ACIOEXIT
DJNZ ACIO_TIME, ACIOEXIT
;延迟时间到,要关闭DC-AC输出
SETB LFACON ;关闭DC-AC输出
ACIOEXIT:
TMEXIT:
;20ms判别
MOV A, TIMEB
MOV B, #20
DIV AB
MOV A, B ;取余数
CJNE A, #0, TIME20MSE
SETB TIME_20ms ;20ms定时时间到标志
SETB TIME_20msp ;充电器管理时间标志
;对LFAC启动延迟时间进行检查
MOV A, LFACTIME
CJNE A, #0, LFACWAIT1
SJMP TIME20MSE
LFACWAIT1:
DEC LFACTIME
TIME20MSE:
ANL RTCCON, #7FH ;清楚RTC中断标志
POP DPL
POP DPH
POP B
POP ACC
POP PSW
RETI
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
;入口参数:
;A为当前读数,B为比例因子
;R2为分母,计算A*B/R2
;出口参数:商在A中,余数在R3中;使用了R1
PROC CAL1 ;多字节除法运算(16位除8位)
CAL1:
MUL AB ;已经除数不小于128
XCH A, B ;A、B交换,即高8位在A中,低8位在B
MOV R3, A
MOV R1, #8 ;移位8次(已经除数不小于128,即b7为1,
;利用C进行扩展)
LOOP1:
CLR C
MOV A, B
RLC A
MOV B, A
MOV A, R3
RLC A
MOV R3, A
MOV F0, C
CLR C
SUBB A, R2 ;考虑连同标志位在内相减
ANL C, /F0
JC NEXT1
;够减,取差
MOV R3, A ;送差值
ORL B, #01H ;b0位置1
NEXT1:
DJNZ R1, LOOP1
MOV A, B ;商在A中,余数在R3中
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC RXDPROC ;串行接收中断
RXDPROC:
PUSH PSW
PUSH ACC
MOV PSW, #10H ;用2区(与基准时间RTC同级)
; SETB RS1
; CLR RS0
JB RI, NEXT1
;不是串行接收中断
SJMP EXIT
NEXT1:
;校验
MOV A, SBUF ;读接收数据
MOV C, RB8
ANL C, /P
MOV F0, C
MOV C, P
ANL C, /RB8
ORL C, F0
JNC NEXT2
;相异,奇偶校验错误
MOV RXDSP, #0 ;复位接收指针
SJMP EXIT
NEXT2:
CJNE A, #0EAH, NEXT3
;帧首标志(启动状态)
MOV RXDSP, #0 ;复位接收指针
SJMP NEXT5
NEXT3:
CJNE A, #0E5H, NEXT4
;帧首标志(停止状态)
MOV RXDSP, #0 ;复位接收指针
SJMP NEXT5
NEXT4:
;中间帧
INC RXDSP ;指向下字节
NEXT5:
MOV A, #RXDBUF
ADD A, RXDSP
MOV R0, A
MOV @R0, SBUF ;放数据
;判别指针大小
MOV A, RXDSP
CJNE A, #4, NEXT6
NEXT6:
JC EXIT
;已经接收了5个字节,停止接收处理数据
MOV RXDBUFEV, #0AAH ;串行接收缓冲区数据有效
CLR REN ;停止接收
EXIT:
ANL SCON, #0FCH ;清除接收中断
POP ACC
POP PSW
RETI
END
;根据交流状态(11-交流存在,01-市电刚消失,10-01状态的过渡态)
;(00-无交流状态)
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC PWON_PROC ;充电器启动处理(检查充电器的状态,并根据主机开关启动)
PWON_PROC:
MOV A, PWONSTU
JNB ACC.3, PWNEXT1
;充电器过热
ANL LEDSTU2, #11100000B
ORL LEDSTU2, #00100000B;b5、b4为10(D203快闪)
SJMP PWNEXT20
PWNEXT1:
MOV A, DABA_TC
JNB ACC.3, PWNEXT2
;电池过热
CLR V2_C ;关闭DC-DC高压电源
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT20:
MOV LEDSTU1, #10001000B;b3、b2为10(D205快闪)
;b7、b6为10(短周期提示音)
CLR PWON ;关闭充电器
JMP PWNEXT292
PWNEXT2:
;根据电池电压范围设置状态及启动
MOV A, BATV
CJNE A, #116, PWNEXT21
PWNEXT21:
JNC PWNEXT22
;电池电压小于9V,充电器处于低压保护状态!
CLR PWON ;关闭充电器
MOV PWUPSTU, #00
CLR V2_C ;关闭DC-DC高压电源
ANL LEDSTU1, #01000100B
ORL LEDSTU1, #01000100B;b3、b2为01(D205慢闪)
;b7、b6为01(长周期提示音)
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
JMP PWNEXT292
PWNEXT22:
CJNE A, #135, PWNEXT23
PWNEXT23:
JNC PWNEXT24
;电池电压在在9-10.5(即135)之间
CLR V2_C ;关闭DC-DC高压电源
MOV PWUPSTU, #0AAH ;表示处于小电流恒流状态
;充电电流限制为10A,次级线圈平均电流约为1A,采样值约为1V
;????
MOV AD0DAT3, #193 ;先将DA转换器输出预先置为2.5V
;????
SJMP PWNEXT261
PWNEXT24:
CJNE A, #186, PWNEXT25
PWNEXT25:
JNC PWNEXT26
;电池电压在10.5-14.5(186)之间
SETB V2_C ;打开DC-DC高压电源
;充电电流限制为50A,次级线圈平均电流约为4.2A,采样值约为2.85V
;????
MOV PWUPSTU, #55H ;处于恒流充电状态
MOV AD0DAT3, #78 ;先将DA转换器输出预先置为1.0V
;????
PWNEXT261:
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪,正在充电中)
SJMP PWNEXT291
PWNEXT26:
; ;电池电压在14.5V以上
SETB V2_C ;打开DC-DC高压电源
CJNE A, #200, PWNEXT27
PWNEXT27:
JC PWNEXT28
;>大于15.5V
;要关闭V2_C控制信号
CLR V2_C ;关闭DC-DC高压电源
PWNEXT28:
;电池电压在14.5-15.5之间
;正常(电池电压在14.7以上,采用浮充)
;充电电流为可变,输出电压要稳定13.8V
;????
MOV PWUPSTU, #00H ;处于浮充状态
MOV AD0DAT3, #154 ;先将DA转换器输出预先置为2.0V
;????
ANL LEDSTU2, #11110000B
ORL LEDSTU2, #00110000B;b5、b4为11(D203常亮,已满)
PWNEXT291:
ANL LEDSTU1, #11001100B
ORL LEDSTU1, #00001100B;b3、b2为11(D205常亮)
SETB PWON ;启动充电器
SETB TEMPIN ;输出高电平
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 ;显示小数点
PWNEXT29:
RET
END
;*****软件陷阱开始*******
NOP
NOP
ORL AUXR1, #08H ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******
PROC PWON_GL ;充电器管理(检查充电器的状态,并根据主机开关启动)
PWON_GL:
MOV A, PWONSTU
JNB ACC.3, PWNEXT1
;充电器过热
ANL LEDSTU2, #11100000B
ORL LEDSTU2, #00100000B;b5、b4为10(D203快闪)
SJMP PWNEXT20
PWNEXT1:
MOV A, DABA_TC
JNB ACC.3, PWNEXT2
;电池过热
CLR V2_C ;关闭DC-DC高压电源
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT20:
LCALL FMQ1 ;蜂鸣器快响设置(过热)造成
ANL LEDSTU1, #11001000B
ORL LEDSTU1, #00001000B;b3、b2为10(D205快闪)
CLR PWON ;关闭充电器
JMP PWNEXT292
PWNEXT2:
;检查有无过流?
;250以上认为过流;
;220(对应的取样电压2.85V)对应50A充电电流;
;66(对应的取样电压0.855V)对应15A充电电流;
;44(对应的取样电压0.57V)对应10A充电电流;
;25(对应的取样电压0.32V)对应5A充电电流;
;????
MOV A, PWIOAV
CJNE A, #250, PWNEXT3
PWNEXT3:
JC PWNEXT4
;????
;过流
ANL LEDSTU2, #11001000B
ORL LEDSTU2, #00001000B;b3、b2为01(D202快闪)
MOV LEDSTU1, #10001100B;b3、b2为11(D205常亮)
;b7、b6为10(短周期提示音)
CLR PWON ;关闭充电器
MOV 2CH, #0FFH ;关闭数码管
MOV 2DH, #0FFH ;关闭数码管
MOV 2EH, #0FFH ;关闭数码管
JMP EXIT
PWNEXT4:
;根据电池电压范围设置状态及启动
MOV A, BATV
CJNE A, #116, PWNEXT21
PWNEXT21:
JNC PWNEXT22
;电池电压小于9V,充电器处于低压保护状态!
CLR PWON ;关闭充电器
MOV PWUPSTU, #00
CLR V2_C ;关闭DC-DC高压电源
ANL LEDSTU1, #01000100B
ORL LEDSTU1, #01000100B;b3、b2为01(D205慢闪)
;b7、b6为01(长周期提示音)
ANL LEDSTU2, #11010000B
MOV LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
JMP PWNEXT292
PWNEXT22:
LCALL FMQEND ;关闭蜂鸣器故障音
;根据电池电压决定调整DA转换输出
MOV A, BATV
CJNE A, #135, PWNEXT23
PWNEXT23:
JNC PWNEXT24
;电池电压在在9-10.5(即135)之间
CLR V2_C ;关闭DC-DC高压电源
;充电电流限制为10A,次级线圈平均电流约为1A,采样值约为0.57V
MOV A, PWIOAV
CJNE A, #43, PWNEXT241
PWNEXT241:
JNC PWNEXT242
;小于43
MOV A, AD0DAT3
CJNE A, #150, PWNEXT2421
PWNEXT2421:
JC PWNEXT2422
;大于150,减1(调低DA转换值),使输出电流回升
DEC A
MOV AD0DAT3, A
PWNEXT2422:
JMP PWNEXT281 ;显示处理
PWNEXT242:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -