单片机开发板 无缘蜂鸣器 电解电容 三极管 若干电阻电容
搭完电路后,连上单片机和电源,随便给个1khz的PWM波信号,发现声音有点大,而且极其刺耳,声音质量不太理想。
思前想后,决定在供电端加一个电阻来限流,帮助减小音量
之后声音果然小了很多,也没有那么刺耳了,不过毕竟是无源蜂鸣器,而且本吊技术有限,音质不是很好,没办法和空调开关机的和弦声相比。不太清楚空调的和弦声,是怎样做到的。可能用的不是蜂鸣器。
下面是几个主要的代码。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "pwm.h"
#include "beep.h"
#include "key.h"
#include "timer.h"
/*************************************************************************
以下是3种比较典型的和弦音的实现细节:(符号说明:Tf:频率给定持续时间(ms)
Tv:电压给定持续时间(ms)?F:输出频率(KHz))
单声和弦音:短暂鸣响后音量渐隐
F=2.6,Tv=200,Tf=1000
开机和弦音:三升调,按音调分3个阶段
1.F=2.3KHz,Tv=200ms,Tf=200ms
2.F=2.6KHz,Tv=200ms,Tf=200ms
3.F=2.9KHz,Tv=100ms,Tf=2100ms
关机和弦音:三降调,按音调分3个阶段
1.F=2.9KHz,Tv=200ms,Tf=200ms
2.F=2.6KHz,Tv=200ms,Tf=200ms
3.F=2.3KHz,Tv=100ms,Tf=2100ms
//2.3KHZ的PWM波占空比50% 434 217
//2.5khz的PWM波占空比50% 400 200
//2.45KHZ的PWM波占空比50% 408 204
//2.6KHZ的PWM波占空比50% 384 192
//2.75KHZ的PWM波占空比50% 363 181
//2.8KHZ的PWM波占空比50% 357 178
*************************************************************************/
//typedef struct
//{
// u32 Freq;
// u16 PWRtime;
// u16 OSCtime;
//}TONE_Def;
int main(void)
{
TONE_Def power_open[3] = {{2300,200,280},{2600,200,280},{2900,200,2100}};
TONE_Def two_tiger[] =
{
{2000,250,500},//1
{2300,250,500},//2
{2600,250,500},//3
{2000,250,500},//1
{2000,250,500},//1
{2300,250,500},//3
{2600,250,500},//3
{2000,250,500},//3
{2300,250,500},//3
{2600,250,500},//3
{2900,500,1000},//3
{2300,250,500},//3
{2600,250,500},//3
{2900,1000,4000},//3
};
int i = 0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init();
KEY_Init();
TIM1_PWM_Init(434-1,72-1);//10KHZ
TIM_SetCompare1(TIM1,217);
// TIM3_Int_Init(100-1,7200-1); //10khz的定时器频率 1ms计数10 10ms计数100
// BEEP_EN = 1;
while(1)
{
for(i=0;i<14;i++)
{
music_simida(two_tiger[i]);
}
// music_simida (power_open[0]);
// music_simida (power_open[1]);
// music_simida (power_open[2]);
delay_ms(5000);
}
}
void music_simida (TONE_Def data)
{
TIM1_PWM_Init((1000000/data.Freq)-1,72-1);//2.3KHZ的PWM波占空比50% 434 217 //2.5khz 400 200
TIM_SetCompare1(TIM1,(1000000/data.Freq)/2);
BEEP_EN=1;
delay_ms(data.PWRtime);
BEEP_EN = 0;
delay_ms(data.OSCtime-data.PWRtime);
TIM_Cmd(TIM1, DISABLE); //使能TIM1
}
以上是我实验的主要阶段,其实是一个很简单的小实验,但是很有意思。多多培养
动手能力很棒。
https://wenku.baidu.com/view/1ef34bb769dc5022aaea0015.html
实验过程中参考了这个文档资料