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)
2025-12-27 10:33 上傳
點擊文件名下載附件
略
;====================延時程序=================================
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
最后附上燒寫文件,
|