找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 560|回复: 6
打印 上一主题 下一主题
收起左侧

自制AT89C2051全自动锂电测容神器

[复制链接]
跳转到指定楼层
楼主
ID:72088 发表于 2025-12-26 08:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
3.7V锂电充电、测容、再充满程序。
元件:AT89C2051(12M)、TM1650显示(时钟数码管)、LM358恒流、TP4056充电、TL431基准

默认通电自动进入程序A:仅充电模式“C”,充满显示100(未接电池时交替显示上次容量"99A9"和时间“99:59”

按下K1键后,进入程序B:充电,测容,再充满模式。
分3个阶段完成。                                                                         
1、充电(显示“C1”);
2、开始恒流放电测容(显示"F1"),测完容量24C02保存;
3、继续充电(显示"C2"),充满时间24C02保存。
过程完成,交替显示容量和时间。

;R7程序状态寄存器,
;默认R7=0只充电"C"
;按键赋值R7=1,先充电“C1”,后恒流"F1",完成后自动赋值R7=2,进入充电2阶段
;R7=2充电"C2"最后阶段。

用TL431检测(180k和36k中断电压3V)
运放横流放电保证精准测容,
这里有500ma放电/1A放电选择引脚,对应改变横流放电电阻R2





显示电路用了拆机的TM1650板




评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72088 发表于 2025-12-27 10:34 | 只看该作者
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

最后附上烧写文件,












回复

使用道具 举报

板凳
ID:23844 发表于 2025-12-28 17:06 | 只看该作者
仰视一下汇编高手
回复

使用道具 举报

地板
ID:430492 发表于 2025-12-29 11:04 | 只看该作者
仰视两下汇编高手!!
回复

使用道具 举报

5#
ID:1028227 发表于 2025-12-31 09:57 来自触屏版 | 只看该作者
老师厉害了,谢谢分享了
回复

使用道具 举报

6#
ID:1028227 发表于 2025-12-31 16:47 来自触屏版 | 只看该作者
师傅是高手
回复

使用道具 举报

7#
ID:16255 发表于 2026-1-6 10:01 | 只看该作者
AT89c2051,多么熟悉的词汇,想当年……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表