;*************************************************************************************************************************
;专案名称: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
|