我想问一下~那个~用STC89C52单片机产生一个PWM波的C语言程序怎么写啊?

具体的是用STC89C52单片机产生一个PWM波,经过一个功率放大电路作用于一个外接喇叭,使喇叭发声。不太会写程序,所以在产生PWM波得程序那个地方卡住了~希望您能帮帮我... 具体的是用STC89C52单片机产生一个PWM波,经过一个功率放大电路作用于一个外接喇叭,使喇叭发声。不太会写程序,所以在产生PWM波得程序那个地方卡住了~希望您能帮帮我啊~~~谢谢~~~ 展开
 我来答
还是呼唤
推荐于2017-11-24 · TA获得超过265个赞
知道答主
回答量:104
采纳率:100%
帮助的人:49.2万
展开全部
首先89C52内部没有硬件PWM发生器,只能通过定时器模拟!你可以通过两个定时器,T0控制周期,T1控制占空比。
例如:实现周期为1000us,占空比为20%的PWM,用P1.0实现
首先你设置T0为65536-1000 (12M晶振)
T1为65536-200
首先初始化P1.0=1,两个定时器同时打开,在定时器T1中断时拉低P1.0,在定时器T0中断时在拉高P1.0,同时将两定时器初始值初始化T0为65536-1000 ,T1为65536-200
希望对你有用,呵呵!!!
追问
用1个定时器的话不可以吗???
追答
可以的,但是这就要用一个变量count1 来控制周期和占空比了,比如说你设置1周期为10ms,占空比还是为20%的PWM,你可以设置定时器为每10us产生一次中断,没中断一次使count加1,一开始设置P1.0为高电平,当count1加到200的时候拉低P1.0,等count1到1000了在拉高P1.0,同时复位count1=0,不过这样做的缺点是精度不高,要是PWM所需周期段,精度高的话我还是建议用两个定时器来实现 ,我在这里没有给你具体的代码,我觉得把原理讲清楚猜是最重要的,什么都是才来就上代码,这个对你学习不利,希望对你有用,呵呵!!!!
zxmh6
2011-05-12 · TA获得超过308个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:203万
展开全部
我记得上次我做这个的时候是用单片机产生两个正弦波,在用这两个正弦波合成第三个正弦波,这三个正弦波只有相位不同,最后将这三个正弦波合成一个PWM波形,都做了快2年了,所以基本上都忘了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
guanfenandyang
2011-05-12 · 超过12用户采纳过TA的回答
知道答主
回答量:63
采纳率:100%
帮助的人:39.9万
展开全部
具体程序我也没有了
我的思路当时是这样的:首先设定一个定时,比如说是5us,然后设置一个变量count,
设置好周期如果是500us,那么,用count控制占空比,如,占空比是50%时,可以将count设置成50,如果占空比是实时变化的,那么可以用一个变量代替count
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b5338264b3c
2011-05-12
知道答主
回答量:19
采纳率:0%
帮助的人:14.6万
展开全部
#include<reg52.h>
bit flay;
sbit led=P1^1;
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^1;
uchar pwm=0,aa=0;
void delay(uint);
void delays();
main()
{
TMOD|=0x01; // 定时器初始化
TH0=(65536-100)/256;// 给定时器赋值
TL0=(65536-100)%256;//给定时器赋值

EA=1; // 开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器 开始计数
while(1)
{
while(!flay)
{
pwm++; //pwm表示占空比
delay(20);//延时大约20毫秒 保证pwm每增加一次都会进入中断
if(pwm==100)
flay=1;
}
//上面这段代码 占空比增加
//下面这段代码 占空比减少
while(flay)
{
pwm--;
delay(20);
if(pwm==1)
flay=0;
}

}
}
void delay(uint m) //大概延时m毫秒
{
uint i,j;
for(i=0;i<m;i++)
for(j=0;j<110;j++);
}
void delays() //延时函数
{
uint i,j;
for(i=0;i<1;i++)
for(j=0;j<1;j++);
}
void time() interrupt 1
{
//每100微秒进入一次中断
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(aa==pwm)
{
led=1; //熄灭8个led灯
} aa++;
if(aa==100) //周期为10毫秒
{
aa=0;
if(pwm!=0)
led=0; //点亮8个了的等
}
}
这是我以前写的用PWM调节led等的亮度的程序 中断服务程序里面的代码就是用来产生pWM波
你可以参考一下 对照写出自己的程序
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式