📄 充电器.asm
字号:
MOV A,I_AD ;送数,查表
CALL PRE_TABLE
MOV D_CNT,A
PCI: CALL DELAY1MS ;底电平时间
DJZ D_CNT
JMP PCI
MOV A,@0B00001110 ;取电池电压
IOW IOCA0
MOV A,@1
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
;CALL DELAY1MS
BS ADCON,ADPD ;取样充电
;CALL DELAY2MS
BS ADCON,ADRUN
JBC ADCON,ADRUN
JMP $-1
BC RF,ADIF
BC ADCON,ADPD ;停止采样
MOV A,U_AD3
MOV U_AD4,A
MOV A,U_AD2
MOV U_AD3,A
MOV A,U_AD1
MOV U_AD2,A
MOV A,ADDATA
MOV U_AD1,A
MOV A,@P_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV P_AD,A
SUB A,@_5V4
JBC R3,C
JMP PRE_NORMAL
PABNORMALP:
BS FLAG,FABNORMALP
JMP RE_PC ;
PABNORMALT:
BS FLAG,FABNORMALT
JMP RE_PC
PRE_NORMAL:BC FLAG,FABNORMALP ;清异常标志
MOV A,@T_AD1 ;电压正常
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV T_AD,A
SUB A,@_43C ; 87(_43c)<t<186(_0c)
JBC R3,C
JMP PABNORMALT ;温度高于43度
MOV A,T_AD
SUB A,@_0C
JBS R3,C
JMP PABNORMALT ;小于186,即大于0度则返回
BC FLAG,FABNORMAlT
MOV A,@U_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV U_AD,A
SUB A,@_4V2
JBS R3,C
RET ;大于4.2则充好,退出
PRE_SHOW:BS P5,RED ;指示
BC P5,GREEN
MOV A,U_AD
SUB A,@_2V0
JBS R3,C
JMP PS0
BS FLAG,FNOBATT ;无电池
BC P5,RED ;清除指示
BC P5,GREEN
RET
PS0: MOV A,U_AD
SUB A,@_3V0 ;3.0V
JBS R3,C
RET ;>3.0V 快充结束
JBC FLAG,_60MFLAG ;<3.0V
RET
JMP REPEAD_PRE ;时间没到重新充电
;=======================================================================================
;================================================================
;快速充电子程序,
;程序结束表示快充好,或电池拿走,置标志无电池标志F_NOBATT
RAP_CHARGE:
JBC FLAG,FNOBATT
RET
REPEAD_RAP:BS P5,CTRL ;控制高电平,电池恒流调整
RE_RC: MOV A,CNT ;3个轮流采样
XOR A,@0
JBS R3,Z
JMP RC_1
MOV A,@0B00001110
IOW IOCA0
MOV A,@0 ;采集0.5上的电压
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
CALL DELAY1MS
BS ADCON,ADPD ;取样充电
CALL DELAY2MS
BS ADCON,ADRUN
JBC ADCON,ADRUN
JMP $-1
BC RF,ADIF
BC ADCON,ADPD ;停止采样
MOV A,I_AD3 ;保存4个FIFO
MOV I_AD4,A
MOV A,I_AD2
MOV I_AD3,A
MOV A,I_AD1
MOV I_AD2,A
MOV A,ADDATA
MOV I_AD1,A
MOV A,ADDATA
MOV I_AD,A
MOV A,@1
MOV CNT,A
JMP RC_ISLOW
RC_1: MOV A,CNT ;3个轮流采样
XOR A,@1
JBS R3,Z
JMP RC_2
MOV A,@0B00001110
IOW IOCA0
MOV A,@2 ;采集温度
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
CALL DELAY1MS
BS ADCON,ADPD ;取样充电
CALL DELAY2MS
BS ADCON,ADRUN
JBC ADCON,ADRUN
JMP $-1
BC RF,ADIF
BC ADCON,ADPD ;停止采样
MOV A,T_AD3
MOV T_AD4,A
MOV A,T_AD2
MOV T_AD3,A
MOV A,T_AD1
MOV T_AD2,A
MOV A,ADDATA
MOV T_AD1,A
MOV A,@2
MOV CNT,A
JMP RC_ISLOW
RC_2: MOV A,@0B00001110
IOW IOCA0
MOV A,@3 ;第3个通道,采集电源电压
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
CALL DELAY1MS
BS ADCON,ADPD ;取样充电
CALL DELAY2MS
BS ADCON,ADRUN
JBC ADCON,ADRUN
JMP $-1
BC RF,ADIF
BC ADCON,ADPD ;停止采样
MOV A,P_AD3
MOV P_AD4,A
MOV A,P_AD2
MOV P_AD3,A
MOV A,P_AD1
MOV P_AD2,A
MOV A,ADDATA
MOV P_AD1,A
MOV A,@0
MOV CNT,A
RC_ISLOW: BC P5,CTRL ;给底电平
MOV A,I_AD ;送数,查表
CALL RAP_TABLE
MOV D_CNT,A
RCI: CALL DELAY200US ;底电平时间
DJZ D_CNT
JMP RCI
MOV A,@0B00001110 ;取电池电压
IOW IOCA0
MOV A,@1
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
;CALL DELAY1MS
BS ADCON,ADPD ;取样充电
;CALL DELAY2MS
BS ADCON,ADRUN
JBC ADCON,ADRUN
JMP $-1
BC RF,ADIF
BC ADCON,ADPD ;停止采样
MOV A,U_AD3
MOV U_AD4,A
MOV A,U_AD2
MOV U_AD3,A
MOV A,U_AD1
MOV U_AD2,A
MOV A,ADDATA
MOV U_AD1,A
MOV A,@P_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV P_AD,A
SUB A,@_5V4
JBC R3,C
JMP POW_NORMAL
ABNORMALT:
BS FLAG,FABNORMALT
JMP RE_RC ;
ABNORMALP:
BS FLAG,FABNORMALP
JMP RE_RC ;
POW_NORMAL:BC FLAG,FABNORMALP
MOV A,@T_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV T_AD,A
SUB A,@_43C ; 87(_43c)<t<186(_0c)
JBC R3,C
JMP ABNORMALT ;温度高于43度
MOV A,T_AD
SUB A,@_0C
JBS R3,C
JMP ABNORMALT ;小于186,即大于0度则返回
BC FLAG,FABNORMALT
MOV A,@U_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV U_AD,A
SUB A,@_4V2
JBS R3,C
RET ;大于4.2则充好,退出
RAP_SHOW:BS P5,RED ;指示
BC P5,GREEN
MOV A,U_AD
SUB A,@_2V0
JBS R3,C
JMP RS0
BS FLAG,FNOBATT ;无电池
BC P5,RED ;清除指示
BC P5,GREEN
RET
RS0: MOV A,U_AD
SUB A,@_3V9 ;3.9V
JBS R3,C
JMP RS ;>3.9V
JBS FLAG,_180MFLAG ;<3.9V
JMP REPEAD_RAP
;BC FLAG,_180MFLAG
BS FLAG,FTIME ;时间到180分钟还不到3.0V认为出错
JMP RE_RC ;
RS: JBS FLAG,_180MFLAG
JMP REPEAD_RAP ;时间没到
;BC FLAG,_180MFLAG
RET ;>3.9V,且时间到,认为充好
;===============================================================
;取平均数,将采集到的4个电压值平均,
;入口:开始地址,给R4,出口R_ADL(R_ADH计算中,暂存高位)中
AVERAGE: CLRA
MOV R_ADL,A
MOV R_ADH,A
MOV A,@4
MOV R7,A
A0: MOV A,R0
ADD R_ADL,A
JBS R3,C
JMP A1
MOV A,@1
ADD R_ADH,A
A1: INC R4
DJZ R7
JMP A0
RRC R_ADH
RRC R_ADL
RRC R_ADH
RRC R_ADL
RET
DELAY2MS: MOV A,@100
MOV C1,A
CALL DELAY20US
DJZ C1
JMP $-2
RET
;=======================================================
;准确的1MS
DELAY1MS: MOV A,@50
MOV C1,A
CALL DELAY20US
DJZ C1
JMP $-2
RET
DELAY200US: MOV A,@10
MOV C1,A
CALL DELAY20US
DJZ C1
JMP $-2
RET
;=========================================================================
DELAY20US: WDTC
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -