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

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

📁 用pic单片机实现的对锂电池冲电的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    MOV A, LEDTIME
    MOV B, #10
    DIV AB
    MOV A, B
    CJNE A, #0, LEDNEXT3
    ;1s时间到标志

    ;处理录码时间
    MOV A, LUTIME
    CJNE A, #0, LUMNEXT1
    SJMP LUMEXIT
LUMNEXT1:
    DEC LUTIME               ;录码时间减1
LUMEXIT:
    CPL TIME05S              ;1S时间到标志取反
    SETB LEDRUN              ;允许LED执行指令
    SJMP LEDEXIT
LEDNEXT3:
    CPL TIME01S              ;0.1S时间到标志取反
    SETB LEDRUN              ;允许LED执行指令
LEDEXIT:
    JB KEY2STU, NODISPEXIT
    ;在关闭状态下执行,否则录码灯无效
    JNB LEDRUN, NODISPEXIT
    LCALL LEDROC             ;指示灯及鸣响处理
    CLR LEDRUN
NODISPEXIT:


    ;0.5S时间到标志检测
    MOV A, LEDTIME
    MOV B, #10
    DIV AB
    MOV A, B
    CJNE A, #0, TIME05SEXND
    SETB TIME05SB           ;充电状态下电流显示0.5S时间到标志
TIME05SEXND:

    JNB LVTIMEB, LVEXIT
    DJNZ LVTIME, LVEXIT
    ;1s延迟时间到,关闭逆变部分
    CLR V2_C            ;切断DC-DC部分驱动电源
    SETB LFACON         ;关闭DC-AC部分启动信号
    CLR LVTIMEB         ;取消标志信号
    MOV A, ACSTU
    JB ACC.3, LVEXIT
    ;没有交流,即不处于充电状态,关闭主机!
    CLR KEY2STU         ;即不处于充电状态,关闭主机!
LVEXIT:

    ;处理蜂鸣器时间
    MOV A, LEDSTU1
    ANL A, #0C0H
    CJNE A, #40H, BETTNEXT1
    ;为01态,即慢响
    DJNZ TIMEBELL, BETTEXIT
    MOV TIMEBELL, #10   ;1S(响1S-停1S)
    CPL BELL            ;取反
    SJMP BETTEXIT
BETTNEXT1:
    CJNE A, #80H, BETTNEXT2
    ;为10态,即快响
    DJNZ TIMEBELL, BETTEXIT
    MOV TIMEBELL, #3   ;0.3S(响0.3S-停0.3S)
    CPL BELL           ;取反
    SJMP BETTEXIT
BETTNEXT2:
    CJNE A, #0C0H, BETTNEXT3
    ;为11态,单音
    DJNZ TIMEBELL, BETTEXIT
BETTNEXT3:
    ;肯定为00态,不动作
    MOV TIMEBELL, #3
    SETB BELL          ;关闭蜂鸣器
    ANL LEDSTU1, #3FH  ;清除状态
BETTEXIT:

    ;上电延迟时间处理
    mov A, PUTIME
    CJNE A, #0, PUNEXT1
    SJMP PUEXIT
PUNEXT1:
    DJNZ PUTIME, PUEXIT
PUEXIT:

    ;过流、过载延迟关闭
    JNB ACIO_OV, ACIOEXIT
    MOV A, ACIO_TIME
    CJNE A, #0, ACIOEXIT
    DJNZ ACIO_TIME, ACIOEXIT
    ;延迟时间到,要关闭DC-AC输出
    SETB LFACON          ;关闭DC-AC输出
ACIOEXIT:

TMEXIT:

    ;20ms判别
    MOV A, TIMEB
    MOV B, #20
    DIV AB
    MOV A, B           ;取余数
    CJNE A, #0, TIME20MSE
    SETB TIME_20ms       ;20ms定时时间到标志
    SETB TIME_20msp      ;充电器管理时间标志

    ;对LFAC启动延迟时间进行检查
    MOV A, LFACTIME
    CJNE A, #0, LFACWAIT1
    SJMP TIME20MSE
LFACWAIT1:
    DEC LFACTIME

TIME20MSE:

    ANL RTCCON, #7FH    ;清楚RTC中断标志
    POP DPL
    POP DPH
    POP B
    POP ACC
    POP PSW
    RETI
END

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


;入口参数:
;A为当前读数,B为比例因子
;R2为分母,计算A*B/R2
;出口参数:商在A中,余数在R3中;使用了R1
PROC CAL1              ;多字节除法运算(16位除8位)
CAL1:
    MUL AB             ;已经除数不小于128
    XCH A, B           ;A、B交换,即高8位在A中,低8位在B
    MOV R3, A

    MOV R1, #8         ;移位8次(已经除数不小于128,即b7为1,
                       ;利用C进行扩展)
LOOP1:
    CLR C
    MOV A, B
    RLC A
    MOV B, A
    MOV A, R3
    RLC A
    MOV R3, A
    MOV F0, C
    CLR C
    SUBB A, R2          ;考虑连同标志位在内相减
    ANL C, /F0
    JC NEXT1
    ;够减,取差
    MOV R3, A           ;送差值
    ORL B, #01H         ;b0位置1
NEXT1:
    DJNZ R1, LOOP1
    MOV A, B            ;商在A中,余数在R3中
    RET
END
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

PROC RXDPROC            ;串行接收中断
RXDPROC:
    PUSH PSW
    PUSH ACC
    MOV PSW, #10H       ;用2区(与基准时间RTC同级)
;   SETB RS1
;   CLR RS0

    JB RI, NEXT1
    ;不是串行接收中断
    SJMP EXIT
NEXT1:
    ;校验
    MOV A, SBUF           ;读接收数据
    MOV C, RB8
    ANL C, /P
    MOV F0, C
    MOV C, P
    ANL C, /RB8
    ORL C, F0
    JNC NEXT2
    ;相异,奇偶校验错误
    MOV RXDSP, #0        ;复位接收指针
    SJMP EXIT
NEXT2:
    CJNE A, #0EAH, NEXT3
    ;帧首标志(启动状态)
    MOV RXDSP, #0        ;复位接收指针
    SJMP NEXT5
NEXT3:
    CJNE A, #0E5H, NEXT4
    ;帧首标志(停止状态)
    MOV RXDSP, #0        ;复位接收指针
    SJMP NEXT5
NEXT4:
    ;中间帧
    INC RXDSP            ;指向下字节
NEXT5:
    MOV A, #RXDBUF
    ADD A, RXDSP
    MOV R0, A
    MOV @R0, SBUF        ;放数据
    ;判别指针大小
    MOV A, RXDSP
    CJNE A, #4, NEXT6
NEXT6:
    JC EXIT
    ;已经接收了5个字节,停止接收处理数据
    MOV RXDBUFEV, #0AAH  ;串行接收缓冲区数据有效
    CLR REN              ;停止接收
EXIT:
    ANL SCON, #0FCH       ;清除接收中断
    POP ACC
    POP PSW
    RETI
END

;根据交流状态(11-交流存在,01-市电刚消失,10-01状态的过渡态)
             ;(00-无交流状态)

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

PROC PWON_PROC  ;充电器启动处理(检查充电器的状态,并根据主机开关启动)
PWON_PROC:
    MOV A, PWONSTU
    JNB ACC.3, PWNEXT1
    ;充电器过热
    ANL LEDSTU2, #11100000B
    ORL LEDSTU2, #00100000B;b5、b4为10(D203快闪)
    SJMP PWNEXT20
PWNEXT1:
    MOV A, DABA_TC
    JNB ACC.3, PWNEXT2
    ;电池过热

    CLR V2_C              ;关闭DC-DC高压电源

    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT20:
    MOV LEDSTU1, #10001000B;b3、b2为10(D205快闪)
                           ;b7、b6为10(短周期提示音)
    CLR PWON               ;关闭充电器
    JMP PWNEXT292

PWNEXT2:
    ;根据电池电压范围设置状态及启动
    MOV A, BATV
    CJNE A, #116, PWNEXT21
PWNEXT21:
    JNC PWNEXT22
    ;电池电压小于9V,充电器处于低压保护状态!
    CLR PWON               ;关闭充电器
    MOV PWUPSTU, #00
    CLR V2_C               ;关闭DC-DC高压电源
    ANL LEDSTU1, #01000100B
    ORL LEDSTU1, #01000100B;b3、b2为01(D205慢闪)
                           ;b7、b6为01(长周期提示音)
    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
    JMP PWNEXT292
PWNEXT22:

    CJNE A, #135, PWNEXT23
PWNEXT23:
    JNC PWNEXT24
    ;电池电压在在9-10.5(即135)之间
    CLR V2_C              ;关闭DC-DC高压电源
    MOV PWUPSTU, #0AAH    ;表示处于小电流恒流状态

    ;充电电流限制为10A,次级线圈平均电流约为1A,采样值约为1V
    ;????
    MOV AD0DAT3, #193       ;先将DA转换器输出预先置为2.5V
    ;????
    SJMP PWNEXT261

PWNEXT24:

    CJNE A, #186, PWNEXT25
PWNEXT25:
    JNC PWNEXT26
    ;电池电压在10.5-14.5(186)之间

    SETB V2_C               ;打开DC-DC高压电源
    ;充电电流限制为50A,次级线圈平均电流约为4.2A,采样值约为2.85V
    ;????
    MOV PWUPSTU, #55H      ;处于恒流充电状态
    MOV AD0DAT3, #78       ;先将DA转换器输出预先置为1.0V
    ;????
PWNEXT261:
    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪,正在充电中)
    SJMP PWNEXT291

PWNEXT26:
;    ;电池电压在14.5V以上
    SETB V2_C               ;打开DC-DC高压电源

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

PWNEXT28:
    ;电池电压在14.5-15.5之间
    ;正常(电池电压在14.7以上,采用浮充)
    ;充电电流为可变,输出电压要稳定13.8V
    ;????
    MOV PWUPSTU, #00H           ;处于浮充状态
    MOV AD0DAT3, #154           ;先将DA转换器输出预先置为2.0V
    ;????
    ANL LEDSTU2, #11110000B
    ORL LEDSTU2, #00110000B;b5、b4为11(D203常亮,已满)

PWNEXT291:
    ANL LEDSTU1, #11001100B
    ORL LEDSTU1, #00001100B;b3、b2为11(D205常亮)
    SETB PWON               ;启动充电器
    SETB TEMPIN             ;输出高电平
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          ;显示小数点
PWNEXT29:
    RET
END
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******


PROC PWON_GL  ;充电器管理(检查充电器的状态,并根据主机开关启动)
PWON_GL:
    MOV A, PWONSTU
    JNB ACC.3, PWNEXT1
    ;充电器过热
    ANL LEDSTU2, #11100000B
    ORL LEDSTU2, #00100000B;b5、b4为10(D203快闪)
    SJMP PWNEXT20
PWNEXT1:
    MOV A, DABA_TC
    JNB ACC.3, PWNEXT2
    ;电池过热

    CLR V2_C              ;关闭DC-DC高压电源

    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
PWNEXT20:
    LCALL FMQ1             ;蜂鸣器快响设置(过热)造成
    ANL LEDSTU1, #11001000B
    ORL LEDSTU1, #00001000B;b3、b2为10(D205快闪)

    CLR PWON               ;关闭充电器

    JMP PWNEXT292

PWNEXT2:
    ;检查有无过流?
    ;250以上认为过流;
    ;220(对应的取样电压2.85V)对应50A充电电流;
    ;66(对应的取样电压0.855V)对应15A充电电流;
    ;44(对应的取样电压0.57V)对应10A充电电流;
    ;25(对应的取样电压0.32V)对应5A充电电流;
    ;????
    MOV A, PWIOAV
    CJNE A, #250, PWNEXT3
PWNEXT3:
    JC PWNEXT4
    ;????
    ;过流
    ANL LEDSTU2, #11001000B
    ORL LEDSTU2, #00001000B;b3、b2为01(D202快闪)

    MOV LEDSTU1, #10001100B;b3、b2为11(D205常亮)
                           ;b7、b6为10(短周期提示音)
    CLR PWON               ;关闭充电器

    MOV 2CH, #0FFH         ;关闭数码管
    MOV 2DH, #0FFH         ;关闭数码管
    MOV 2EH, #0FFH         ;关闭数码管
    JMP EXIT

PWNEXT4:

    ;根据电池电压范围设置状态及启动
    MOV A, BATV
    CJNE A, #116, PWNEXT21
PWNEXT21:
    JNC PWNEXT22
    ;电池电压小于9V,充电器处于低压保护状态!
    CLR PWON               ;关闭充电器
    MOV PWUPSTU, #00
    CLR V2_C               ;关闭DC-DC高压电源
    ANL LEDSTU1, #01000100B
    ORL LEDSTU1, #01000100B;b3、b2为01(D205慢闪)
                           ;b7、b6为01(长周期提示音)
    ANL LEDSTU2, #11010000B
    MOV LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
    JMP PWNEXT292
PWNEXT22:
    LCALL FMQEND           ;关闭蜂鸣器故障音
    ;根据电池电压决定调整DA转换输出
    MOV A, BATV
    CJNE A, #135, PWNEXT23
PWNEXT23:
    JNC PWNEXT24
    ;电池电压在在9-10.5(即135)之间
    CLR V2_C               ;关闭DC-DC高压电源

    ;充电电流限制为10A,次级线圈平均电流约为1A,采样值约为0.57V
    MOV A, PWIOAV
    CJNE A, #43, PWNEXT241
PWNEXT241:
    JNC PWNEXT242
    ;小于43
    MOV A, AD0DAT3
    CJNE A, #150, PWNEXT2421
PWNEXT2421:
    JC PWNEXT2422
    ;大于150,减1(调低DA转换值),使输出电流回升
    DEC A
    MOV AD0DAT3, A
PWNEXT2422:
    JMP PWNEXT281          ;显示处理
PWNEXT242:

⌨️ 快捷键说明

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