我不知道為什么這么多人寫51定時器PWM程序這么復雜,本身51定時器不管工作模式在0或1或2都會自動裝初值,你如果要來調(diào)光或要一個不太精確的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的占空比。
不多說了,下面程序就是只用一個定時器,并帶一個按鍵調(diào)節(jié)占空比。電路較應該好畫了吧。一片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;
}
|