📄 充电器.asm
字号:
INCLUDE"EM78P458.H"
RED == 4
GREEN == 2
CTRL == 1
I_AD == 0X10
U_AD == 0X11
T_AD == 0X12
P_AD == 0X13
FLAG == 0X14
_60MFLAG== 1
_180MFLAG== 2
FNOBATT == 3
FTIME == 4 ;时间超出异常
FABNORMALT== 5 ;温度异常
FABNORMALP== 6 ;电源异常
FABNORMALB== 7 ;电池异常
A_R == 0X15
R3_R == 0X16
B == 0X17
S == 0X18
U_AD1 == 0X19
U_AD2 == 0X1A
U_AD3 == 0X1B
U_AD4 == 0X1C
T_AD1 == 0X1D
T_AD2 == 0X1E
T_AD3 == 0X1F
T_AD4 == 0X20
P_AD1 == 0X21
P_AD2 == 0X22
P_AD3 == 0X23
P_AD4 == 0X24
R_ADL == 0X25
R_ADH == 0X26
C250 == 0X27
C240 == 0X28
PRE_TC == 0X29
RAP_TC == 0X2A
CNT == 0X2B
C1 == 0X2C
D_CNT == 0X2D
I_AD1 == 0X2E
I_AD2 == 0X2F
I_AD3 == 0X30
I_AD4 == 0X31
S_NOBATT ==0 ; 状态定义
S_PRE ==1
S_RAP ==2
S_FULL ==3
S_ERRORE ==4
;4.7405v为参考电压;以4.5V为参考电压,计算下面对应的数值
;_0V3 ==15
_3V0 ==161 ;153
_4V2 ==215; 调试214;225 ;214
_4V4 ==236 ;249
_3V9 ==209 ;221
_0V2 ==10
_0V44 ==23
_0V14 ==7
_0V26 ==13
_2V4 ==129
_2V8 ==150
;========================================================
_43C ==87
_0C ==186
_5V4 ==242
_4V8 ==215
_2V0 ==107
;=========================================================
ORG 0X00
JMP START
ORG 0x08
JMP TINT
;--------------------------
PRE_TABLE: MOV R8,A
SUB A,@4
JBC R3,C
JMP PT_4 ;小于4
MOV A,R8
SUB A,@27
JBS R3,C
JMP PT_27 ;大于27
JMP PT
PT_4: MOV A,@4
MOV R8,A
JMP PT
PT_27: MOV A,@27
MOV R8,A
JMP PT
PT: MOV A,@4
SUB A,R8
ADD PC,A
RETL @2
RETL @3
RETL @4
RETL @6
RETL @7
RETL @8
RETL @9
RETL @10
RETL @11
RETL @12
RETL @15
RETL @17
RETL @15
RETL @16
RETL @17
RETL @18
RETL @20
RETL @23
RETL @24
RETL @25
RETL @26
RETL @27
RETL @28
RETL @29
RETL @23
RETL @24
RETL @25
RETL @26
RETL @27
RAP_TABLE: MOV A,@21
SUB A,R8
JBC R3,C
JMP RT_21 ;小于21
MOV A,R8
SUB A,@69
JBS R3,C
JMP RT_69 ;大于69
JMP RT
RT_21: MOV A,@21
MOV R8,A
JMP RT
RT_69: MOV A,@69
MOV R8,A
JMP RT
RT: MOV A,R8
SUB A,@21
MOV A,@1
ADD PC,A
RETL @1
RETL @1
RETL @1
RETL @1; 2
RETL @1;2
RETL @2
RETL @2;3
RETL @2;3
RETL @2;3
RETL @2;4
RETL @3;4
RETL @3;4
RETL @3;5
RETL @3;5
RETL @4;5
RETL @4;6
RETL @4;6
RETL @4;6
RETL @5;7
RETL @5;7
RETL @5;7
RETL @5;8
RETL @5;8
RETL @6;8
RETL @6;9
RETL @6;9
RETL @6;9
RETL @9
RETL @9
RETL @9
RETL @9
FULL_TABLE: MOV R8,A
SUB A,@3
JBC R3,C
JMP FT_3 ;小于3
MOV A,R8
SUB A,@14
JBS R3,C
JMP FT_14 ;大于14
JMP FT
FT_3: MOV A,@3
MOV R8,A
JMP FT
FT_14: MOV A,@14
MOV R8,A
JMP FT
FT: MOV A,@3
SUB A,R8
ADD PC,A
;RETL @3
;RETL @5
;RETL @7
;RETL @9
;RETL @11
RETL @13
RETL @15
RETL @17
RETL @19
RETL @21
RETL @23
RETL @25
RETL @27
RETL @29
RETL @31
RETL @33
RETL @35
RETL @37
RETL @23
RETL @25
RETL @27
;=======================================================================
;时间中断服务程序
TINT: MOV A_R,A
SWAP A_R
SWAPA R3
MOV R3_R,A
JBS RF,0 ;
JMP INT_RETURN
BC RF,0 ;CLR TCC INT
MOV A,@217 ;重置TCC
MOV TCC,A
DJZ C250
JMP INT_1S
MOV A,@50
MOV C250,A
BC R3,C
JBC FLAG,FTIME
BS R3,C
JBC FLAG,FABNORMALT
BS R3,C
JBC FLAG,FABNORMALP
BS R3,C
JBC FLAG,FABNORMALB
BS R3,C
JBS R3,C ;Z
JMP INT_1S
MOV A,@0B00010000
XOR P5,A ;;灯闪烁
INT_1S: DJZ C240
JMP INT_C
MOV A,@240
MOV C240,A
INT_C: JBC R3,C
JMP INT_RETURN ;异常的时候不做记时处理
MOV A,S
XOR A,@S_PRE
JBS R3,Z
JMP INT_RAP
INT_PRE: INC PRE_TC
MOV A,PRE_TC
SUB A,@60
JBS R3,C
BS FLAG,_60MFLAG
JMP INT_RETURN
INT_RAP: MOV A,S
XOR A,@S_RAP
JBS R3,Z
JMP INT_RETURN
INC RAP_TC
MOV A,PRE_TC
SUB A,@180
JBS R3,C
BS FLAG,_180MFLAG
INT_RETURN: SWAPA R3_R
MOV R3,A
SWAPA A_R
RETI
;--------------------------
START: CALL INIT
CALL AD_PT ;连续采样4次,电源电压,和温度
MAIN: CALL AD_B ;连续4次采样电池电压
MOV A,U_AD
SUB A,@_3V0
JBS R3,C
JMP M_RAP ;大于3V则快充
M_PRE: CALL PRE_CHARGE ;小于3V则慢充
M_RAP: CALL RAP_CHARGE
M_FULL: CALL FULL_CHARGE
JMP MAIN
;==============================================================================================================
;电池电压采样,连续检查4次,并计算平均值,大于2V认为有电池有电池则退出采样
AD_B: MOV A,@4
MOV R7,A
AB: MOV A,@0B00001110
IOW IOCA0
MOV A,@1
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
CALL DELAY1MS
BS ADCON,ADPD ;取样充电
CALL DELAY1MS
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
DJZ R7
JMP AB
MOV A,@U_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV U_AD,A
MOV A,U_AD
SUB A,@_2V0 ;小于2V ,认为没有电池
JBC R3,C
JMP AD_B ;没有电池则返回,继续检查
BC FLAG,FNOBATT;清楚无电池标志
RET
;===============================================================================================
;连续检查4次电源电压,温度电压,并求其平均值
AD_PT: MOV A,@4
MOV R7,A
AP: MOV A,@0B00001110
IOW IOCA0
MOV A,@3
MOV ADCON,A ;选择AD转换通道,采集电源电压
CLRA
IOW IOC90 ;不增益
CALL DELAY1MS
BS ADCON,ADPD ;取样充电
CALL DELAY1MS
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
DJZ R7
JMP AP
MOV A,@P_AD1
MOV R4,A
CALL AVERAGE
MOV A,R_ADL
MOV P_AD,A
MOV A,@4
MOV R7,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -