|
;等周期脈寬調(diào)制pwm
;晶振:12MHZ
;89S51
P_PWM1 EQU P1.0
cycle EQU 1000 ;PWM的周期(單位微秒),則頻率為1000赫茲
cycle_high EQU 500 ;一個周期內(nèi),PWM端口為高電平的時間(初始值)
DSEG AT 20H
ORG 40H
PWM_HIGH_L DATA 40H
PWM_HIGH_H DATA 41H ;PWM端口為高電平時,定時器寄存器的值
PWM_LOW_L DATA 42H
PWM_LOW_H DATA 43H ;PWM端口為高電平時,定時器寄存器的值
ORG 60H ; 堆棧起源
stack: DS 20H ; 堆棧長度
CSEG
ORG 0000H ; power on/reset vector
jmp on_reset
ORG 0003H ; 外部中斷0向量
reti ;
ORG 000BH ; 計時器0溢出向量
reti ;
ORG 0013H ; 外部中斷1的向量
reti ;
ORG 001BH ; 定時器溢出向量1
JMP TIMER1_ISR
ORG 0023H ; 串行I / O中斷矢量
reti ;
;***********************************************************************************
;系統(tǒng)初始化等
ORG 0033H ; begin code space
USING 0 ; register bank zero
on_reset: MOV R7,#00H
DJNZ R7,$ ;延時
mov sp, #(stack-1) ; 初始化堆棧指針
;禁止各中斷
MOV IE,#00H
MOV IP,#00H
SYS_INIT: MOV R0,#00H
SYS_INIT_LOOP:
MOV R1,#00H
DJNZ R1,$
DJNZ R0,SYS_INIT_LOOP ;延時0.13S
;內(nèi)部RAM(30H-5fH)清零
MOV R1,#30H
MOV A,#0
ZERO_LOOP: MOV @R1,A
INC R1
CJNE R1,#60H,ZERO_LOOP
;定時器1初始化
MOV TMOD,#00010000B ;方式1,16位定時器模式
MOV PWM_HIGH_L,#LOW(65536 - cycle_high)
MOV PWM_HIGH_H,#HIGH(65536 - cycle_high)
MOV PWM_LOW_L,#LOW(65536 - (cycle - cycle_high))
MOV PWM_LOW_H,#HIGH(65536 - (cycle - cycle_high))
SETB P_PWM1 ;先輸出高
MOV TL1,PWM_HIGH_L
MOV TH1,PWM_HIGH_H
SETB ET1 ;T1開中斷
SETB EA ;開總中斷
SETB TR1 ;開定時器1
MAIN_LOOP:
;主循環(huán)
SJMP $
;**********************************************************************
;**********************************************************************
;定時器1中斷服務(wù)程序
TIMER1_ISR:
USING 1 ; register bank 1
PUSH ACC
PUSH PSW
JB P_PWM1,PWM_OUT_LOW ;如果輸出為高則,輸出低
SETB P_PWM1
MOV TL1,PWM_HIGH_L
MOV TH1,PWM_HIGH_H
JMP TIMER_ISR_RET
PWM_OUT_LOW:
CLR P_PWM1
MOV TL1,PWM_LOW_L
MOV TH1,PWM_LOW_H
TIMER_ISR_RET:
POP PSW
POP ACC
RETI
;*********************************************************************
END
|
|