📄 89lpc933(修改充电过程).asm
字号:
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 + -