用555做PWM开关电源振荡器的工作原理有两种情况。
一是比较简单的直接由光耦反馈的电压信号来改变555的定时电阻从而达到改变占空比的目的。这种电路简单,但控制范围小,在改变占空比的同时频率也有所变化。

另一种是用555作为一个基本振荡器,有的是利用2、6脚的锯齿波与光耦反馈的电压信号用比较器来进行比较来改变占空比;也有些利用555振荡器进行电路变换得到锯齿波的。
现在做PWM开关电源有专门的控制芯片,振荡器、变换电路、比较器以及驱动输出电路都集成到芯片中,使用非常方便,没必要用555来做开关电源了(除电路实验外)。
单片机需要AD吗!!!!!!
看来你还不太懂单片机。给你个程序,之前没事写的,你来再完善一下,就是调一下频率,改变定时器的值即可。
自己看。
*这段程序是通过P1_0口输出可调占空比的PWM信号,
它的占空比在不断的从0%到100%的循环
作者:郑水生
*/
#include "at89x51.h"//晶体为12MHz,PWM信号周期为250Hz
#define Data P1_0 //PWM信号输出端
#define key_up P1_1 //+duty
#define key_down P1_2//-duty
unsigned char duty=1;//默认开机duty为1%
void main()
{
key_up=1;
key_down=1;
Data=1;
TMOD=0x01;//定时器1
TH0=0xff;
TL0=0xd8;
ET0=1;
EA=1;
TR0=1;
while(1)
{
if(key_up==0)
{
duty++;
while(key_up==0)
{}
}
if(key_down==0)
{
duty--;

while(key_down==0)
{}
}
if(duty>100)
duty=0;
if(duty==0)
{
EA=0;
Data=0;
}
if(duty==100)
{
EA=0;
Data=1;
}
if(duty>0&&duty<100)
EA=1;
}
}
void Time0_H() interrupt 1
{
unsigned int temp;
unsigned char T_H,T_L;
Data=~Data;
if(Data==1)
{
temp=(duty-1)*0x28;
T_H=(unsigned char)(temp>>8);
T_L=(unsigned char)temp;
TH0=0xff-T_H;
TL0=0xd8-T_L;
}
if(Data==0)
{
temp=(0x63-duty)*0x28;
T_H=(unsigned char)(temp>>8);

T_L=(unsigned char)temp;
TH0=0xff-T_H;
TL0=0xd8-T_L;
}
}


