我不知道为什么这么多人写51定时器PWM程序这么复杂,本身51定时器不管工作模式在0或1或2都会自动装初值,你如果要来调光或要一个不太精确的PWM波,它都能胜任了。(设晶振12MHZ)模式0最大定时时间=8.192ms,模式1=65.536ms,模式2=256us。只要你打开定时器中断,不用你装定时器初值,它自己装,你就得到8.192ms或65.536ms或256us时间的中断。比如256us的中断时间,中断10次就是2.56ms,你让它5次中断输出高电压,5次中断输出低电压,它就是高1.28ms低就是1.28ms。你让它9次中断输出高,1次中断输出低,就改变了PWM的占空比。
不多说了,下面程序就是只用一个定时器,并带一个按键调节占空比。电路较应该好画了吧。一片89C51,一个BUTTON按键,一个示波器观察波形。
#include "reg51.h"
unsigned char a=5;
unsigned char i=0;
sbit K1=P2^0;
void main()
{ TMOD=0x02;
EA=1;
ET0=1;
TR0=1;
while(1)
{ if(K1==0)
{TR0=0;
a--;
if(a==0)
{a=10;}
while(~K1)
{TR0=1;}
}
}
}
void time() interrupt 1
{
i++;
if(i>11)
{i=0;}
if(i>a)
{P0=0xff;}
else P0=0x00;
}
|