用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include
#include
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;
void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;
if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}
用定时器定一段时间,便是pwm的周期,然后可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波。
例如:
#include
#include
#define uchar unsigned char
#define uintunsigned int
uchar N1,N2;
sbit pwm_out1=P0^0;
sbit pwm_out2=P0^1;
void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xa3;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void pwm()
{
if(N1<180)pwm_out1=1;
else pwm_out1=0;
if(N2<135)pwm_out2=1;
else pwm_out2=0;
}
void main()
{
InitTimer0();
while(1)
{
pwm();
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0xff;
TL0 = 0xf6;//0.01ms
N1++;
N2++;
if(N1==2000)N1=0;
if(N2==2000)N2=0;
}
您这样的PWM波只能适应很低频率的,建议您使用定时器/计数器来实现。
这个程序,单片机一直在处理延时,没有资源去做其他事情。
建议用1个定时器,当定时器溢出一次,某变量+1,当这个变量为A时, lpwmout(),当这个变量为B时,rpwmout(),