?? 89lpc933(修改充電過程).asm
字號:
MOV R4, #3 ;重復(fù)寫入3次
LOOP1:
MOV DPTR, #YKQIDAT ;數(shù)據(jù)所在單元地址送DPTR
MOV R0, #58H
MOV R7, #2 ;寫入字節(jié)數(shù)據(jù)(最大為64字節(jié))
LCALL REWFLASH ;讀出-擦除-寫入
JNC NEXT31
;C為1,錯誤
DJNZ R4, LOOP1
SJMP NEXT3
NEXT31:
;正確,響一長聲
ANL LEDSTU1, #11000010B
ORL LEDSTU1, #11000010B;蜂鳴器響1S,狀態(tài)D204燈慢閃
CLR BELL ;開蜂鳴器
MOV TIMEBELL, #15 ;啟動時響1.5S,作為按鍵有效標(biāo)志
;再等待2S
MOV LUTIME, #2 ;限時2S
NEXT32:
CLR EA
MOV WFEED1, #0A5H
MOV WFEED2, #5AH ;順序執(zhí)行看門狗清零指令序列,強(qiáng)迫WDCON裝入
SETB EA
MOV A, LUTIME
CJNE A, #0, NEXT32
;延遲時間到
NEXT3:
ANL WUSTU, #0E0H
EXIT:
ANL LEDSTU1, #0FCH ;關(guān)閉D204
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復(fù)位標(biāo)志置1,強(qiáng)迫復(fù)位
;*****軟件陷阱結(jié)束*******
;狀態(tài)掃描
PROC STUSCAN ;執(zhí)行鍵盤及溫度檢測
STUSCAN:
;檢測周波功率管及電池溫度
MOV A, DABA_TC
RL A
MOV C, P0.0 ;讀p0.0(即電池溫度當(dāng)前狀態(tài))
MOV ACC.0, C ;送b0位
MOV C, P1.4 ;讀p1.4(即DC-AC溫度當(dāng)前狀態(tài))
MOV ACC.4, C ;送b4位
ANL A, #77H ;僅僅保留狀態(tài)位
ANL DABA_TC, #88H ;清除狀態(tài)位
ORL DABA_TC, A ;回送狀態(tài)
;判別狀態(tài)
ANL A, #07H ;判別電池狀態(tài)
CJNE A, #07H, KEYNEXT11
;為111,即正常
ANL DABA_TC, #0F7H;b3清0,即正常
SJMP KEYNEXT12
KEYNEXT11:
CJNE A, #00H, KEYNEXT12
;為000態(tài),即電池過熱
ORL DABA_TC, #08H ;b3置為1(過熱標(biāo)志)
CLR PWON ;關(guān)閉充電電路
SETB LFACON ;關(guān)閉逆變系統(tǒng)
CLR V2_c ;關(guān)閉DC-DC
KEYNEXT12:
;其他狀態(tài)不理會
;判別Dc-AC溫度
MOV A, DABA_TC
ANL A, #70H ;判別DC-AC散熱片溫度狀態(tài)
CJNE A, #70H, KEYNEXT13
;為111,即正常
ANL DABA_TC, #7FH ;b7清0,即正常
SJMP KEYNEXT14
KEYNEXT13:
CJNE A, #00H, KEYNEXT14
;為000態(tài),即過熱
ORL DABA_TC, #80H ;b7置為1(過熱標(biāo)志)
SETB LFACON ;關(guān)閉逆變系統(tǒng)
CLR V2_c ;關(guān)閉DC-DC
KEYNEXT14:
;其他狀態(tài)不理會
;判別充電器散熱片溫度
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態(tài),正常
ANL PWONSTU, #0F7H ;b3位清0(正常)
SJMP KEYNEXT22
KEYNEXT21:
CJNE A, #0, KEYNEXT22
;為000態(tài),充電器散熱片過熱
ORL PWONSTU, #08H ;b3位置為1(過熱)
CLR PWON
KEYNEXT22:
;其他狀態(tài)不理會
KEYNEXT2:
MOV A, PUTIME
CJNE A, #0, KEYEXIT;上電延遲期間不執(zhí)行
;執(zhí)行按鍵掃描
MOV A, KEYSTU
RL A
MOV C, P1.7 ;KEY0(錄碼)
ANL C, P1.6 ;KEY1(顯示狀態(tài)切換)
ANL C, P2.3 ;KEY2(啟動/關(guān)閉)
MOV ACC.0, C ;按鍵狀態(tài)送b0
ANL A, #07H
ANL KEYSTU, #0F8H
ORL KEYSTU, A;回寫按鍵狀態(tài)
;判別按鍵狀態(tài)
CJNE A, #100B, KEYNEXT3
;為100態(tài),已經(jīng)按下了指定時間,啟動按鍵掃描
JB KEYSTU.7, KEYEXIT
;上一次按鍵已經(jīng)處理
ANL KEYSTU, #0FH
JB P1.7, KEYNEXT31
;p1.7為低電平,即key0被按下
MOV A, #10000000B
ORL KEYSTU, A ;按鍵名為0,有效標(biāo)志置1
SJMP KEYNEXT34
KEYNEXT31:
JB P1.6, KEYNEXT32
;p1.6為低電平,即key1被按下
MOV A, #10010000B
ORL KEYSTU, A ;按鍵名為1,有效標(biāo)志置1
SJMP KEYNEXT34
KEYNEXT32:
JB P2.3, KEYNEXT33
;p2.3為低電平,即key2被按下
MOV A, #10100000B
ORL KEYSTU, A ;按鍵名為2,有效標(biāo)志置1
SJMP KEYNEXT34
KEYNEXT33:
;沒有按鍵被按下,錯誤
SJMP KEYEXIT
KEYNEXT34:
;響蜂鳴器,時間為0.5s
MOV A, LEDSTU1
ANL A, #0C0H
CJNE A, #00H, KEYEXIT
;處于停止?fàn)顟B(tài),可以設(shè)置為快響
ORL LEDSTU1, #0C0H ;單音狀態(tài)
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:
;其他狀態(tài)不理會
KEYEXIT:
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復(fù)位標(biāo)志置1,強(qiáng)迫復(fù)位
;*****軟件陷阱結(jié)束*******
PROC HEXTOBCD ;把存放在A中的進(jìn)制轉(zhuǎn)化為十進(jìn)制,并顯示緩沖區(qū)
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 ;取余數(shù)(即個位)
MOVC A, @A+DPTR
MOV 2CH, A ;筆段碼送2CH單元(個位)
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復(fù)位標(biāo)志置1,強(qiáng)迫復(fù)位
;*****軟件陷阱結(jié)束*******
PROC ADPROC
ADPROC:
;AD轉(zhuǎn)換中斷
PUSH PSW
PUSH ACC
MOV PSW, #08H
;CLR RS1
;SETB RS0 ;使用1區(qū)
MOV A, #BATVBUF ;緩沖區(qū)首地址送A
ADD A, BATVPN ;加記錄指針
MOV R0, A ;R0指向緩沖區(qū)對應(yīng)的存儲單元
MOV @R0, AD1DAT1 ;取通道1(電池電壓取樣)
INC BATVPN
MOV A, BATVPN
CJNE A, #8, BVNEXT0
BVNEXT0:
JC BVexit
;達(dá)到8個點(diǎn)
MOV BATVPN, #0 ;指針回0!
MOV R0, #BATVBUF ;緩沖區(qū)首地址送R0
LCALL CALAV ;計算平均值!
MOV BATV, A ;取平均值!
CJNE A, #200, BVNEXT1
BVNEXT1:
JC BVNEXT2
;由于電池電壓允許范圍為15.5,經(jīng)分壓后為2.583(對應(yīng)值200)
;大于200過壓,要關(guān)閉
CLR V2_C ;關(guān)閉電壓轉(zhuǎn)換輸出
SETB LFACON ;關(guān)閉DC-AC轉(zhuǎn)換
SJMP BVexit
BVNEXT2:
CJNE A, #129, BVNEXT3
BVNEXT3:
JC BVNEXT4
;在10-15.5之間
SJMP BVexit
BVNEXT4:
;電池電壓小于10V
;小于10.0(延遲1S關(guān)閉
JNB LFACON, BVNEXT41
;處于逆變狀態(tài)
JB LVTIMEB, BVNEXT41
SETB LVTIMEB ;低壓計時標(biāo)志有效
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 ;關(guān)閉充電器啟動信號
BVexit:
;處理充電狀態(tài)的采樣電流
JNB PWON, PWNEXT2
;充電處于打開狀態(tài),記錄充電電流
MOV A, #PWIIBUF ;緩沖區(qū)首地址送A
ADD A, PWIOPN ;加記錄指針
MOV R0, A ;R0指向緩沖區(qū)對應(yīng)的存儲單元
MOV @R0, AD1DAT0 ;取通道0(充電電流采樣值)
INC PWIOPN ;指向下單元
MOV A, PWIOPN
CJNE A, #8, PWNEXT1
PWNEXT1:
JC PWEXIT
;達(dá)到8個點(diǎn),要求平均
MOV R0, #PWIIBUF ;緩沖區(qū)首地址送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 ;軟件復(fù)位標(biāo)志置1,強(qiáng)迫復(fù)位
;*****軟件陷阱結(jié)束*******
;入口參數(shù):R0指向緩沖區(qū)首地址!
;出口參數(shù):平均結(jié)果在A中!
PROC CALAV ;計算平均值!
CALAV:
MOV R3, #0
MOV R2, #0 ;累加單元清0
MOV R1, #8 ;一共計算8個點(diǎn)
PWLOOP1:
MOV A, R2
ADD A, @R0
MOV R2, A
MOV A, R3
ADDC A, #0 ;加進(jìn)位標(biāo)志
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
;結(jié)果在A中
RET
END
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復(fù)位標(biāo)志置1,強(qiáng)迫復(fù)位
;*****軟件陷阱結(jié)束*******
;------RTC溢出中斷服務(wù)程序-----
;每1ms中斷一次
PROC RTC
RTC:
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL
MOV PSW, #10H ;用2區(qū)
; SETB RS1
; CLR RS0
SETB TIME_1ms ;1ms定時時間到標(biāo)志
MOV A, ACSTU
RL A
MOV C, ACIN
MOV ACC.0, C
ANL A, #07H
ANL ACSTU, #0F8H ;清除狀態(tài)
ORL ACSTU, A ;合并到交流狀態(tài)中
CJNE A, #100B, ACNEXT1
;等于100,即沒有交流(這意味著斷電后2ms檢測到)
CLR PWON ;關(guān)閉充電器
ANL ACSTU, #0F7H ;將b3置為0(無交流標(biāo)志)
JNB KEY2STU, ACNEXT11
;主機(jī)開關(guān)處于開態(tài),應(yīng)檢查并塊啟動逆變
CLR EA ;關(guān)閉中斷
SETB KUAION ;快速啟動標(biāo)志
LCALL DC_ACSTU ;檢查逆變狀態(tài),管理逆變器
CLR KUAION ;清除快速啟動標(biāo)志
JB LFACON, ACNEXT111
;低電平,說明其他各項(xiàng)指標(biāo)正常,已經(jīng)啟動
WAIT1:
MOV A, RTCCON
JNB ACC.7, WAIT1 ;延遲等待RTC定時器時間到
ANL RTCCON, #7FH ;清除中斷標(biāo)志
;1MS定時時間到了!
SETB LFACON ;置為高電平,形成高電平
WAIT2:
MOV A, RTCCON
JNB ACC.7, WAIT2 ;延遲等待RTC定時器時間到
ANL RTCCON, #7FH ;清除中斷標(biāo)志
;高電平1MS定時時間到了!
CLR LFACON ;置為低電平,完成啟動快啟動脈沖頭
;響1S作為切換標(biāo)志
ORL LEDSTU1, #0C0H;響1S
CLR BELL ;開蜂鳴器
MOV TIMEBELL, #10 ;啟動時響1S,作為啟動的提示
ACNEXT111:
;不滿足啟動條件
SETB EA ;開中斷退出
ACNEXT11:
;主機(jī)關(guān)閉,無法啟動
SJMP ACEXIT
ACNEXT1:
CJNE A, #101B, ACNEXT2
;干擾,作為111處理
ORL ACSTU, #07H ;作111態(tài)處理
SJMP ACEXIT
ACNEXT2:
CJNE A, #010B, ACNEXT3
;干擾,作為000處理
ANL ACSTU, #0F8H ;作000態(tài)處理
SJMP ACEXIT
ACNEXT3:
CJNE A, #111B, ACNEXT4
;市電存在或恢復(fù),判別原來處于什么狀態(tài)?
ORL ACSTU, #00001000B ;恢復(fù)有電狀態(tài)
SETB LFACON ;停止DC-AC轉(zhuǎn)換
; 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時間到標(biāo)志
MOV LEDTIME, #0
LEDNEXT2:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -