如何用51单片机的定时器产生2路pwm?

最好是封装好了的函数,可以任意改变pwm;如果不行那就封装成5个pwm为具体值的函数;能否看出我的程序有问题;还希望你能告诉我,为什么外部中断节约单片机资源,使用定时器能否节约资源还是非要定时中断才能节约资源。
谢谢啦^-^,给的分不多
这是我写的,只是用延时函数写的,比较浪费单片机资源,而且用仿真软件只有lpwm可以符合要求,而rpwm不能改变
#include <reg52.h>
sbit IN1=P2^1;
sbit IN2=P2^0;
sbit IN3=P2^3;
sbit IN4=P2^4;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit lpwm=P2^2; //ENA
sbit rpwm=P2^5; //ENB

#define uchar unsigned char
uchar i;
void delay (uchar m);
void lpwmout(uchar q);
void rpwmout(uchar p);

main()
{
IN1=1;IN2=0;IN3=1;IN4=0;
while(1)
{
//lpwmout(0.1);rpwmout(0.1);delay(5);
lpwmout(8);rpwmout(2);//delay(5);
//lpwmout(0);rpwmout(0);delay(5);
}
}

void delay (uchar m)
{
unsigned char a;
while(m--)
for(a=130;a>0;a--);
}
void lpwmout(uchar q) //产生pwm ENA的
{
lpwm=1;
delay(q);
lpwm=0;
delay(10-q);
}
void rpwmout(uchar p) //产生pwm ENB的
{
rpwm=1;
delay(p);
rpwm=0;
delay(10-p);
}

用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include <reg52.h>
#include <intrins.h>
#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,谢啦……
我还想问下,程序在寻迹小车上需要大概5个pwm,这个程序可以实现,但是能不能设计个一个函数,可以改变函数输入值而改变pwm,使程序更加优化?

追答

很简单了,你再设置一个变量a,比如设置按键D0改变pwm
这样写
void main()
{
if(N1<a)pwm_out1=1;
else pwm_out1=0;

if(D0==0)
{
a=200; //数随意
}
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-04
用定时器定一段时间,便是pwm的周期,然后可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波
例如:
#include <reg52.h>
#include <intrins.h>
#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;
}
第2个回答  2015-09-04
用定时器啊,用定时器定一段时间,便是pwm的周期,然后你可以设计任意数量的变量,如N1,N2等等,每一个变量都可以产生一个方波~给你简单写个程序吧
#include <reg52.h>
#include <intrins.h>
#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;
}
第3个回答  2012-10-21
您这样的PWM波只能适应很低频率的,建议您使用定时器/计数器来实现。本回答被网友采纳
第4个回答  2012-10-21
这个程序,单片机一直在处理延时,没有资源去做其他事情。
建议用1个定时器,当定时器溢出一次,某变量+1,当这个变量为A时, lpwmout(),当这个变量为B时,rpwmout(),