我想问一下~那个~用STC89C52单片机产生一个PWM波的C语言程序怎么写啊?
具体的是用STC89C52单片机产生一个PWM波,经过一个功率放大电路作用于一个外接喇叭,使喇叭发声。不太会写程序,所以在产生PWM波得程序那个地方卡住了~希望您能帮帮我...
具体的是用STC89C52单片机产生一个PWM波,经过一个功率放大电路作用于一个外接喇叭,使喇叭发声。不太会写程序,所以在产生PWM波得程序那个地方卡住了~希望您能帮帮我啊~~~谢谢~~~
展开
4个回答
展开全部
首先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
希望对你有用,呵呵!!!
例如:实现周期为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所需周期段,精度高的话我还是建议用两个定时器来实现 ,我在这里没有给你具体的代码,我觉得把原理讲清楚猜是最重要的,什么都是才来就上代码,这个对你学习不利,希望对你有用,呵呵!!!!
展开全部
我记得上次我做这个的时候是用单片机产生两个正弦波,在用这两个正弦波合成第三个正弦波,这三个正弦波只有相位不同,最后将这三个正弦波合成一个PWM波形,都做了快2年了,所以基本上都忘了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
具体程序我也没有了
我的思路当时是这样的:首先设定一个定时,比如说是5us,然后设置一个变量count,
设置好周期如果是500us,那么,用count控制占空比,如,占空比是50%时,可以将count设置成50,如果占空比是实时变化的,那么可以用一个变量代替count
我的思路当时是这样的:首先设定一个定时,比如说是5us,然后设置一个变量count,
设置好周期如果是500us,那么,用count控制占空比,如,占空比是50%时,可以将count设置成50,如果占空比是实时变化的,那么可以用一个变量代替count
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#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波
你可以参考一下 对照写出自己的程序
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波
你可以参考一下 对照写出自己的程序
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询