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

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

📁 用pic单片机实现的对锂电池冲电的程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
RXDNEXT121:
    JC RXDNEXT122
    ;大于12,即1.5A,要启动风扇!
    CLR TEMPIN               ;启动风扇!
    SJMP RXDNEXT123
RXDNEXT122:
    ;小于12,即1.5A关闭风扇
    SETB TEMPIN               ;关闭风扇!
RXDNEXT123:
    MOV R1, #RXDBUF+3
    MOV A, @R1
    CJNE A, #76, RXDNEXT124
RXDNEXT124:
    JC RXDNEXT14
    ;大于75以上,不理合
    SJMP RXDNEXT13
RXDNEXT12:
    CJNE A, #0E5H, RXDNEXT13
    ;等于E5停止标志
    SJMP RXDNEXT14
RXDNEXT13:
    ;此外的数据无效!
    MOV R0, #RXDBUFD
    MOV @R0, #55H      ;直接在55H单元防止一个无效值
    SJMP RXDNEXT1
RXDNEXT14:
    MOV R1, #RXDBUF
    MOV R0, #RXDBUFD
    MOV R2, #4          ;保存4个字节
RXDLOOP2:
    MOV A, @R1
    MOV @R0, A          ;保存
    INC R1
    INC R0
    DJNZ R2, RXDLOOP2

RXDNEXT1:
    MOV RXDSP, #0
    MOV RXDBUFEV, #55H  ;缓冲区无效
    SETB REN
RXDEXIT:


    ;执行键盘及温度状态扫描
    JBC TIME_20MS, KEYNEXT0
    JMP KEYEXIT

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

KEYNEXT0:
    ;时间到执行键盘及温度扫描
    LCALL STUSCAN          ;执行键盘及温度检测
    ;检查有无按键被按下
    MOV A, KEYSTU
    JB ACC.7, KEYNEXT1
    ;没有按键被按下
    JMP KEYEXIT
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

KEYNEXT1:
    ;有按键被按下,可清除按下标志
    ANL KEYSTU, #7FH
    ANL A, #70H
    CJNE A, #20H, KEYNEXT2
    ;KEY2被按下
    CPL KEY2STU           ;取反
    JB KEY2STU, KEYNEXT21
    ;KEY2STU为0,即关闭主机,即主机开关由1(开)→0关
    ;不管处于什么状态,关闭总是要关闭
    CLR PWON          ;关闭充电电路
    SETB LFACON       ;关闭逆变系统
    CLR V2_c          ;关闭DC-DC
    SETB TEMPIN       ;关闭风扇!
    JMP KEYEXIT       ;关闭不提示
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

KEYNEXT21:
    ;KEY2STU为1,即打开主机,即主机开关由0(开)→1关
    ;要检查有无交流,然后采用慢启动方式启动AD转换器
    MOV A, ACSTU
    JB ACC.3, KEYNEXT22
    ;没有交流,应启动逆变系统
    LCALL DC_ACSTU    ;检查逆变状态,管理逆变器
                      ;慢启动
    SJMP KEYNEXT23
KEYNEXT22:
    ;有交流应该启动充电器系统
    LCALL PWON_PROC  ;充电器启动处理(检查充电器的状态,并根据主机开关启动)

KEYNEXT23:
    MOV PUTIME, #3    ;延迟0.3s在检查状态
    ORL LEDSTU1, #0C0H;响1S
    CLR BELL          ;开蜂鸣器
    MOV TIMEBELL, #10 ;启动时响1S,作为启动的提示
    JMP PUWAIT
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

KEYNEXT2:

     CJNE A, #10H, KEYNEXT3
     ;KEY1(即状态选择键被按下)
KEYNEXT30:
     MOV A, LEDSTU1
     ANL A, #00110000B
     CJNE A, #30H, KEYNEXT31
     ;d206常亮,说明处于正常的逆变状态,使D203、D202、D201切换
     MOV A, LEDSTU2
     ANL A, #00110000B
     CJNE A, #00H, KEYNEXT311
     ;d203不亮,检查D202
     MOV A, LEDSTU2
     ANL A, #00001100B
     CJNE A, #00H, KEYNEXT3111
     ;D202也不亮,则可以肯定是D201亮,要切换到D203常亮
     ANL LEDSTU2, #11110000B
     ORL LEDSTU2, #00110000B    ;使D203常亮
     SJMP KEYEXIT

KEYNEXT3111:
     ;目前D202亮,要切换到D201
     ANL LEDSTU2, #11000011B
     ORL LEDSTU2, #00000011B    ;使D201常亮
     SJMP KEYEXIT

KEYNEXT311:
     ;d203亮,切换到D202
     ANL LEDSTU2, #11001100B
     ORL LEDSTU2, #00001100B    ;使D202常亮
     SJMP KEYEXIT
KEYNEXT31:
     ;检查D205是否亮
     MOV A, LEDSTU1
     ANL A, #00001100B
     CJNE A, #0CH, KEYNEXT32
     ;d205常亮,处于逆变状态,可在D203和D202之中切换
     MOV A, LEDSTU2
     ANL A, #00110000B
     CJNE A, #00H, KEYNEXT321
     ;D203不亮,说明原来是D202亮,则立即切换到D203
     ANL LEDSTU2, #11110000B
     ORL LEDSTU2, #00110000B    ;使D203常亮
     SJMP KEYEXIT

KEYNEXT321:
     ;说明D203亮,切换到D202亮
     ANL LEDSTU2, #11001100B
     ORL LEDSTU2, #00001100B    ;使D202常亮
     SJMP KEYEXIT

KEYNEXT32:
     ;其他状态不能切换
     SJMP KEYEXIT
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

KEYNEXT3:
     CJNE A, #00H, KEYNEXT4
     ;说明是Key0键有效,要检查主机状态
     JB KEY2STU, KEYNEXT41
     ;主机处于关闭状态,允许录码
     LCALL LUMA
     ;尚未处理?
KEYNEXT41:

KEYNEXT4:

KEYEXIT:
     ;检查无线解码是否有效
     ;???
     JB JIEMA, JIMNEXT0
     JMP JIEXIT
JIMNEXT0:
     ;核对
     JNB JINXUNP, JIMNEXT1
     ;解码有效,核对有无停止
     MOV A, WUSTU
     ANL A, #06H        ;仅仅保留最b2\b1
     CJNE A, #06H, JIMNEXT11
     ;数据有效,但未停止发送!
     SJMP JIEXIT
JIMNEXT11:
     ;已经处理了数据, 且已经停止发送,要清除处理标志及解码状态
     ANL WUSTU, #0E0H
     SJMP JIEXIT
JIMNEXT1:
     MOV DPTR, #YKQIDAT
     MOV R0, #BUFF0+5   ;与地址码核对
     MOV A, @R0
     MOV B, A

     CLR A
     MOVC A, @A+DPTR
     CJNE A, B, JIMNEXT2
     ;相同,核对下一字节
     INC R0
     MOV A, @R0
     MOV B, A
     INC DPTR
     CLR A
     MOVC A, @A+DPTR
     CJNE A, B, JIMNEXT2
     ;相同,要检查属于什么键盘
     MOV R0, #BUFF0+4   ;取出按键名称
     MOV A, @R0
     CJNE A, #0C0H, JIMNEXT21
     ;等于0C0H(即布防键,即开)
     SETB KEY2STU       ;开主机
     SJMP JIMNEXT221
JIMNEXT21:
     CJNE A, #03H, JIMNEXT22
     ;等于03H(即撤防键,即关闭)
     SETB TEMPIN        ;关闭风扇!
     CLR KEY2STU        ;关闭主机
JIMNEXT221:
     SETB JINXUNP       ;解码处理标志置1
     ORL LEDSTU1, #0C0H;响1S
     CLR BELL          ;开蜂鸣器
     MOV TIMEBELL, #5  ;启动时响0.5S,作为按键有效标志
     SJMP JIEXIT
JIMNEXT22:
     CJNE A, #30H, JIMNEXT23
     ;等于30H(即相当于报警键),视为状态切换
     SJMP JIMNEXT231
JIMNEXT23:
     CJNE A, #0CH, JIMNEXT2
     ;等于0CH(即相当于旁路键),视为状态切换
JIMNEXT231:
     SETB JINXUNP      ;解码处理标志置1
     ORL LEDSTU1, #0C0H;响0.7S
     CLR BELL          ;开蜂鸣器
     MOV TIMEBELL, #7  ;启动时响0.7S,作为按键有效标志
     JMP KEYNEXT30     ;与键盘操作相同
JIMNEXT2:
     ;错误
     ANL WUSTU, #11110000B
JIEXIT:

     ;状态检查,并显示
     JB KEY2STU, STUNEXT1
     ;主机处于关闭状态,即00或01
     SETB TEMPIN        ;关闭风扇!
     LCALL STUOFF       ;显示旁路或关闭状态电池电压
     JMP RUN
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

STUNEXT1:
     ;主机处于开台,根据交流处理
     MOV A, ACSTU
     JB ACC.3, STUNEXT2

     ;处于10,主机开,无交流!即逆变状态或逆变故障状态
     CLR PWON           ;一定要关闭充电器
     LCALL DC_ACSTU     ;检查逆变状态,管理逆变器
     JMP RUN
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

STUNEXT2:
     ;处于11态,处于处于充电状态
     SETB LFACON        ;一定要关闭逆变部分
     JB PWON, STUNEXT3
     ;充电器关闭,启动充电
     LCALL PWON_PROC  ;充电器启动处理(检查充电器的状态,并根据主机开关启动)
     JMP RUN
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

STUNEXT3:
     ;充电器状态,管理
     ;每隔20ms检查一次
     JNB TIME_20msp, STUNEXT4
     LCALL PWON_GL      ;充电器管理(检查充电器的状态,并根据主机开关启动)
     CLR TIME_20msp     ;清除执行时间标志
STUNEXT4:
     JMP RUN
;*****软件陷阱开始*******
     NOP
     NOP
     ORL AUXR1, #08H      ;软件复位标志置1,强迫复位
;*****软件陷阱结束*******

END

PROC STUOFF
STUOFF:
    ANL LEDSTU1, #03H     ;d206、D05全部关闭,同时关闭蜂鸣器
    CLR V2_C              ;关闭DC-DC高压电源
    CLR PWON              ;关闭充电器
    SETB LFACON           ;全部处于关闭状态

    MOV A, BATV
    CJNE A, #135, NEXT1
NEXT1:
    JNC NEXT2
    ;电池电压小于10.5V
    ANL LEDSTU2, #11010000B
    ORL LEDSTU2, #00010000B;b5、b4为01(D203慢闪)
    SJMP NEXT5
NEXT2:
    CJNE A, #201, NEXT3
NEXT3:
    JC NEXT4
    ;电池电压>15.5V
    ANL LEDSTU2, #11100000B
    ORL LEDSTU2, #00100000B;b5、b4为10(D203快闪)
    SJMP NEXT5

NEXT4:
    ;在10.5-15.5之间,即正常
    ANL LEDSTU2, #11110000B
    ORL LEDSTU2, #00110000B;b5、b4为11(D203常亮)
NEXT5:
    MOV A, ACSTU
    JB ACC.3, NEXT6
    ;交流不存在时,仅仅显示D203,其他全灭
    ANL LEDSTU1, #0C0H     ;关闭D206、D205、D204
    MOV 2CH, #0FFH         ;关闭数码管
    MOV 2DH, #0FFH         ;关闭数码管
    MOV 2EH, #0FFH         ;关闭数码管
    JMP EXIT
NEXT6:
    ANL LEDSTU1, #11000011H;关闭D206、D205
    ORL LEDSTU1, #03H      ;点亮D204
    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,强迫复位
;*****软件陷阱结束*******

PROC LUMA                  ;录码处理
LUMA:
     ANL LEDSTU1, #11000001B
     ORL LEDSTU1, #00000001B;状态D204灯慢闪
     MOV LUTIME,  #30       ;限时30S

     ANL WUSTU, #0E0H
RUNJIM11:
     CLR EA
     MOV WFEED1, #0A5H
     MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
     SETB EA

     JB JIEMA, NEXT1
     ;解码无效
     MOV A, LUTIME
     CJNE A, #0, RUNJIM11
     ;等于0,超时取消
     JMP EXIT
NEXT1:
     ;保护数据
     MOV R0, #BUFF0+5
     MOV 58H, @R0
     INC R0
     MOV 59H, @R0

     ;指示灯置为快闪
     ANL LEDSTU1, #11000010B
     ORL LEDSTU1, #11000010B;蜂鸣器响1S,状态D204灯慢闪
     CLR BELL               ;开蜂鸣器
     MOV TIMEBELL, #10      ;启动时响1S,作为按键有效标志

RUNJIM12:
     CLR EA
     MOV WFEED1, #0A5H
     MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
     SETB EA
     ;解码有效,核对有无停止
     MOV A, WUSTU
     ANL A, #06H        ;仅仅保留最b2\b1
     CJNE A, #06H, NEXT2
     ;数据有效,但未停止发送!
     ;延迟等待
     MOV A, LUTIME
     CJNE A, #0, RUNJIM12
     ;等于0,超时取消
     JMP EXIT

NEXT2:
     ;已经处理了数据, 且已经停止发送,要清除处理标志及解码状态
     ANL WUSTU, #0E0H

     ;进行第二次触发
     ANL LEDSTU1, #11000001B
     ORL LEDSTU1, #00000001B;状态D204灯慢闪

RUNJIM21:
     CLR EA
     MOV WFEED1, #0A5H
     MOV WFEED2, #5AH      ;顺序执行看门狗清零指令序列,强迫WDCON装入
     SETB EA

     JB JIEMA, NEXT21
     ;解码无效
     MOV A, LUTIME
     CJNE A, #0, RUNJIM21
     ;等于0,超时取消
     JMP EXIT
NEXT21:
    ;比较
     MOV R0, #BUFF0+5
     MOV A, @R0
     CJNE A, 58H, NEXT3
     ;相同
     INC R0
     MOV A, @R0
     CJNE A, 59H, NEXT3
     ;均相同,则记录遥控器ID号

⌨️ 快捷键说明

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