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

最好是封装好了的函数,可以任意改变pwm;如果不行那就封装成5个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);
}
展开
 我来答
hcxllhz3
推荐于2018-03-28 · 超过16用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:33.9万
展开全部
用定时器啊,用定时器定一段时间,便是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; //数随意
}
}
帐号已注销
推荐于2016-05-04 · TA获得超过3.1万个赞
知道大有可为答主
回答量:6571
采纳率:86%
帮助的人:907万
展开全部
用定时器定一段时间,便是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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
爱幂不离不弃33
2015-09-04 · TA获得超过1万个赞
知道大有可为答主
回答量:1646
采纳率:33%
帮助的人:296万
展开全部
用定时器啊,用定时器定一段时间,便是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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ec35c0b5a
2012-10-21 · TA获得超过1692个赞
知道大有可为答主
回答量:2508
采纳率:73%
帮助的人:1194万
展开全部
您这样的PWM波只能适应很低频率的,建议您使用定时器/计数器来实现。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tybls520
2012-10-21 · 超过22用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:60.5万
展开全部
这个程序,单片机一直在处理延时,没有资源去做其他事情。
建议用1个定时器,当定时器溢出一次,某变量+1,当这个变量为A时, lpwmout(),当这个变量为B时,rpwmout(),
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式