一般看你是什么单片机,有的单片机硬件有PWM功能,直接输出PWM不占用CUP资源(像AVR的MEGA16),如果是51的话一班是采用定时器模拟的PWM。
在T0中断是输出高电平,同时打开T1,在T1中断中输出低电平,然后就可以通过设置T0的初值来改变PWM的频率,靠改变T1的初值来改变占空比。
希望对你有用!!!
你可以参考一下http://wenku.baidu.com/view/11ca7529bd64783e09122b6d.html
这里能实现你说的!
#include
#define uchar unsigned char
#define uint unsigned int
uint PWM;
sbit h=P1^0;
sbit key1=P1^4;
sbit key2=P1^5;
sbit BEEP=P3^6;
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void init()
{
h=0;
PWM=0x7F;
TMOD=0x21;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TH1=PWM;
TL1=0;
EA=1;
ET0=1;
ET1=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
PWM++;
if(PWM==0xff)
{
PWM=0;
BEEP=0;
delay(50);
BEEP=1;
delay(50);
}
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
PWM--;
if(PWM==0)
{
//TR0=0;
PWM=0xff;
BEEP=0;
delay(50);
BEEP=1;
delay(50);
}
}
}
}
}
void timer0() interrupt 1
{
TR1=0;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
P0=0;
TH1=PWM;
TR1=1;
}
void timer1() interrupt 3
{
TR1=0;
P0=0xff;
}