51单片机 定时器产生PWM 作用于蜂鸣器 c语言

要 523hz 587hz 659 hz 784hz 880hz 988hz 这7个频率,因为蜂鸣器是有源的,麻烦写详细些
主要写下用定时器产生PWM 然后输出那几个特定频率。要详细详细

第1个回答  2014-09-29
先计算上面这些频率的所对应的周期,然后根据周期计算出定时器的初始值。然后就可以实现了。追问

能给出具体的代码吗?理论大概能明白,具体怎么做就很犯模糊

追答

程序是转自别处。程序中的PWM不同,产生的频率是不相同的。你可以根据你的频率计算出初始值来就可以了。
#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;
}

本回答被提问者和网友采纳