⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 89lpc933(修改充电过程).asm

📁 用pic单片机实现的对锂电池冲电的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:

    CJNE A, #46, PWNEXT243
PWNEXT243:
    JNC PWNEXT244
    ;在43-45之间, 认为合理!(即10A的充电电流)
    JMP PWNEXT281          ;显示处理
PWNEXT244:
    ;充电电流偏大
    MOV A, AD0DAT3
    CJNE A, #250, PWNEXT2441
PWNEXT2441:
    JNC PWNEXT2442
    ;小于250,加1(调高DA转换值),使输出电流下降
    INC A
    MOV AD0DAT3, A
PWNEXT2442:
    JMP PWNEXT281          ;显示处理

PWNEXT24:

    CJNE A, #186, PWNEXT25
PWNEXT25:
    JNC PWNEXT26
    ;电池电压在10.5-14.5(186)之间
    MOV A, PWUPSTU
    CJNE A, #0H, KPP1
    ;等于0,属于浮充阶段
    JMP KPW3
KPP1:
    CJNE A, #0AAH, KPP2
    MOV PWUPSTU, #55H
KPP2:
    ;属于恒流阶段!

    SETB V2_C               ;打开DC-DC高压电源
    ;充电电流限制为50A,次级线圈平均电流约为4.2A,采样值约为2.85V
    MOV A, PWIOAV
    CJNE A, #216, PWNEXT261
PWNEXT261:
    JNC PWNEXT262
    ;小于216
    MOV A, AD0DAT3
    CJNE A, #13, PWNEXT2621
PWNEXT2621:
    JC PWNEXT2622
    ;大于13,减1(调低DA转换值),使输出电流回升
    DEC A
    MOV AD0DAT3, A
PWNEXT2622:
    JMP PWNEXT281          ;显示处理
PWNEXT262:
    CJNE A, #220, PWNEXT263
PWNEXT263:
    JNC PWNEXT264
    ;在216-219之间, 认为合理!(即50A的充电电流)
    JMP PWNEXT281          ;显示处理
PWNEXT264:
    ;充电电流偏大
    MOV A, AD0DAT3
    CJNE A, #200, PWNEXT2641
PWNEXT2641:
    JNC PWNEXT2642
    ;小于200,加1(调高DA转换值),使输出电流下降
    INC A
    MOV AD0DAT3, A
PWNEXT2642:
    JMP PWNEXT281         ;显示处理

PWNEXT26:
    ;电池电压在14.5V以上(不是恒压过渡阶段,就是恒压阶段)
    SETB V2_C               ;打开DC-DC高压电源


    CJNE A, #200, PWNEXT27
PWNEXT27:
    JC PWNEXT28
    ;>大于15.5V
    ;要关闭V2_C控制信号
    CLR V2_C              ;关闭DC-DC高压电源
    JMP  KPW3
PWNEXT28:
    ;电池电压在14.5-15.5之间

    MOV A, PWUPSTU
    CJNE A, #55H, KPW1
    ;说明曾经经历过50A恒流充电过程,充电电压应该允许达到14.7V
    MOV PWUPSTU, #5AH    ;进入恒流到恒压的过渡阶段
    JMP PWNEXT281
KPW1:
    CJNE A, #5AH, KPW2
    ;处于恒流到恒压的过渡阶段
    MOV A, BATV
    CJNE A, #190, KPW21
KPW21:
    JNC KPW22
    ;小于190,即电池电压在14.6-14.7V!属于恒流到恒压的过渡阶段,电流任其变化
    MOV AD0DAT3, #85           ;先将DA转换器输出预先置为1.1V
    MOV PWTIME, #200           ;充电电流定时时间
    JMP PWNEXT281
KPW22:
    ;达到了14.7V,即应该进入恒压充电阶段
    ;????
    MOV PWUPSTU, #0A5H           ;进入恒压充电状态
    MOV AD0DAT3, #127            ;先将DA转换器输出预先置为1.65V
    ;????
    JMP PWNEXT281
KPW2:
    CJNE A, #0A5H, KPW3
    ;处于恒压状态充电状态,对充电电流进行判别

    MOV A, PWIOAV
    CJNE A, #27, KPW31          ;如果切换点不是5A,则可在25-30之间选择
KPW31:
    JNC KPW32
    ;充电电流小于5A!切换充电方式
    MOV A, PWTIME
    CJNE A, #1, KPW321
KPW321:
    JC KPW322
    DEC PWTIME                  ;经历了200*20ms,即4S后才清除标志
    SJMP PWNEXT281              ;时间未到,退出!
KPW322:
    ;时间已经减到0,说明可以切换充电方式!
    ;????
    MOV AD0DAT3, #154           ;先将DA转换器输出预先置为2.0V
    ;????
    MOV PWUPSTU, #00H           ;浮充状态
    JMP PWNEXT281
KPW32:
    ;当电流未下降到5A时,还是属于恒压阶段,应对充电电压进行监控!
    ;输出电压稳定在14.7V(189-192)之间,不满足则调整DA转换值(100-190)
    MOV PWTIME, #200           ;充电电流定时时间
    MOV A, BATV
    CJNE A, #189, KPW33
KPW33:
    JNC KPW34
    ;输出电压小于14.7
    ;小于189,应该适当提高充电电流(即减小DA转换值)
    MOV A, AD0DAT3
    CJNE A, #100, KPW341
KPW341:
    JC KPW342
    ;大于100, 应减小DA转换值,使输出电压回升!
    DEC A
    MOV AD0DAT3, A
KPW342:
    SJMP PWNEXT281
KPW34:
    CJNE A, #192, KPW35
KPW35:
    JNC KPW36
    ;在190-191之间,合理!
    SJMP PWNEXT281
KPW36:
    ;大于192,应该适当降低充电电流(即提高DA转换值)
    MOV A, AD0DAT3
    CJNE A, #190, KPW361
KPW361:
    JNC KPW362
    ;增加DA转换值!
    INC A
    MOV AD0DAT3, A
KPW362:
    SJMP PWNEXT281

KPW3:
    ;此外属于浮充状态!
    ;属于浮充状态(电压应该稳定在13.8附近),DA转换调整范围在125-210之间
    MOV A, BATV
    CJNE A, #177, KPW41
KPW41:
    JNC KPW42
    ;在于177(即13.8V),应该调小DA转换值,使电压回升
    MOV A, AD0DAT3
    CJNE A, #125, KPW421
KPW421:
    JC KPW422
    DEC A
    MOV AD0DAT3, A
KPW422:
    SJMP PWNEXT281
KPW42:
    CJNE A, #179, KPW43
KPW43:
    JNC KPW44
    ;在177-178之间,合理!
    SJMP PWNEXT281
KPW44:
   ;大于13.8V, 应该调大DA转换值,使电压下降!
    MOV A, AD0DAT3
    CJNE A, #210, KPW431
KPW431:
    JNC KPW432
    INC A
    MOV AD0DAT3, A
;    SJMP PWNEXT281
KPW432:
    ;索性关闭充电器
;    CLR PWON              ;关闭充电器
;    SJMP PWNEXT282        ;仅仅显示电压
    SJMP PWNEXT281


PWNEXT281:
    ;显示处理

    ANL LEDSTU1, #11001100B
    ORL LEDSTU1, #00001100B;b3、b2为11(D205常亮)
    SETB TEMPIN            ;输出高电平
    SETB PWON              ;启动充电器

    MOV A, LEDSTU2
    ANL A, #00110000B
    CJNE A, #00, PWNEXT282
    ;b5、b4为00(D203灭),说明不处于电压显示状态
    ANL LEDSTU2, #11001100B
    ORL LEDSTU2, #00001100B     ;处于电流显示状态
    ;b3、b2置为11(D202常亮),显示充电电流

    ;为减小显示闪烁性,每1S显示刷新一次
    JNB TIME05SB, EXIT
    CLR TIME05SB            ;清除显示标志
    MOV R1, PWIOAV
    MOV R4, #01H
    MOV R3, #0F4H           ;比例因此,500(1F4H)
    MOV R2, #220            ;为分母,要完成(R4,R3)*A/R2计算
    ;入口参数:
    ;R1为当前读数,R4,R3为比例因子
    ;R2为分母,计算R1*(R4,R3)/R2
    ;出口参数:;商在R4\R3中, 余数在R5中。
    ;已经验证过,正确!
    LCALL CAL2             ;计算R1*(R4,R3)/R2
    LCALL H16_BCD          ;把(R4,R3中的)16进制数(不超过999)转换
                           ;为BCD码,并送显示缓冲区
    ANL 2DH, #7FH          ;显示小数点
    SJMP EXIT
PWNEXT282:
    ;显示电池电压
    ANL LEDSTU2, #11010000B
    MOV A, PWUPSTU
    CJNE A, #00, PWNEXT283
    ;为00,表示已经充满
    ORL LEDSTU2, #00110000B;b5、b4为11(D203常亮,已满)
    SJMP PWNEXT292
PWNEXT283:
    ;未充满,用慢闪
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪,即在正在充电中)


PWNEXT292:
    MOV A, BATV            ;显示电压
    MOV B, #138            ;乘积因子
    MOV R2, #178           ;除数
    ;入口参数:
    ;A为当前读数,B为比例因子
    ;R2为分母,计算A*B/R2
    ;出口参数:商在A中,余数在R3中;使用了R1
    LCALL CAL1             ;多字节除法运算(16位除8位)
    LCALL HEXTOBCD         ;把存放在A中的进制转化为十进制,并显示缓冲区
    ANL 2DH, #7FH          ;显示小数点
EXIT:
    RET
END

;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

;入口参数:
;R1为当前读数,R4,R3为比例因子
;R2为分母,计算R1*(R4,R3)/R2
;出口参数:商在R4\R3中, 余数在R5中。
;已经验证过,正确!
PROC CAL2                  ;计算R1*(R4,R3)/R2
CAL2:
    ;计算16位乘8位
    MOV A, R3               ;取被乘数的低8位
    MOV B, R1               ;取乘数
    MUL AB
    MOV R3, A               ;乘积低8位送R3
    MOV A, R4               ;取乘数的高8位
    MOV R4, B               ;乘积高8位送R4
    MOV B, R1               ;取乘数
    MUL AB                  ;计算A*C部分
    ADD A, R4               ;加AB的高8位
    MOV R4, A
    MOV A, B                ;取成绩的高8位
    ADDC A, #0              ;加上进位标志
    mov R5, A               ;最高8位(即b23-b16)

    MOV R1, #16             ;移位16次(已经除数不小于128,即b7为1,
                            ;利用C进行扩展)
LOOP1:
    CLR C
    MOV A, R3
    RLC A
    MOV R3, A

    MOV A, R4
    RLC A
    MOV R4, A

    MOV A, R5
    RLC A
    MOV R5, A

    MOV F0, C

    CLR C
    SUBB A, R2          ;考虑连同标志位在内相减
    ANL C, /F0
    JC NEXT1
    ;够减,取差
    MOV R5, A           ;送差值
    MOV A, R3
    ORL A, #01H         ;商b0位置1
    MOV R3, A
NEXT1:
    DJNZ R1, LOOP1
    ;商在R4\R3中, 余数在R5中。
    RET
END
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

;把(R4,R3中的)16进制数(不超过999)转换为BCD码,并显示
PROC H16_BCD          ;把(R4,R3中的)16进制数(不超过999)转换为BCD码,并显示
H16_BCD:
    MOV R5, #0          ;百位码
LOOP2:
    CLR C
    MOV A, R3
    SUBB A, #100
    MOV R6, A           ;暂时保存在R6中
    MOV A, R4
    SUBB A, #0          ;减进位标志
    MOV R7, A           ;暂时保存在R7中
    JC NEXT2
    ;够减, 承认差,商加+1
    MOV A, R7
    MOV R4, A
    MOV A, R6
    MOV R3, A
    INC R5
    SJMP LOOP2
NEXT2:
    ;保留原来的值(由于差已小于99),即实际上只有R3有效
    MOV A, R3
    MOV B, #10
    DIV AB
    MOV DPTR, #DPDATA
    MOVC A, @A+DPTR
    MOV  2DH, A       ;笔段码送2DH单元(十位)

    MOV A, B          ;个位码
    MOVC A, @A+DPTR
    MOV  2CH, A       ;笔段码送2CH单元(个位)

    MOV A, R5         ;取百
    MOVC A, @A+DPTR
    MOV  2EH, A       ;笔段码送2EH单元(百位)
    RET
END

;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

PROC FMQ1           ;蜂鸣器快闪烁设置(过热)造成
FMQ1:
     MOV A, LEDSTU1
     ANL A, #0C0H
     CJNE A, #00, NEXT1
     ;空闲,应该快响
     SJMP NEXT2
NEXT1:
     CJNE A, #0C0H, EXIT
     ;11,应该快响
NEXT2:
     ANL LEDSTU1, #10111111B
     ORL LEDSTU1, #10000000B    ;快响
EXIT:
     ;01,即低压时不改变
     RET
END

;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

PROC FMQEND           ;关闭蜂鸣器故障音
FMQEND:
     MOV A, LEDSTU1
     ANL A, #0C0H
     CJNE A, #40H, NEXT1
     ;慢响,应该关闭
     SJMP NEXT2
NEXT1:
     CJNE A, #80H, EXIT
     ;10,即快响,应该关闭
NEXT2:
     ANL LEDSTU1, #00111111B
EXIT:
     RET
END

;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

PROC DC_ACSTU        ;检查逆变状态,管理逆变器
DC_ACSTU:
    MOV A, DABA_TC
    JNB ACC.7, PWNEXT1
    ;DC-AC散热片过热
    ANL LEDSTU2, #11110000B
    ORL LEDSTU2, #00110000B;b5、b4为11(D203快闪)
    SJMP PWNEXT21

PWNEXT1:
    JNB ACC.3, PWNEXT2
    ;电池过热

    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT21:
    CLR V2_C               ;关闭DC-DC高压电源
    SETB LFACON            ;关闭DC-AC

    LCALL FMQ1             ;蜂鸣器快响设置(过热)造成
    ANL LEDSTU1, #11100000B
    ORL LEDSTU1, #00100000B;b5、b4为10(D206快闪)

    JMP PWNEXTD2           ;显示电压
;*****软件陷阱

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -