软件实现多路PWM的输出
在舞台灯光厂做了这么久,虽然明白软件PWM的原理,但就是弄不清它们的关系,一直写不出比较好的软件PWM程序。近日,一偶然的机会得到启发,写下这个程序和单片机爱好者分享。
程序如下:
AUXR EQU 8EH
PWM1DATA EQU 60H
PWM2DATA EQU 61H
PWM3DATA EQU 62H
PWM1DATA1 EQU 63H
PWM2DATA1 EQU 64H
PWM3DATA1 EQU 65H
PWM1 EQU P0.5
PWM2 EQU P0.6
PWM3 EQU P0.7
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0
ORG 0030H
MAIN:
CLR PWM1
MOV P0,#11H
MOV SP,#30H
MOV AUXR,#01H
CLR RS1
CLR RS0
MOV TMOD,#02H
MOV TH0,#00H
MOV TL0,#00H
MOV R2,#0FFH;R2用作PWM周期寄存器
MOV PWM1DATA,#0
MOV PWM2DATA,#85
MOV PWM3DATA,#170
MOV PWM1DATA1,PWM1DATA
MOV PWM2DATA1,PWM2DATA
MOV PWM3DATA1,PWM3DATA
SETB EA ;开中断总控制
SETB ET0;开TO中断控制
SETB TR0 ;开始 计数
MAIN1:
ACALL DEL
INC PWM1DATA
INC PWM2DATA
INC PWM3DATA
AJMP MAIN1
DEL:
MOV R4,#05H
D1:
MOV R5,#0FFH
D2:
MOV R6,#0FFH
DJNZ R6,$
DJNZ R5,D2
DJNZ R4,D1
RET
TIMER0: ;定时器中断
PUSH ACC
TIMER001:
MOV A,PWM1DATA1
JZ TIMER0011
SETB PWM1
DEC PWM1DATA1
AJMP TIMER002
TIMER0011:
CLR PWM1
TIMER002:
MOV A,PWM2DATA1
JZ TIMER0021
SETB PWM2
DEC PWM2DATA1
AJMP TIMER003
TIMER0021:
CLR PWM2
TIMER003:
MOV A,PWM3DATA1
JZ TIMER0031
SETB PWM3
DEC PWM3DATA1
AJMP TIMER004
TIMER0031:
CLR PWM3
TIMER004:
DJNZ R2,TIMER005
MOV R2,#0FFH
MOV PWM1DATA1,PWM1DATA
MOV PWM2DATA1,PWM2DATA
MOV PWM3DATA1,PWM3DATA
TIMER005:
POP ACC
RETI
END
这个程序是基于STC89C52实现的。因为PWM的频率较低,所以当PWM控制的是LED时会有较大的闪动。如果要解决这个问题,则可以提高时钟频率。或使用工作速度更快的单片机,如STC12C2052可以设置为1时钟1机器周期,工作频率最高可达420MHZ。尽量不要改变定时器T0的初值(初值越小越好,最好为00H),因为如果单片机此时还要执行其它的任务(如串行通讯)时,T0的中断频率过高对软件PWM是致命的。
- 基于DSP的磁流变阻尼器的控制方法(04-14)
- 基于DSP并使用SPWM控制技术的变频器实现方案(12-21)
- 飞思卡尔那些事之PWM控制直流电机(11-23)
- 51单片机IO模拟PWM控制舵机转向(11-22)
- 51单片机PWM控制电机(11-19)
- PWM控制LED灯的亮度(C 语言)(11-17)