?? 89lpc933(修改充電過程).asm
字號:
FMCON EQU 0E4H
FMDATA EQU 0E5H
FMADRL EQU 0E6H
FMADRH EQU 0E7H
;-------引腳分配-------
PWADO BIT P2.0 ;DAC0輸出,接充電器同相放大器輸入
;僅為高阻輸入(復位置為高)。
V2_C BIT P2.1 ;輔助電源控制(高電平有效),推挽或準雙向(優先)
SDI BIT P2.2 ;串行數據輸出端(一般處于準雙向,使用時置為推挽模式
;平時置為高電平.
KEY2 BIT P2.3 ;按鍵輸入2, 定義為準雙向,低電平有效(以便利用電阻上拉)
PCLK BIT P2.4 ;并行鎖存脈沖輸出,(一般處于準雙向,使用時置為推挽模式)
;平時置為高電平.(上升沿有效)
SCLK BIT P2.5 ;串行鎖存脈沖輸出,(一般處于準雙向,使用時置為推挽模式)
;平時置為高電平.(上升沿有效)
ACIN BIT P2.6 ;市電檢測輸入,高阻輸入(高電平有效)
PWON BIT P2.7 ;充電器啟動控制, (高電平有效),準雙向
;MOV P2M2, #00000000B
;MOV P2M1, #01000001B
;MOV P2, #01111101B ;數據線先定義為輸入狀態。
;***P0****
P00 BIT P0.0 ;電池溫度檢測輸入端(定義為高阻輸入),低電平有效。
PWICH BIT P0.1 ;AD10轉換輸入端(充電器電流采樣輸入),定義為高阻輸入.
BAT_IN BIT P0.2 ;AD11轉換輸入端(電池電壓采樣輸入),定義為高阻輸入.
TEMPIN BIT P0.3 ;定義為輸出(在逆變狀態下,輸出低電平;在充電狀態輸出高電平)
;漏極開路狀態
;BIT P0.4 ;未用
;BIT P0.5 ;未用
;BIT P0.6 ;未用
P07 BIT P0.7 ;解碼模塊輸入,高阻輸入(高電平表示有信號輸入)
;MOV P0M2, #00001000B ;缺省設置
;MOV P0M1, #11111111B
;MOV P0, #11111111B ;數據線先定義為輸入狀態。
;MOV PTOAD,#00000110B ;禁止P0.1-P0.3數字信號輸入
LFACON BIT P1.0 ;周波啟動控制,輸出,漏極開路,低電平有效。
RXD0 BIT P1.1 ;串行接收(高阻輸入)。
BELL BIT P1.2 ;蜂鳴器輸出(漏極開路),低電平有效
INT0 BIT P1.3 ;充電器過熱中斷(高阻輸入).
INT1 BIT P1.4 ;周波變換器過熱中斷(高阻輸入).
;BIT P1.5 ;復位輸入
KEY1 BIT P1.6 ;按鍵輸入1, 定義為準雙向,低電平有效(以便利用電阻上拉)
KEY0 BIT P1.7 ;按鍵輸入0, 定義為準雙向,低電平有效(以便利用電阻上拉)
;MOV P1M2, #00000101B
;MOV P1M1, #00111111B
;MOV P1, #11111111B
;***P3口****
; BIT P3.0 ;未用
; BIT P3.1 ;未用
;保留20、21H兩個具有位地址字節
MSTU DATA 22H ;主機狀態
;B2~b0位定義輸入電壓狀態
;000-(電池電壓小于9.0V)
;001-電池電壓在9-10.0之間,小電流充電
;010-電池電壓在10.0-10.5V,小電流充電
;011-電池電壓在10.5-13.7V,大電流充電
;100-電池電壓在13.8-15.5之間,涓流充電
;101-電池電壓在15.5以上
LVTIMEB BIT 00H ;低壓計時標志(1有效)
TIME_1ms BIT 01H ;1ms時間到標志
TIME_20ms BIT 02H ;20ms時間到標志
ACIO_OV BIT 03H ;過流/短路標志有效
KEY2STU BIT 04H ;主機開關狀態
PWIO_OV BIT 05H ;充電器過流標志
TIME05S bit 06H ;指示燈狀態
TIME01S bit 07H ;指示燈狀態
TIME_20msp BIT 08H ;充電器管理時間到標志
KUAION BIT 0AH ;快速啟動標志
LEDRUN BIT 0BH ;允許執行LED狀態改變標志
TIME05SB BIT 0CH ;在充電狀態下電流顯示標志
WUSTU DATA 28H
HEADV BIT WUSTU.0 ;找同步頭/解數據狀態標志(0-同步頭無效
;1-同步頭有效,在解數據碼)
LXJIE BIT WUSTU.1 ;連續解碼有效標志(1-有效,0-無效)
JIEMA BIT WUSTU.2 ;解碼緩沖區數據有效標志(1-有效,0-無效)
;000——脈沖頭無效
;001——脈沖頭有效,解數據幀
;010——第一幀解碼成功的過渡狀態
;011——
;11X——數據有效,但發送未停止
;100——數據有效,發送停止
JINXUNP BIT WUSTU.3 ;解碼數據處理標志
DAFRM BIT WUSTU.4 ;幀起始標志
;WUSTU.5 ;在解碼過程中記錄載波長短標志(0-短,1-長)
LEDSTU1 DATA 29H ;D206-D204指示燈狀態位
;b1、b0定義d204指示燈狀態
;00-非旁路狀態
;11-旁路狀態
;10-錄碼狀態
;b3、b2定義d205指示燈狀態
;00-非充電狀態
;11-充電狀態
;01-電池過熱狀態
;10-充電器過熱
;b5、b4定義d206指示燈狀態
;00-非逆變狀態
;11-逆變狀態
;01-電池過熱狀態
;10-DC-AC過熱
;b7、b6定義蜂鳴器狀態
;00-不響
;01-慢響(響1S_停1S)
;10-快響(響0.2S_停0.2S)
;11-常響(單音)
LEDSTU2 DATA 2AH ;D203-D201指示燈狀態位
;b1、b0定義d201指示燈狀態
;00-滅
;01-慢閃(過載)
;10-快閃(短路)
;11-正常
;b3、b2定義d202指示燈狀態(輸出電壓或充電電流)
;b6、b5定義d203指示燈狀態(電池電壓)
DISPBUF DATA 2BH ;顯示緩沖區(2B-2E)
;2BH為狀態位
;b5——D206燈(綠色),逆變狀態
;b4——D205燈(紅色),充電狀態
;b3——D204燈(黃色),旁路狀態
;b2——D203燈(綠色),電池電壓
;b1——D202燈(紅色),輸出電流(逆變)/充電電流(充電)狀態
;b0——D201燈(黃色),輸出功率(逆變狀態)
;2C為個位
;2D為十位
;2E為百位
KEYSTU DATA 2FH ;按鍵狀態及按鍵值(b7為按鍵有效標志,b6-b4記錄
;按鍵值;b2-b0記錄按鍵狀態)
TIMEB DATA 30H ;基本定時單元(每1ms加+1)
LVTIME DATA 31H ;低壓定時時間
BATV DATA 32H ;電池電壓采樣值
ACSTU data 33h ;交流狀態采樣寄存器
;b2-b0記錄最近3個ms交流采樣結果
;b3記錄當前狀態交流狀態(1-存在;0-不存在)
DABA_TC DATA 34H ;DC-AC散熱片及電池溫度狀態
;b6-b4記錄DC-AC溫度狀態;b7記錄AC-DC溫度檢測結果
;(1-過熱;0-正常)
;b2-b0記錄電池溫度狀態;b3記錄電池溫度檢測結果
;(1-過熱;0-正常)
PWONSTU DATA 35H ;充電器散熱片溫度狀態
;b2-b0記錄充電器溫度狀態;b3記錄充電器溫度檢測結果
;(1-過熱;0-正常)
TIMEBELL DATA 36H ;蜂器器鳴時間(0.1s)
PUTIME DATA 37H ;上電延遲
PWUPSTU DATA 38H ;充電狀態(AA、55)
BATVPN DATA 39H ;電池電壓采樣點數
PWTIME DATA 3AH ;恒壓充電定時時間
LFACTIME DATA 3BH ;LFAC啟動延遲
RXDBUF DATA 40H ;40H、41H、42H、43H、44H(5個字節)作為接收緩沖
RXDSP DATA 45H ;接收指針
RXDBUFD DATA 46H ;串行接收數據保存區
;46H為標志位、47H為電壓、48H為電流、49H為脈沖寬度
RXDBUFEV DATA 4AH ;串行接收有效標志
LEDTIME DATA 4BH ;LED定時時間
PWIOAV DATA 4CH ;充電電流
PWIOPN DATA 4DH ;充電電流平均點數
LUTIME data 4EH ;錄碼定時時間
ACIO_TIME DATA 4FH ;過載過流關閉延遲
;50-57H作為解碼接收緩沖區,采用中斷方式接收,因此50-57不宜再使用。
BUFF0 DATA 50H ;接收緩沖區最高位
;占據50-53H
BUFFS0 DATA 54H ;接收緩沖區最高位
;占據54H-57H
CNTB DATA 5CH ;解碼位
TIMEL DATA 5AH ;記錄高電平時間(解碼用)
TIMEH DATA 5BH ;記錄低電平時間(解碼用)
;(振蕩電阻為4.7M, a=105u, 晶振頻率為7.3728MHz)
;利用鍵盤中斷檢測慢脈沖信號高低電平時間
;無線編碼信號從P0.7引腳輸入
PWIIBUF DATA 80H ;80-87H,共8個單元存放充電電流8個采樣值
BATVBUF DATA 88H ;88-8FH,共8個單元存放電池電壓8個采樣值
ORG 0000H
LJMP MAIN
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
ORG 0023H
LJMP RXDPROC ;串行接收中斷
;用2區(與基準時間RTC同級)
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
ORG 003BH
LJMP KBINT ;使用第3工作寄存器區
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
ORG 0053H
LJMP RTC ;實時時鐘中斷入口地址
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
;用2區(與串行口同級)
ORG 0073H
LJMP ADPROC ;使用1區
;*****軟件陷阱開始*******
NOP
NOP
ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
ORG 0080H
PROC MAIN
MAIN:
;調整CCLK頻率
;-----------將CLKLP位置1,以降低系統功耗---------------
ORL AUXR1, #80H
ORL PCONA, #00101100B ;由于沒有使用比較器、I2C,因此關閉其電源
MOV SP, #0DFH ;把E0-FF之間作為堆棧區
;變量初始化區
;初始化看門狗
MOV WDL, #195 ;初始化裝載寄存器
MOV WDCON, #10100101B ;通過初始化控制器寄存器,設定PRE2~PRE0位,確定分頻值
;N=5
MOV WFEED1, #0A5H
MOV WFEED2, #5AH ;順序執行看門狗清零指令序列,強迫WDCON裝入
;溢出時間約為500ms左右
MOV DPTR, #ICBF
CLR A
MOVC A, @A+DPTR
CJNE A, #55H, ICNEXT1
INC DPTR
CLR A
MOVC A, @A+DPTR
CJNE A, #0AAH, ICNEXT1
;已經初始化過!
SJMP ICEXIT
ICNEXT1:
LCALL ICPROC ;初始化標志
;強制復位
; CLR EA
; SJMP $ ;使看門狗強制復位
ICEXIT:
MOV A, RSTSRC ;讀復位標志
ANL A, #00110000B
XRL A, #0
JZ NEXT1
;不為0,可能是上電復位、也可能是掉電復位、軟件復位
;清除內存
MOV R0, #1 ;清除01H-fFH單元
LOOP:
MOV @R0, #0
INC R0
CJNE R0, #00H, LOOP
MOV PUTIME, #10 ;延遲
CLR KEY2STU ;即上電、掉電復位后默認開關處于關閉
MOV DABA_TC, #77H ;開始置為正常狀態
mov PWONSTU, #07h ;開始時認為充電器散熱溫度正常
; MOV ACSTU, #00 ;開始時默認無電
;初始化蜂鳴器
ORL LEDSTU1, #0C0H ;單音狀態
CLR BELL ;開蜂鳴器
MOV TIMEBELL, #10
MOV LEDTIME, #5 ;初始值為5
ANL RSTSRC, #11001111B;清除上電、掉電復位標志
NEXT1:
MOV KEYSTU, #07H ;開始時按鍵狀態置為111
MOV RXDBUFEV, #55H ;無效字節(接收緩沖區無效標志)
MOV R0, #RXDBUFD
MOV @R0, #55H ;復位后,將46H單元置為無效狀態
;日歷時鐘初始化
MOV RTCH, #0 ;初始化重裝初值
MOV RTCL, #58 ;CCLK為7.3728MHz,當RTCL初值為58時
;溢出時間為1ms。
MOV RTCCON, #01100011B;選擇CCLK作為RTC時鐘,允許RTC溢出中斷,
;啟動RTC計數器
MOV TMOD, #00100001B ;T0工作在方式1(作解碼定時器,禁止其中斷)
;T1作為波特率發生器(工作在方式2,自動重裝初值)
;CCLK頻率為7.3728MHz,波特率為1200,對應初值C為160(不倍增)
MOV TL1, #160 ;初值為160
MOV TH1, #160
;初始化串行口
MOV SCON, #11010000B ;方式3、SM2為0,即RB8為奇偶檢驗位
;REN為1,允許串行接收
MOV P2M2, #00000000B
MOV P2M1, #01000001B
ANL P2, #01111101B ;數據線先定義為輸入狀態。
; MOV P2, #01111101B ;數據線先定義為輸入狀態。
MOV P1M2, #00000101B
MOV P1M1, #00101111B
; MOV P1, #11111111B
MOV P0M2, #00001000B ;缺省設置
MOV P0M1, #11111111B
; MOV P0, #11111111B ;數據線先定義為輸入狀態。
;初始化AD轉換器
MOV ADINS, #38H ;選擇AD10通道(充電電流采樣);
;AD11通道(電池電壓采樣);
;AD13未用
;選擇AD03通過(作為DAC0使用)
MOV ADMODA, #01000000B ;ADC1工作在“自動掃描,連續轉換”模式
;AD10通道(充電電流采樣)存放在AD1DAT0;
;AD11通道(電池電壓采樣)存放在AD1DAT1;
;AD13未用
MOV ADMODB, #01100100B ;對CCLK進行4分頻后作為AD時鐘(7.3728MHz/4)。
;使用AD功能,非DA功能。
;由于電流、電壓范圍不同。
;DAC0工作在DAC0
MOV ADCON1, #01000101B ;采用立即啟動方式,禁止邊界中斷、允許AD轉換結束中斷。
MOV ADCON0, #00000100B ;允許ADC0工作。
;從P0.7引腳輸入
MOV KBMASK, #80H ;屏蔽除P0.7引腳外的其他引腳
MOV KBPATN, #80H ;假設無線接收模塊沒有信號時輸出高電平
MOV KBCON, #00H ;PATN_SEL位為0,即開始時采用不匹配中斷。
;檢測下降沿后啟動T0計數器,并將PATN_SEL位
;置1,采用匹配時中斷
;SETB EKBI ;允許鍵盤中斷(中斷控制寄存器具有位尋址功能)
;中斷初始化
MOV IEN0, #11010000B
; CLR ET0
; CLR ET1 ;禁止T1中斷
; SETB ES
; SETB EA
; SETB EWDRT ;允許看門狗/實時時鐘中斷
ORL IEN1, #10000010B
; SETB EAD ;允許AD中斷
; SETB EKBI ;允許鍵盤中斷(中斷控制寄存器具有位尋址功能)
; CLR TR0 ;T0啟動由鍵盤中斷程序控制
ORL IP1H, #02H ;鍵盤中斷級別置為最高
SETB PS
SETB TR1
END
;*****軟件陷阱開始*******
; NOP
; NOP
; ORL AUXR1, #08H ;軟件復位標志置1,強迫復位
;*****軟件陷阱結束*******
;主程序
PROC MAINPROC
MAINPROC:
;上電延遲10*0.1S,即1s
PUWAIT:
CLR EA
MOV WFEED1, #0A5H
MOV WFEED2, #5AH ;順序執行看門狗清零指令序列,強迫WDCON裝入
SETB EA
MOV A, PUTIME
CJNE A, #0, PUWAIT
;目的是為了檢測電池電壓、交流狀態
;延遲后正式開始循環位置
RUN:
CLR EA
MOV WFEED1, #0A5H
MOV WFEED2, #5AH ;順序執行看門狗清零指令序列,強迫WDCON裝入
SETB EA
JNB KEY2STU, NODISPEXIT
;在打開狀態下執行
JNB LEDRUN, NODISPEXIT
LCALL LEDROC ;指示燈及鳴響處理
CLR LEDRUN
NODISPEXIT:
;校驗串行接收并開放串行接收
MOV A, RXDBUFEV
CJNE A, #0AAH, RXDEXIT
;串行接收緩沖區有效,可以校驗
MOV R1, #RXDBUF
MOV R2, #4 ;對4個字節求和
CLR A ;清累加器
RXDLOOP1:
ADD A, @R1
INC R1
DJNZ R2, RXDLOOP1
ANL A, #7FH ;僅保留低7位
XRL A, @R1 ;與和單元進行校驗
JZ RXDNEXT11
;錯誤,放棄
SJMP RXDNEXT1
RXDNEXT11:
;正確
MOV R1, #RXDBUF
MOV A, @R1
CJNE A, #0EAH, RXDNEXT12
;處于工作狀態,要檢查脈沖寬度是否合理?
;檢查有無電流輸出!
MOV R1, #RXDBUF+2
MOV A, @R1
CJNE A, #12, RXDNEXT121
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -