请问你是怎么用单片机一个定时器产生PWM的

PWM既能调频率也能调占空比!!!!!!!!!!!!

第1个回答  2010-10-25
一般看你是什么单片机,有的单片机硬件有PWM功能,直接输出PWM不占用CUP资源(像AVR的MEGA16),如果是51的话一班是采用定时器模拟的PWM。
在T0中断是输出高电平,同时打开T1,在T1中断中输出低电平,然后就可以通过设置T0的初值来改变PWM的频率,靠改变T1的初值来改变占空比。
希望对你有用!!!
你可以参考一下http://wenku.baidu.com/view/11ca7529bd64783e09122b6d.html
这里能实现你说的!
第2个回答  推荐于2016-04-01
#include<reg52.h>
#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;
}本回答被提问者采纳