?? 89lpc933(修改充電過程).asm
字號:
CJNE A, #46, PWNEXT243
PWNEXT243:
JNC PWNEXT244
;在43-45之間, 認為合理!(即10A的充電電流)
JMP PWNEXT281 ;顯示處理
PWNEXT244:
;充電電流偏大
MOV A, AD0DAT3
CJNE A, #250, PWNEXT2441
PWNEXT2441:
JNC PWNEXT2442
;小于250,加1(調高DA轉換值),使輸出電流下降
INC A
MOV AD0DAT3, A
PWNEXT2442:
JMP PWNEXT281 ;顯示處理
PWNEXT24:
CJNE A, #186, PWNEXT25
PWNEXT25:
JNC PWNEXT26
;電池電壓在10.5-14.5(186)之間
MOV A, PWUPSTU
CJNE A, #0H, KPP1
;等于0,屬于浮充階段
JMP KPW3
KPP1:
CJNE A, #0AAH, KPP2
MOV PWUPSTU, #55H
KPP2:
;屬于恒流階段!
SETB V2_C ;打開DC-DC高壓電源
;充電電流限制為50A,次級線圈平均電流約為4.2A,采樣值約為2.85V
MOV A, PWIOAV
CJNE A, #216, PWNEXT261
PWNEXT261:
JNC PWNEXT262
;小于216
MOV A, AD0DAT3
CJNE A, #13, PWNEXT2621
PWNEXT2621:
JC PWNEXT2622
;大于13,減1(調低DA轉換值),使輸出電流回升
DEC A
MOV AD0DAT3, A
PWNEXT2622:
JMP PWNEXT281 ;顯示處理
PWNEXT262:
CJNE A, #220, PWNEXT263
PWNEXT263:
JNC PWNEXT264
;在216-219之間, 認為合理!(即50A的充電電流)
JMP PWNEXT281 ;顯示處理
PWNEXT264:
;充電電流偏大
MOV A, AD0DAT3
CJNE A, #200, PWNEXT2641
PWNEXT2641:
JNC PWNEXT2642
;小于200,加1(調高DA轉換值),使輸出電流下降
INC A
MOV AD0DAT3, A
PWNEXT2642:
JMP PWNEXT281 ;顯示處理
PWNEXT26:
;電池電壓在14.5V以上(不是恒壓過渡階段,就是恒壓階段)
SETB V2_C ;打開DC-DC高壓電源
CJNE A, #200, PWNEXT27
PWNEXT27:
JC PWNEXT28
;>大于15.5V
;要關閉V2_C控制信號
CLR V2_C ;關閉DC-DC高壓電源
JMP KPW3
PWNEXT28:
;電池電壓在14.5-15.5之間
MOV A, PWUPSTU
CJNE A, #55H, KPW1
;說明曾經經歷過50A恒流充電過程,充電電壓應該允許達到14.7V
MOV PWUPSTU, #5AH ;進入恒流到恒壓的過渡階段
JMP PWNEXT281
KPW1:
CJNE A, #5AH, KPW2
;處于恒流到恒壓的過渡階段
MOV A, BATV
CJNE A, #190, KPW21
KPW21:
JNC KPW22
;小于190,即電池電壓在14.6-14.7V!屬于恒流到恒壓的過渡階段,電流任其變化
MOV AD0DAT3, #85 ;先將DA轉換器輸出預先置為1.1V
MOV PWTIME, #200 ;充電電流定時時間
JMP PWNEXT281
KPW22:
;達到了14.7V,即應該進入恒壓充電階段
;????
MOV PWUPSTU, #0A5H ;進入恒壓充電狀態
MOV AD0DAT3, #127 ;先將DA轉換器輸出預先置為1.65V
;????
JMP PWNEXT281
KPW2:
CJNE A, #0A5H, KPW3
;處于恒壓狀態充電狀態,對充電電流進行判別
MOV A, PWIOAV
CJNE A, #27, KPW31 ;如果切換點不是5A,則可在25-30之間選擇
KPW31:
JNC KPW32
;充電電流小于5A!切換充電方式
MOV A, PWTIME
CJNE A, #1, KPW321
KPW321:
JC KPW322
DEC PWTIME ;經歷了200*20ms,即4S后才清除標志
SJMP PWNEXT281 ;時間未到,退出!
KPW322:
;時間已經減到0,說明可以切換充電方式!
;????
MOV AD0DAT3, #154 ;先將DA轉換器輸出預先置為2.0V
;????
MOV PWUPSTU, #00H ;浮充狀態
JMP PWNEXT281
KPW32:
;當電流未下降到5A時,還是屬于恒壓階段,應對充電電壓進行監控!
;輸出電壓穩定在14.7V(189-192)之間,不滿足則調整DA轉換值(100-190)
MOV PWTIME, #200 ;充電電流定時時間
MOV A, BATV
CJNE A, #189, KPW33
KPW33:
JNC KPW34
;輸出電壓小于14.7
;小于189,應該適當提高充電電流(即減小DA轉換值)
MOV A, AD0DAT3
CJNE A, #100, KPW341
KPW341:
JC KPW342
;大于100, 應減小DA轉換值,使輸出電壓回升!
DEC A
MOV AD0DAT3, A
KPW342:
SJMP PWNEXT281
KPW34:
CJNE A, #192, KPW35
KPW35:
JNC KPW36
;在190-191之間,合理!
SJMP PWNEXT281
KPW36:
;大于192,應該適當降低充電電流(即提高DA轉換值)
MOV A, AD0DAT3
CJNE A, #190, KPW361
KPW361:
JNC KPW362
;增加DA轉換值!
INC A
MOV AD0DAT3, A
KPW362:
SJMP PWNEXT281
KPW3:
;此外屬于浮充狀態!
;屬于浮充狀態(電壓應該穩定在13.8附近),DA轉換調整范圍在125-210之間
MOV A, BATV
CJNE A, #177, KPW41
KPW41:
JNC KPW42
;在于177(即13.8V),應該調小DA轉換值,使電壓回升
MOV A, AD0DAT3
CJNE A, #125, KPW421
KPW421:
JC KPW422
DEC A
MOV AD0DAT3, A
KPW422:
SJMP PWNEXT281
KPW42:
CJNE A, #179, KPW43
KPW43:
JNC KPW44
;在177-178之間,合理!
SJMP PWNEXT281
KPW44:
;大于13.8V, 應該調大DA轉換值,使電壓下降!
MOV A, AD0DAT3
CJNE A, #210, KPW431
KPW431:
JNC KPW432
INC A
MOV AD0DAT3, A
; SJMP PWNEXT281
KPW432:
;索性關閉充電器
; CLR PWON ;關閉充電器
; SJMP PWNEXT282 ;僅僅顯示電壓
SJMP PWNEXT281
PWNEXT281:
;顯示處理
ANL LEDSTU1, #11001100B
ORL LEDSTU1, #00001100B;b3、b2為11(D205常亮)
SETB TEMPIN ;輸出高電平
SETB PWON ;啟動充電器
MOV A, LEDSTU2
ANL A, #00110000B
CJNE A, #00, PWNEXT282
;b5、b4為00(D203滅),說明不處于電壓顯示狀態
ANL LEDSTU2, #11001100B
ORL LEDSTU2, #00001100B ;處于電流顯示狀態
;b3、b2置為11(D202常亮),顯示充電電流
;為減小顯示閃爍性,每1S顯示刷新一次
JNB TIME05SB, EXIT
CLR TIME05SB ;清除顯示標志
MOV R1, PWIOAV
MOV R4, #01H
MOV R3, #0F4H ;比例因此,500(1F4H)
MOV R2, #220 ;為分母,要完成(R4,R3)*A/R2計算
;入口參數:
;R1為當前讀數,R4,R3為比例因子
;R2為分母,計算R1*(R4,R3)/R2
;出口參數:;商在R4\R3中, 余數在R5中。
;已經驗證過,正確!
LCALL CAL2 ;計算R1*(R4,R3)/R2
LCALL H16_BCD ;把(R4,R3中的)16進制數(不超過999)轉換
;為BCD碼,并送顯示緩沖區
ANL 2DH, #7FH ;顯示小數點
SJMP EXIT
PWNEXT282:
;顯示電池電壓
ANL LEDSTU2, #11010000B
MOV A, PWUPSTU
CJNE A, #00, PWNEXT283
;為00,表示已經充滿
ORL LEDSTU2, #00110000B;b5、b4為11(D203常亮,已滿)
SJMP PWNEXT292
PWNEXT283:
;未充滿,用慢閃
ORL LEDSTU2, #00010000B;b5、b4為01(D203慢閃,即在正在充電中)
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 ;顯示小數點
EXIT:
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
;入口參數:
;R1為當前讀數,R4,R3為比例因子
;R2為分母,計算R1*(R4,R3)/R2
;出口參數:商在R4\R3中, 余數在R5中。
;已經驗證過,正確!
PROC CAL2 ;計算R1*(R4,R3)/R2
CAL2:
;計算16位乘8位
MOV A, R3 ;取被乘數的低8位
MOV B, R1 ;取乘數
MUL AB
MOV R3, A ;乘積低8位送R3
MOV A, R4 ;取乘數的高8位
MOV R4, B ;乘積高8位送R4
MOV B, R1 ;取乘數
MUL AB ;計算A*C部分
ADD A, R4 ;加AB的高8位
MOV R4, A
MOV A, B ;取成績的高8位
ADDC A, #0 ;加上進位標志
mov R5, A ;最高8位(即b23-b16)
MOV R1, #16 ;移位16次(已經除數不小于128,即b7為1,
;利用C進行擴展)
LOOP1:
CLR C
MOV A, R3
RLC A
MOV R3, A
MOV A, R4
RLC A
MOV R4, A
MOV A, R5
RLC A
MOV R5, A
MOV F0, C
CLR C
SUBB A, R2 ;考慮連同標志位在內相減
ANL C, /F0
JC NEXT1
;夠減,取差
MOV R5, A ;送差值
MOV A, R3
ORL A, #01H ;商b0位置1
MOV R3, A
NEXT1:
DJNZ R1, LOOP1
;商在R4\R3中, 余數在R5中。
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
;把(R4,R3中的)16進制數(不超過999)轉換為BCD碼,并顯示
PROC H16_BCD ;把(R4,R3中的)16進制數(不超過999)轉換為BCD碼,并顯示
H16_BCD:
MOV R5, #0 ;百位碼
LOOP2:
CLR C
MOV A, R3
SUBB A, #100
MOV R6, A ;暫時保存在R6中
MOV A, R4
SUBB A, #0 ;減進位標志
MOV R7, A ;暫時保存在R7中
JC NEXT2
;夠減, 承認差,商加+1
MOV A, R7
MOV R4, A
MOV A, R6
MOV R3, A
INC R5
SJMP LOOP2
NEXT2:
;保留原來的值(由于差已小于99),即實際上只有R3有效
MOV A, R3
MOV B, #10
DIV AB
MOV DPTR, #DPDATA
MOVC A, @A+DPTR
MOV 2DH, A ;筆段碼送2DH單元(十位)
MOV A, B ;個位碼
MOVC A, @A+DPTR
MOV 2CH, A ;筆段碼送2CH單元(個位)
MOV A, R5 ;取百
MOVC A, @A+DPTR
MOV 2EH, A ;筆段碼送2EH單元(百位)
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
PROC FMQ1 ;蜂鳴器快閃爍設置(過熱)造成
FMQ1:
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #00, NEXT1
;空閑,應該快響
SJMP NEXT2
NEXT1:
CJNE A, #0C0H, EXIT
;11,應該快響
NEXT2:
ANL LEDSTU1, #10111111B
ORL LEDSTU1, #10000000B ;快響
EXIT:
;01,即低壓時不改變
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
PROC FMQEND ;關閉蜂鳴器故障音
FMQEND:
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #40H, NEXT1
;慢響,應該關閉
SJMP NEXT2
NEXT1:
CJNE A, #80H, EXIT
;10,即快響,應該關閉
NEXT2:
ANL LEDSTU1, #00111111B
EXIT:
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
PROC DC_ACSTU ;檢查逆變狀態,管理逆變器
DC_ACSTU:
MOV A, DABA_TC
JNB ACC.7, PWNEXT1
;DC-AC散熱片過熱
ANL LEDSTU2, #11110000B
ORL LEDSTU2, #00110000B;b5、b4為11(D203快閃)
SJMP PWNEXT21
PWNEXT1:
JNB ACC.3, PWNEXT2
;電池過熱
ANL LEDSTU2, #11010000B
ORL LEDSTU2, #00010000B;b5、b4為01(D203慢閃)
PWNEXT21:
CLR V2_C ;關閉DC-DC高壓電源
SETB LFACON ;關閉DC-AC
LCALL FMQ1 ;蜂鳴器快響設置(過熱)造成
ANL LEDSTU1, #11100000B
ORL LEDSTU1, #00100000B;b5、b4為10(D206快閃)
JMP PWNEXTD2 ;顯示電壓
;*****軟件陷阱
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -