3.7V锂电全自动测容程序。最大测100A容量
元件:AT89C2051(12M)、TM1650显示(时钟数码管)、LM358恒流、TP4056充电、TL431基准
默认通电只充电模式“C”,充满显示100(未接电池时显示上次容量"99A9"和时间“99:59”)
按键K1后,分3个阶段完成。
1、充电(显示“C1”);
2、开始恒流放电测容(显示"F1"),测完24C02保存;
3、继续充电(显示"C2"),充满24C02保存。
2025.09.16日通过测试。
; 印制板定义
ADDRESS EQu 1Ah ;256字节地址数
CE_EN BIT P1.7 ;1=充电允许,0=充电禁止
CE_R BIT P1.6 ;低电平是充电模式
CE_G BIT P1.5 ;低电平是满电模式
HENG BIT P1.4 ;1=停止,0=开始恒流放电
ZHI BIT P1.3 ;截止电压检测,高电平锂电有电,低电平锂电放电完
DIO BIT P1.2 ;TM1637数据脚
CLK BIT P1.1 ;TM1637时钟脚(复用)
SCL EQu P1.1 ;24C02,6脚(复用)
SDA EQu P1.0 ;24C02,5脚 */
K0 BIT P3.5 ;1=0.5A;0=1A;恒流选择位
K1 BIT P3.2 ;启动键
ORG 00H
LJMP MAIN
ORG 03H ;外中断按键
LJMP INT_0
ORG 0BH
LJMP T0_0 ;定时器0(锂电容量计时用)
ORG 40H
;=======================程序============================
MAIN:
SETB CE_EN ;默认开机充电
SETB CE_R ;不控制LED
SETB CE_G ;不控制LED
SETB HENG ;禁止恒流
SETB ZHI ;截止电压检测
SETB K0 ;1=0.5A恒流
SETB K1
MOV R7,#0 ;状态0
MOV SP,#60h
LCALL Srt
MOV A,#48H ;数据命令设置48H
LCALL Writebyte
MOV A,#00110001B;设置亮度(001亮度最低) 开显示
LCALL Writebyte
LCALL Stop
A500: ;开机显示500ma放电
JNB K0,A1000
MOV 3AH,#0 ;显示"500"
MOV 3BH,#0
MOV 3CH,#5
MOV 3DH,#16
JMP A1111
A1000: ;开机显示1A放电
MOV 3AH,#0 ;显示"1A0"
MOV 3BH,#10
MOV 3CH,#1
MOV 3DH,#16
A1111:
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
MOV R3,#00H ;为定时器计时做准备
MOV TMOD,#00010001B ;定时器1模式1/定时器0模式1
MOV TL0,#0B0H ;设置定时初值
MOV TH0,#03CH ;设置定时初值50ms
MOV IE,#10000011B ;允许外部中断0、定时器0中断(把中断设置放在读数据之后,防止启动时引发中断数据丢失)
MOV IP,#00000001B ;外中断0优先中断
MOV TCON,#00000001B ;脉冲下降外中断0
CLR A
MOV 2EH,A
MOV 2FH,A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,A ;容量寄存器清零
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A ;时间寄存器清零
MOV ADDRESS,#00h;24C02启始地址
MOV R0,#20h ;数据存放启始单元
MOV R5,#8 ;读出位数
LCALL COPY ;存储器读程序
STA_0:
MOV 3AH,21H
MOV 3BH,#10
MOV 3CH,22H
MOV 3DH,23H
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
MOV 3AH,24H ;低位最右位
MOV 3BH,25H
MOV 3CH,26H
MOV 3DH,27H ;高位最左位
MOV DPTR,#TABD
LCALL DISP
LCALL DELAY_1S
CJNE R7,#0,STA_1
JNB CE_G,STA_0;位为0转移,为1顺执
;--------------------------------------------------------
;以上充满状态,
;-----------------C或C1充电状态--------------------------------
STA_1:
SETB HENG
CJNE R7,#0,STA_10
MOV 3AH,#16 ;显示"C"
MOV 3BH,#16
MOV 3CH,#12
MOV 3DH,#16
JMP STA_11
STA_10:
CJNE R7,#1,STA_2
MOV 3AH,#16 ;显示"C1"
MOV 3BH,#1
MOV 3CH,#12
MOV 3DH,#16
STA_11:
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示
JB CE_G,STA_1 ;位为1转移,为0顺执
LCALL DELAY_10MS
JB CE_G,STA_1 ;位为1转移,为0顺执
CJNE R7,#0,STA_2
STA_12:
MOV 3AH,#0 ;显示"100"表示只充电,切完成。
MOV 3BH,#0
MOV 3CH,#1
MOV 3DH,#16
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
JNB CE_R, STA_1
JMP STA_12 ;只充电程序结束
START_EN:
MOV 3AH,#15 ;显示“0FF”,错误过程
MOV 3BH,#15
MOV 3CH,#0
MOV 3DH,#16
MOV DPTR,#TAB
LCALL DISP
JMP $
;----------------F1恒流测容阶段------------------
STA_2:
CJNE R7,#1,START_EN
CLR CE_EN ;停止充电
SETB TR0 ;运行T0
CLR HENG ;开始放电
STA_20:
MOV 3AH,#16 ;显示"F1"表示放电测容开始了。
MOV 3BH,#1
MOV 3CH,#15
MOV 3DH,#16
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
MOV 3AH,31H ;显示"99A9"容量。
MOV 3BH,#10
MOV 3CH,32H
MOV 3DH,33H
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
JB ZHI,STA_20 ;位为1转移
CLR T0 ;关闭定时
SETB HENG ;禁止恒流
MOV R0,#30h ;R0作为间接寻址
MOV ADDRESS,#00h ;地址清零,从00地址开始写
MOV R5, #4
LCALL XIERU ;写入24C02容量单元
MOV R7,#02H ;赋值2
;--------C2充电计时阶段--------------------------------------------
STA_3:
SETB CE_EN ;开始充电
LCALL DELAY_10MS
JB CE_R,STA_3
SETB T0 ;启动定时器
SETB HENG ;禁止恒流
STA_30:
MOV 3AH,#16 ;显示“C2”,最后阶段充电
MOV 3BH,#2
MOV 3CH,#12
MOV 3DH,#16
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
MOV 3AH,34H ;显示"99:59"充电时间。
MOV 3BH,35H
MOV 3CH,36H
MOV 3DH,37H
MOV DPTR,#TABD
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
JB CE_G,STA_30 ;绿灯未亮继续等待
LCALL DELAY_10MS
JB CE_G,STA_30 ;绿灯未亮继续等待
MOV R0,#34h ;R0作为间接寻址
MOV ADDRESS,#04h ;地址清零,从04地址开始写
MOV R5, #4
LCALL XIERU ;写入24C02充电时间单元
MOV R7,#03H ;赋值3.整个程序完整结束。
STA_4:
MOV 3AH,31H ;显示"99A9"容量。
MOV 3BH,#10 ;A
MOV 3CH,32H
MOV 3DH,33H
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示
MOV 3AH,34H ;显示"99:99"充电时间。
MOV 3BH,35H
MOV 3CH,36H
MOV 3DH,37H
MOV DPTR,#TABD
LCALL DISP
LCALL DELAY_1S
LCALL GUAN ;关闭显示1S,形成闪烁效果
JMP STA_4
;----------关闭显示-------------------
GUAN:
MOV 3AH,#16
MOV 3BH,#16
MOV 3CH,#16
MOV 3DH,#16
MOV DPTR,#TAB
LCALL DISP
LCALL DELAY_1S
RET
;======================中断程序=======================
INT_0:
PUSH ACC
PUSH PSW
LCALL DELAY_10MS
JB K1,INT_EN
CJNE R7,#0,INT_EN
MOV R7,#1
INT_EN:
POP PSW
POP ACC
RETI
;==================24C02读程序==========================
COPY:
S: MOV R2,#10100000B
MOV R4,#10100001B
CALL READ ;调用读程序
MOV @R0,A
INC ADDRESS ;地址加1
INC R0
DJNZ R5,S ;减1后不为0继续返回S
RET
;----------------------------
READ:
LCALL START ;启动总线
MOV A,R2
LCALL SEND
LCALL ACK
JC READ ;无应答,循环
MOV A,ADDRESS
LCALL SEND
LCALL ACK
READ_A:
LCALL START
MOV A,R4
LCALL SEND
LCALL ACK
JC READ_A
RECE:
LCALL RECEIVE
MOV @R0,A
LCALL ACK
LCALL STOP
RET
;======================T0中服程序===========================
T0_0:
PUSH ACC
PUSH PSW
INC R3
CJNE R7,#1,T0_10;不是F1测容阶段转移
;-----------------测容程序-----------------------------
JB K0,T0_1 ;位为1转移(1=0.5A恒流;0=1A恒流)
CJNE R3,#72,T0_2EN ;不足3.6S返回
JMP T0_2
T0_1:
CJNE R3,#144,T0_2EN ;不足7.2S返回
T0_2:
MOV R3,#00H
INC 2Fh ;1ma
MOV A,2Fh
CJNE A,#10,EXIT
MOV 2Fh,#00H
INC 30h ;10ma
MOV A,30h
CJNE A,#10,EXIT
MOV 30h,#00H
INC 31h ;100ma
MOV A,31h
CJNE A,#10,EXIT
MOV 31h,#00H
INC 32h ;1a
MOV A,32h
CJNE A,#10,EXIT
MOV 32h,#00H
INC 33h ;10a
MOV A,33h
CJNE A,#10,EXIT
MOV 33h,#00H
T0_2EN:
JMP EXIT
;------------------计时程序--------------------------
T0_10:
CJNE R7,#2,EXIT;不等转移
CJNE R3,#20,EXIT ;不足1S返回(50MS*20=1S)计时模式
MOV R3,#00H
INC 2Eh ;秒位
MOV A,2Eh
CJNE A,#10,EXIT
MOV 2Eh,#00H
INC 2Fh ;10秒位
MOV A,2Fh
CJNE A,#06,EXIT
MOV 2Fh,#00H
INC 34h ;分
MOV A,34h
CJNE A,#10,EXIT
MOV 34h,#00H
INC 35h ;10分位
MOV A,35h
CJNE A,#06H,EXIT
MOV 35h,#00H
INC 36h ;小时个位
MOV A,36h
CJNE A,#10,EXIT
MOV 36h,#00H
INC 37h ;小时十位
MOV A,37h
CJNE A,#10,EXIT
MOV 37h,#00H
JMP EXIT
EXIT:
MOV TL0,#0B0H ;设置定时初值
MOV TH0,#03CH ;设置定时初值
CLR TF0
POP PSW
POP ACC
RETI
;=================写入程序===================
XIERU:
MOV R6, #10100000B
WRITE:
LCALL START
MOV A, R6
LCALL SEND
LCALL ACK
JC WRITE
MOV A,ADDRESS
LCALL SEND
LCALL ACK
MOV A, @R0 ;
LCALL SEND
LCALL ACK
LCALL STOP
INC R0
INC ADDRESS
DJNZ R5,WRITE ;减1后不为0转移,存储6位
RETI
;=========总线启动==========
START:
SETB SCL
SETB SDA
NOP
; NOP
CLR SDA
NOP
; NOP
CLR SCL
RET
;-------------总线停止------------
STOP:
CLR SDA
NOP
; NOP
SETB SCL
NOP
; NOP
SETB SDA
RET
;=============应答============
ACK:
SETB SDA
NOP
; NOP
SETB SCL
JB SDA, ACK_0
CLR C
SJMP ACK_1
ACK_0:
SETB C
ACK_1:
; NOP
NOP
CLR SCL
RET
;==============发送==========
SEND:
MOV B, #08h
SEND_1:
RLC A
MOV SDA, C
SETB SCL
NOP
; NOP
CLR SCL
DJNZ B, SEND_1
RET
;==============接收=========
RECEIVE:
MOV B, #08h
CLR A
SETB SDA
RECEIVE_1:
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B, RECEIVE_1
RET
;===================显示程序================================
DISP:
锂电自动测容.rar
(1.2 KB, 下载次数: 0)
略
;====================延时程序=================================
DELAY_10MS:
MOV 6EH,#25
D1: MOV 6FH,#200
DJNZ 6FH,$
DJNZ 6EH,D1
RET
DELAY_1S:
MOV 6DH,#50
D2: MOV 6EH,#100
D3: MOV 6FH,#100
DJNZ 6FH,$
DJNZ 6EH,D3
DJNZ 6DH,D2
RET
;====================TM1650字形表=============================
;显示容量,不用小数点
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9
DB 77H,7CH,39H,5EH,79H,71H;A-F
DB 00H,40H ;不显示,负号
;显示充电时间,用小数点
TABD: ;带点显示
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;0-9
DB 0F7H,0FCH,0B9H,0DEH,0F9H,0F1H;A-F
DB 00H,0C0H ;不显示,负号
;=============================================================
END
最后附上烧写文件,
|