;*************************************************************************************************************************
;專案名稱:PWM模塊 for 89S51
;制令編號:N/A
;程序檔案:x51PWM08(100Hz).ASM
;版 本:V1.00.0
;設計者 : Richard
;修改紀錄: 周期=10mSec/ 頻率= 100Hz
;2012/06/21: 已完成軟件仿真,由T修改周期;P1Port修改PW(脈沖寬度),請留意T的修改會影響PW的執行狀況(T>PW)
;*************************************************************************************************************************
PW equ 3 ;PW脈波ON時間設定(R3)
T equ 4 ;周期時間設定(R4)
T_Cnt equ 5 ;時間Counter(R5)
Led reg P2.0 ;PWM基準脈波輸出
org 0000H
ljmp MAIN
;*************************************************************************************************************************
MAIN: mov TMOD,#01H ;定時器0設置為工作方式1,16位(2^16)
;mov TL0,#B0H ;設定中斷時間=50mSec=> (2^16 - 設定中斷時間)=> (65536-50000) = 15536 = 3CB0(Hex)
;mov TH0,#03CH ;TH0= 03CH ; TL0 = B0H
;mov TL0,#F0H ;設定中斷時間=10mSec=> (2^16 - 設定中斷時間)=> (65536-10000) = 55536 = D8F0(Hex)
;mov TH0,#0D8H ;TH0= 0D8H ; TL0 = F0H
mov TL0,#18H ;設定中斷時間=1mSec=> (2^16 - 設定中斷時間)=> (65536-1000) = 64536 = FC18(Hex)
mov TH0,#0FCH ;TH0= 0FCH ; TL0 = 18H
setb TR0
setb Led
mov R2,#0
mov PW,#03H ;PW初始設定,進入主程序后會讀取P1狀態來重新設定
mov T,#11 ;周期(中斷時間=1mSec)
;#128= 128mSec(7.8Hz)
;#101= 100mSec(10Hz)
;#15= 15mSec(67Hz)
;#11= 10mSec(100Hz)
;#9= 8mSec(124Hz)
;#8= 7mSec(140.9Hz)
;#7= 6mSec(167Hz)
;#6= 5mSec (197Hz)
;#5= 4mSec(250Hz)
mov T_Cnt,#1 ;周期Counter
LOOP: jbc TF0,CPLP ;T0發生溢位則跳至CPLP
;T0未發生溢位
call CHG_P1 ;讀取P1狀態設定為PW
ajmp LOOP
CPLP:
;mov TL0,#B0H ;設定中斷時間=50mSec=> (2^16 - 設定中斷時間)=> (65536-50000) = 15536 = 3CB0(Hex)
;mov TH0,#03CH ;TH0= 03CH ; TL0 = B0H
;mov TL0,#F0H ;設定中斷時間=10mSec=> (2^16 - 設定中斷時間)=> (65536-10000) = 55536 = D8F0(Hex)
;mov TH0,#0D8H ;TH0= 0D8H ; TL0 = F0H
mov TL0,#18H ;設定中斷時間=1mSec=> (2^16 - 設定中斷時間)=> (65536-1000) = 64536 = FC18(Hex)
mov TH0,#0FCH ;TH0= 0FCH ; TL0 = 18H
inc T_Cnt ;T_Cnt=T_Cnt+1
mov A,T_Cnt
cjne A,T, TA ;if T_Cnt<>T then jump to TA
;ifT_Cnt=T
clr Led ;ON
call SET_CODE
mov T_Cnt,#1 ;T_Cnt=1 again, set break point here
TA:
mov A,T_Cnt
cjne A,PW, TB ;if T_Cnt<>PW then jump to TB
;ifT_Cnt=PW
setb Led ;OFF
call SET_CODE
nop ;setbreak point here
TB: ;
BACK: ajmp LOOP
;*************************************************************************************************************************
; 取P1狀態當作設定值輸入
;*************************************************************************************************************************
CHG_P1: push PSW
push ACC
mov A,P1
cpl A
anl A,#11111111b ;取P1.0~P1.7當作設定
cjne A,#0,PW_SET
mov PW,#3 ;IFP1.0~P1.7=0 ; PW=3
jmp E_CHG_P1
PW_SET: mov PW,A
E_CHG_P1: pop ACC
pop PSW
ret
;*************************************************************************************************************************
SET_CODE: cjne R2,#0,A1
;clr P0.0 ;clr P0.0: ON(Low)
;setb P0.1 ;setb P1.0:OFF(High)
;clr P0.2 ;clr P0.2:ON(Low)
mov P0,#11111111B ;0:ON(Low); 1:OFF(High)
inc R2
jmp A_END
A1: cjne R2,#1,A2
;clr P0.0 ;clr P0.0: ON(Low)
;setb P0.1 ;setb P1.0:OFF(High)
;clr P0.2 ;clr P0.2:ON(Low)
mov P0,#11111110B ;0:ON(Low); 1:OFF(High)
inc R2
jmp A_END
A2: cjne R2,#2,A3
mov P0,#11111111B
inc R2
jmp A_END
A3: cjne R2,#3,A4
mov P0,#11111101B
inc R2
jmp A_END
A4: cjne R2,#4,A5
mov P0,#11111111B
inc R2
jmp A_END
A5: cjne R2,#5,A6
mov P0,#11111011B
inc R2
jmp A_END
A6: cjne R2,#6,A_CLR
mov P0,#11111111B
;inc R2
;jmp A_END
jmp A_CLR
A7: cjne R2,#7,A8
mov P0,#11111011B
inc R2
jmp A_END
A8: cjne R2,#8,A_CLR
mov P0,#11111111B
A_CLR: mov R2,#1
A_END: ret
;*************************************************************************************************************************
end
|