首先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
希望对你有用,呵呵!!!
我记得上次我做这个的时候是用单片机产生两个正弦波,在用这两个正弦波合成第三个正弦波,这三个正弦波只有相位不同,最后将这三个正弦波合成一个PWM波形,都做了快2年了,所以基本上都忘了。
具体程序我也没有了
我的思路当时是这样的:首先设定一个定时,比如说是5us,然后设置一个变量count,
设置好周期如果是500us,那么,用count控制占空比,如,占空比是50%时,可以将count设置成50,如果占空比是实时变化的,那么可以用一个变量代替count
#include
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
}
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波
你可以参考一下 对照写出自己的程序