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

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

📁 用pic单片机实现的对锂电池冲电的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
     MOV R4, #3           ;重复写入3次
LOOP1:
     MOV DPTR, #YKQIDAT   ;数据所在单元地址送DPTR
     MOV R0, #58H
     MOV R7, #2            ;写入字节数据(最大为64字节)
     LCALL REWFLASH        ;读出-擦除-写入
     JNC NEXT31
     ;C为1,错误
     DJNZ R4, LOOP1
     SJMP NEXT3
NEXT31:
    ;正确,响一长声
     ANL LEDSTU1, #11000010B
     ORL LEDSTU1, #11000010B;蜂鸣器响1S,状态D204灯慢闪
     CLR BELL               ;开蜂鸣器
     MOV TIMEBELL, #15      ;启动时响1.5S,作为按键有效标志

     ;再等待2S
     MOV LUTIME,  #2       ;限时2S
NEXT32:
     CLR EA
     MOV WFEED1, #0A5H
     MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
     SETB EA

     MOV A, LUTIME
     CJNE A, #0, NEXT32
     ;延迟时间到
NEXT3:
     ANL WUSTU, #0E0H
EXIT:
     ANL LEDSTU1, #0FCH    ;关闭D204
     RET
END

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

;状态扫描
PROC STUSCAN          ;执行键盘及温度检测
STUSCAN:
    ;检测周波功率管及电池温度
    MOV A, DABA_TC
    RL A
    MOV C, P0.0       ;读p0.0(即电池温度当前状态)
    MOV ACC.0, C      ;送b0位
    MOV C, P1.4       ;读p1.4(即DC-AC温度当前状态)
    MOV ACC.4, C      ;送b4位
    ANL A, #77H       ;仅仅保留状态位
    ANL DABA_TC, #88H ;清除状态位
    ORL DABA_TC, A    ;回送状态

    ;判别状态
    ANL A, #07H       ;判别电池状态
    CJNE A, #07H, KEYNEXT11
    ;为111,即正常
    ANL DABA_TC, #0F7H;b3清0,即正常
    SJMP KEYNEXT12
KEYNEXT11:
    CJNE A, #00H, KEYNEXT12
    ;为000态,即电池过热
    ORL DABA_TC, #08H ;b3置为1(过热标志)
    CLR PWON          ;关闭充电电路
    SETB LFACON       ;关闭逆变系统
    CLR V2_c          ;关闭DC-DC
KEYNEXT12:
    ;其他状态不理会

    ;判别Dc-AC温度
    MOV A, DABA_TC
    ANL A, #70H       ;判别DC-AC散热片温度状态
    CJNE A, #70H, KEYNEXT13
    ;为111,即正常
    ANL DABA_TC, #7FH ;b7清0,即正常
    SJMP KEYNEXT14
KEYNEXT13:
    CJNE A, #00H, KEYNEXT14
    ;为000态,即过热
    ORL DABA_TC, #80H ;b7置为1(过热标志)
    SETB LFACON       ;关闭逆变系统
    CLR V2_c          ;关闭DC-DC
KEYNEXT14:
    ;其他状态不理会


    ;判别充电器散热片温度
    MOV A, PWONSTU
    RL A
    MOV C, P1.3
    MOV ACC.0, C
    ANL A, #07H
    ANL PWONSTU, #0F8H
    ORL PWONSTU, A   ;回写
    CJNE A, #7, KEYNEXT21
    ;为111态,正常
    ANL PWONSTU, #0F7H  ;b3位清0(正常)
    SJMP KEYNEXT22
KEYNEXT21:
    CJNE A, #0, KEYNEXT22
    ;为000态,充电器散热片过热
    ORL PWONSTU, #08H  ;b3位置为1(过热)
    CLR PWON
KEYNEXT22:
    ;其他状态不理会
KEYNEXT2:

    MOV A, PUTIME
    CJNE A, #0, KEYEXIT;上电延迟期间不执行
    ;执行按键扫描
    MOV A, KEYSTU
    RL A
    MOV C, P1.7  ;KEY0(录码)
    ANL C, P1.6  ;KEY1(显示状态切换)
    ANL C, P2.3  ;KEY2(启动/关闭)
    MOV ACC.0, C ;按键状态送b0
    ANL A, #07H
    ANL KEYSTU, #0F8H
    ORL KEYSTU, A;回写按键状态
    ;判别按键状态

    CJNE A, #100B, KEYNEXT3
    ;为100态,已经按下了指定时间,启动按键扫描
    JB KEYSTU.7, KEYEXIT
    ;上一次按键已经处理
    ANL KEYSTU, #0FH
    JB P1.7, KEYNEXT31
    ;p1.7为低电平,即key0被按下
    MOV A, #10000000B
    ORL KEYSTU, A               ;按键名为0,有效标志置1
    SJMP KEYNEXT34
KEYNEXT31:
    JB P1.6, KEYNEXT32
    ;p1.6为低电平,即key1被按下
    MOV A, #10010000B
    ORL KEYSTU, A               ;按键名为1,有效标志置1
    SJMP KEYNEXT34
KEYNEXT32:
    JB P2.3, KEYNEXT33
    ;p2.3为低电平,即key2被按下
    MOV A, #10100000B
    ORL KEYSTU, A               ;按键名为2,有效标志置1
    SJMP KEYNEXT34
KEYNEXT33:
    ;没有按键被按下,错误
    SJMP KEYEXIT
KEYNEXT34:
    ;响蜂鸣器,时间为0.5s
    MOV A, LEDSTU1
    ANL A, #0C0H
    CJNE A, #00H, KEYEXIT
    ;处于停止状态,可以设置为快响
    ORL LEDSTU1, #0C0H  ;单音状态
    CLR BELL            ;开蜂鸣器
    MOV TIMEBELL, #2    ;响0.2S(作为按键有效提示)
    SJMP KEYEXIT
KEYNEXT3:
    CJNE A, #101B, KEYNEXT4
    ;干扰,作为111
    ORL KEYSTU, #07H
    SJMP KEYEXIT
KEYNEXT4:
    CJNE A, #010B, KEYNEXT5
    ;干扰,作为000
    ANL KEYSTU, #0F8H
KEYNEXT5:
    ;其他状态不理会
KEYEXIT:
    RET
END
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

PROC HEXTOBCD   ;把存放在A中的进制转化为十进制,并显示缓冲区
HEXTOBCD:
   MOV B, #100
   DIV AB
   MOV DPTR, #DPDATA
   MOVC A, @A+DPTR
   MOV  2EH, A       ;笔段码送2EH单元(百位)
   MOV A, B
   MOV B, #10
   DIV AB
   MOVC A, @A+DPTR
   MOV  2DH, A       ;笔段码送2DH单元(十位)

   MOV A, B          ;取余数(即个位)
   MOVC A, @A+DPTR
   MOV  2CH, A       ;笔段码送2CH单元(个位)
   RET
END
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******


PROC ADPROC
ADPROC:
    ;AD转换中断
    PUSH PSW
    PUSH ACC
    MOV PSW, #08H
    ;CLR  RS1
    ;SETB RS0            ;使用1区

    MOV A, #BATVBUF      ;缓冲区首地址送A
    ADD A, BATVPN        ;加记录指针
    MOV R0, A            ;R0指向缓冲区对应的存储单元
    MOV @R0, AD1DAT1     ;取通道1(电池电压取样)
    INC BATVPN
    MOV A, BATVPN
    CJNE A, #8, BVNEXT0
BVNEXT0:
    JC BVexit
    ;达到8个点
    MOV BATVPN, #0      ;指针回0!
    MOV R0, #BATVBUF    ;缓冲区首地址送R0
    LCALL CALAV         ;计算平均值!
    MOV BATV, A         ;取平均值!
    CJNE A, #200, BVNEXT1
BVNEXT1:
    JC BVNEXT2
    ;由于电池电压允许范围为15.5,经分压后为2.583(对应值200)
    ;大于200过压,要关闭
    CLR V2_C            ;关闭电压转换输出
    SETB LFACON         ;关闭DC-AC转换
    SJMP BVexit
BVNEXT2:

    CJNE A, #129, BVNEXT3
BVNEXT3:
    JC BVNEXT4
    ;在10-15.5之间
    SJMP BVexit
BVNEXT4:
    ;电池电压小于10V

    ;小于10.0(延迟1S关闭
    JNB LFACON, BVNEXT41
    ;处于逆变状态
    JB LVTIMEB, BVNEXT41
    SETB LVTIMEB         ;低压计时标志有效
    MOV  LVTIME, #20     ;延迟时间为20*0.1s,即2S
BVNEXT41:
    CJNE A, #116, BVNEXT5
BVNEXT5:
    JC BVNEXT6
    SJMP BVexit
BVNEXT6:
    ;电池电压小于9V, (9/12)*2*(255/3.3)即116
    CLR PWON          ;关闭充电器启动信号

BVexit:

    ;处理充电状态的采样电流
    JNB PWON, PWNEXT2
    ;充电处于打开状态,记录充电电流
    MOV A, #PWIIBUF   ;缓冲区首地址送A
    ADD A, PWIOPN     ;加记录指针
    MOV R0, A         ;R0指向缓冲区对应的存储单元
    MOV @R0, AD1DAT0  ;取通道0(充电电流采样值)
    INC PWIOPN        ;指向下单元
    MOV A, PWIOPN
    CJNE A, #8, PWNEXT1
PWNEXT1:
    JC PWEXIT
    ;达到8个点,要求平均
    MOV R0, #PWIIBUF    ;缓冲区首地址送R0
    LCALL CALAV         ;计算平均值!
    MOV PWIOAV, A       ;送平均电流存储单元
    MOV PWIOPN, #0      ;指针回零
    SJMP PWEXIT
PWNEXT2:
    MOV PWIOPN, #0      ;指针回零
    MOV PWIOAV, #0
PWEXIT:

EXIT:
    ANL ADCON1, #0F7H     ;清除中断
    POP ACC
    POP PSW
    RETI
END

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

;入口参数:R0指向缓冲区首地址!
;出口参数:平均结果在A中!
PROC CALAV              ;计算平均值!
CALAV:
    MOV R3, #0
    MOV R2, #0         ;累加单元清0
    MOV R1, #8         ;一共计算8个点
PWLOOP1:
    MOV A, R2
    ADD A, @R0
    MOV R2, A
    MOV A, R3
    ADDC A, #0         ;加进位标志
    MOV R3, A
    INC R0
    DJNZ R1, PWLOOP1
    ;除8,求平均
    CLR C
    MOV A, R3
    RRC A
    MOV R3, A
    MOV A, R2
    RRC A
    MOV R2, A          ;除2
    ;再一次
    CLR C
    MOV A, R3
    RRC A
    MOV R3, A
    MOV A, R2
    RRC A
    MOV R2, A          ;除4
    ;又再一次
    CLR C
    MOV A, R3
    RRC A
    MOV R3, A
    MOV A, R2
    RRC A
    ;MOV R2, A          ;除8
    ;结果在A中
    RET
END


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

;------RTC溢出中断服务程序-----
;每1ms中断一次
PROC RTC
RTC:
    PUSH PSW
    PUSH ACC
    PUSH B
    PUSH DPH
    PUSH DPL

    MOV PSW, #10H       ;用2区

;   SETB RS1
;   CLR RS0

    SETB TIME_1ms       ;1ms定时时间到标志

    MOV A, ACSTU
    RL A
    MOV C, ACIN
    MOV ACC.0, C
    ANL A, #07H
    ANL ACSTU, #0F8H     ;清除状态
    ORL ACSTU, A         ;合并到交流状态中
    CJNE A, #100B, ACNEXT1
    ;等于100,即没有交流(这意味着断电后2ms检测到)
    CLR PWON             ;关闭充电器
    ANL ACSTU, #0F7H     ;将b3置为0(无交流标志)
    JNB KEY2STU, ACNEXT11
    ;主机开关处于开态,应检查并块启动逆变
    CLR EA               ;关闭中断
    SETB KUAION          ;快速启动标志
    LCALL DC_ACSTU       ;检查逆变状态,管理逆变器
    CLR KUAION           ;清除快速启动标志

    JB LFACON, ACNEXT111
    ;低电平,说明其他各项指标正常,已经启动
WAIT1:
    MOV A, RTCCON
    JNB ACC.7, WAIT1     ;延迟等待RTC定时器时间到
    ANL RTCCON, #7FH     ;清除中断标志
    ;1MS定时时间到了!
    SETB LFACON         ;置为高电平,形成高电平
WAIT2:
    MOV A, RTCCON
    JNB ACC.7, WAIT2     ;延迟等待RTC定时器时间到
    ANL RTCCON, #7FH     ;清除中断标志
    ;高电平1MS定时时间到了!
    CLR LFACON         ;置为低电平,完成启动快启动脉冲头
    ;响1S作为切换标志
    ORL LEDSTU1, #0C0H;响1S
    CLR BELL          ;开蜂鸣器
    MOV TIMEBELL, #10 ;启动时响1S,作为启动的提示
ACNEXT111:
    ;不满足启动条件
    SETB  EA             ;开中断退出
ACNEXT11:
    ;主机关闭,无法启动
    SJMP ACEXIT


ACNEXT1:
    CJNE A, #101B, ACNEXT2
    ;干扰,作为111处理
    ORL ACSTU, #07H      ;作111态处理
    SJMP ACEXIT
ACNEXT2:
    CJNE A, #010B, ACNEXT3
    ;干扰,作为000处理
    ANL ACSTU, #0F8H      ;作000态处理
    SJMP ACEXIT
ACNEXT3:
    CJNE A, #111B, ACNEXT4
    ;市电存在或恢复,判别原来处于什么状态?
    ORL ACSTU, #00001000B ;恢复有电状态
    SETB LFACON           ;停止DC-AC转换
;    SJMP ACEXIT
ACNEXT4:

ACEXIT:


    ;处理基本定时时间
    INC TIMEB
    MOV A, TIMEB
    CJNE A, #100, TMNEXT1
TMNEXT1:
    JNC TMNEXT2
    JMP TMEXIT
TMNEXT2:
    ;大于100,从开0开始
    MOV TIMEB, #0

    ;每0.1S时间到
    INC LEDTIME
    MOV A, LEDTIME
    CJNE A, #250, LEDNEXT1
LEDNEXT1:
    JC LEDNEXT2
    ;25s时间到标志
    MOV LEDTIME, #0
LEDNEXT2:

⌨️ 快捷键说明

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