?? battery.asm
字號:
;----------------------------------
; 智能充電器實例
;功能:通過定時器定時從AD上讀取數(shù)據(jù),根據(jù)不同的電壓選擇不同的控制
; 充電方案,使用PWM控制輸出脈寬來控制電流
;-----------------------------------
ORG 0000H
LJMP START
ORG 0003H
LJMP EXTERN_INT ; 外中斷入口
ORG 000BH
LJMP TIMER0_INT ; 定時器中斷入口
;-----------------------
; 程序開始,初始化各個寄存器以及標(biāo)志位
;-----------------------
START:
MOV SP,#050H ; 設(shè)置堆棧
MOV R0,#030H ; 設(shè)置AD存儲單元初始地址
MOV IE,#0FFH ; 打開所有中斷
MOV DPTR,#78FFH ; 采集通道首地址,只使用一路AD就可以
MOV R0,#40H
MOV @R0,#00H ; 清除方案選擇位
MOV R0,#40H
MOV @R0,#00H ; 清除方案選擇觸發(fā)位
MOV R1,#042H
MOV @R0,#00H ; 清除定時器計數(shù)器
LCALL TIMER1_INIT
;-----------------------
; 進入循環(huán),查詢標(biāo)志位,采取不同的方案
;-----------------------
LOOP:
MOV R0,#30H ; 30H是AD轉(zhuǎn)換的地址,將數(shù)據(jù)和幾個值進行比較,確定方案
MOV A,@R0
SUBB A,#30H ; 當(dāng)電壓很小的時候,采用第一種方案,向引腳PWM發(fā)送占空比為10%的信號
JC PROCESS_01
MOV A,@R0
SUBB A,#90H
JC PROCESS_02 ; 當(dāng)電壓較小的時候,采用第二種方案,向引腳PWM發(fā)送占空比為20%的信號
MOV A,@R0
SUBB A,#90H
JZ PROCESS_03 ; 當(dāng)電壓正好的時候,采用第三種方案,向引腳PWM發(fā)送占空比為50%的信號
MOV A,#04H ; 當(dāng)電壓超出的時候,采用第四種方案,向引腳PWM發(fā)送占空比為0%的信號
LJMP PROCESS_04
CLEAR_FLAG:
MOV R0,#40H ; 清除方案選擇位
MOV @R0,#00H
MOV R0,#41H ; 清除觸發(fā)位
MOV @R0,#00H
LJMP LOOP
PROCESS_01:
MOV R1,#040H
MOV @R1,#01H ; 選擇方案1
PROCESS_01_NEXT:
SETB P2.0 ; 將和PWM連接的管腳置高
MOV R1,#0F0H
MOV R0,#00H
PROCESS_01_01:
DJNZ R1,PROCESS_01_01
DJNZ R0,PROCESS_01_01 ; 空跑16*256*2個周期
CLR P2.0 ; 將和PWM連接的管腳置低
MOV R1,#070H
MOV R0,#00H
PROCESS_01_02:
DJNZ R1,PROCESS_01_02
DJNZ R0,PROCESS_01_02 ; 空跑16*256*2*9個周期
MOV R1,#041H ; 當(dāng)方案改變標(biāo)志位到來的時候,清除標(biāo)志并且重新進行判斷
CJNE @R1,#00H,CLEAR_FLAG
SJMP PROCESS_01_NEXT
PROCESS_02:
MOV R1,#040H
MOV @R1,#02H ; 選擇方案2
PROCESS_02_NEXT:
SETB P2.0 ; 將和PWM連接的管腳置高
MOV R1,#0E0H
MOV R0,#00H
PROCESS_02_01:
DJNZ R1,PROCESS_02_01
DJNZ R0,PROCESS_02_01 ; 空跑16*256*2個周期
CLR P2.0 ; 將和PWM連接的管腳置低
MOV R1,#080H
MOV R0,#00H
PROCESS_02_02:
DJNZ R1,PROCESS_02_02
DJNZ R0,PROCESS_02_02 ; 空跑16*256*2*8個周期
MOV R1,#041H ; 當(dāng)方案改變標(biāo)志位到來的時候,清除標(biāo)志并且重新進行判斷
CJNE @R1,#00H,CLEAR_FLAG
SJMP PROCESS_02_NEXT
PROCESS_03:
MOV R1,#040H
MOV @R1,#03H ; 選擇方案3
PROCESS_03_NEXT:
SETB P2.0 ; 將和PWM連接的管腳置高
MOV R1,#0B0H
MOV R0,#00H
PROCESS_03_01:
DJNZ R1,PROCESS_03_01
DJNZ R0,PROCESS_03_01 ; 空跑16*256*2*2個周期
CLR P2.0 ; 將和PWM連接的管腳置低
MOV R1,#0B0H
MOV R0,#00H
PROCESS_03_02:
DJNZ R1,PROCESS_03_02
DJNZ R0,PROCESS_03_02 ; 空跑16*256*2*7個周期
MOV R1,#041H ; 當(dāng)方案改變標(biāo)志位到來的時候,清除標(biāo)志并且重新進行判斷
CJNE @R1,#00H,CLEAR_FLAG
SJMP PROCESS_03_NEXT
PROCESS_04:
CLR P2.0
MOV R1,#040H
MOV @R1,#04H ; 選擇方案4
MOV R1,#041H
CJNE @R1,#00H,CLEAR_FLAG
SJMP PROCESS_04
TIMER1_INIT:
ANL TMOD,#0FH ; 設(shè)置定時器1為方式2
ORL TMOD,#10H
MOV TMOD,#21H ; 定時器0工作在方式1
MOV PCON,#080H
CLR TR1 ; 禁止定時器1
SETB EA
SETB ET1
SETB ET0
SETB PT0 ; 定時器0中斷優(yōu)于串口中斷
CLR TF1
MOV TL0,#00H
MOV TH0,#01FH ; 定時器0中斷發(fā)生時間為62.5毫秒
SETB TR0 ; 使能定時器0
CLR TF0
RET;
;-----------------------
; 進入定時器中斷,每500毫秒設(shè)置一次標(biāo)志位
;-----------------------
TIMER0_INT:
PUSH ACC ; 累加器入棧
PUSH PSW ; 程序狀態(tài)字入棧
MOV PSW,#18H ; 切換寄存器區(qū)域
CLR TF0 ; 清除定時器中斷TF0
CLR TR0 ; 禁止定時器0
MOV TL0,#00H
MOV TH0,#01FH ; 定時器0中斷發(fā)生時間為6
CLR TF0 ; 清除溢出中斷位
MOV R1,#042H
INC @R1 ; 增加計數(shù)器的值,到8為止,這樣達(dá)到500毫秒
CJNE @R1,#08H,TIMER0_READY
MOV @R1,#00H ; 清除計數(shù)器的值
MOV R1,#041H ; 設(shè)置標(biāo)志位,每500毫秒重新選擇方案
MOV @R1,#01H
TIMER0_READY:
SETB TR0 ; 使能定時器0
POP PSW ; 程序狀態(tài)字出棧
POP ACC ; 累加器出棧
RETI
;-----------------------
; 進入外部中斷,每進入一次讀取ADC的值
;-----------------------
EXTERN_INT:
PUSH ACC ; 累加器壓棧
PUSH PSW ; 程序狀態(tài)字壓棧
MOV PSW,#010H ; 切換寄存器區(qū)域
MOV DPTR,#78FFH ; AD轉(zhuǎn)換器首地址
MOVX A,@DPTR ; 讀入AD的值
MOV R1,#030H ; 存儲AD轉(zhuǎn)換器的數(shù)據(jù)的地址
MOV @R1,A ; 將AD的值讀入該地址
POP PSW ; 程序狀態(tài)字出棧
POP ACC ; 累加器出棧
RETI
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -