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