buzzer连接单片机pwm输出引脚 控制pwm的频率可以产生不同音调的声音
.h
#include "Task_buzzer.h"
extern TIM_HandleTypeDef htim3;
/**
* NAME: void promising_young(void)
* FUNCTION : promising_young
*/
void promising_young(void)
{
int promising_young[]=
{
M5,50,M6,50,H1,50,Z0,10,H2,50, Z0,10,H2,50,Z0,1,H2,50, Z0,1, H1,50, Z0,1,H2,50, Z0,15, H1,50, Z0,15,H3,50, Z0,15,Z0,50,
M7,40,Z0,10,M7,40,Z0,10,M7,40,Z0,10,M7,75,Z0,15,M7,50, Z0,25, M6,25, Z0,25, H1,25,Z0,25
};
int length = sizeof(promising_young)/sizeof(promising_young[0]);//计算数组长度
for(int i=0; i<(length/2); i++)//取数组数据
{
buzzer_on(promising_young[2*i], 200);
osDelay(5*promising_young[2*i+1]);//本文使用freertos 如果未使用把osDelay换为HAL_Delay即可//音长的时间都乘以5即一拍为500微秒,此值"5"可调整,只是播放的整个快慢而已,有点类似于视频快进和后退
}
}
/**
* NAME: void Solitary_brave(void)
* FUNCTION : Solitary_brave
*/
void Solitary_brave(void)
{
int16_t solitary_brave[]=
{
M6,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10, //爱你孤身走暗巷
H1,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10, //爱你不跪的模样
H1,50,H2,50,H3,50,H2,50,H3,50,H2,50,H3,100,H3,50,H3,50,H2,50,H3,100,H5,100,H3,100,Z0,10 //爱你对峙过绝望不肯哭一场
};
int length = sizeof(solitary_brave)/sizeof(solitary_brave[0]);
for(uint8_t i=0;i<(length/2);i++)
{
buzzer_on(solitary_brave[i*2],500);
osDelay(5*solitary_brave[i*2+1]);//本文使用freertos 如果未使用把osDelay换为HAL_Delay即可
}
}
/**
* NAME: void Wind_Rises(void)
* FUNCTION : Wind_Rises
*/
void Wind_Rises(void)
{
int wind_rise[]=
{ //这一路上走走停停 顺着少年漂流的痕迹
// // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,25,M3,25,M2,25,M1,25,L6,100,Z0,10,
// // //迈出车站的前一刻 竟有些犹豫
// // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,M2,100,Z0,50,
// // //不仅笑着这近乡情怯 仍无法避免
// // M2,50,M2,50,M1,25,M2,50,M2,50,M1,25,M2,50,M3,50,M5,50,M3,50, M2,50,M2,50,M3,25,M2,50,M1,50,L6,100,Z0,10,
//而长野的天 依旧那么暖 风吹起了从前
// M3,25,M2,25,M1,25,M2,25,M1,100, M3,25,M2,25,M1,25,M2,25,M1,50,M1,50, M5,25,M3,25,M2,25,M1,25,M2,25,M1,100,M1,150,Z0,30,
// //从前初识这世间 万般留恋 看着天边似在眼前 也甘愿赴汤蹈火去走它一遍
// M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,M5,25,M6,25,M6,25,M5,25,M6,25,M5,25,M6,50,M5,25,M2,25,M2,25,M5,50,M5,50,M3,100,M3,100,Z0,25,
// //如今走过这世间 万般留恋 翻过岁月不同侧脸 措不及防闯入你的笑颜
// M1,50,M2,50,M3,50,M1,50,M6,50,M5,25,M6,25,M6,50,M6,50, M1,25,M7,50,M6,25,M7,25,M7,100,Z0,5, M7,50,M6,25,M7,25,M7,50,M3,50,H1,25,H2,25,H1,25,M7,25,M6,50,M5,50, M6,50,H3,25,H3,25,H3,50,M5,50,M6,50,H3,25,H3,25,H3,25,M5,50,M6,25,M6,100,M6,100,M6,100,Z0,25,
// //我曾难自拔与世界之大 也沉溺于其中梦话
// H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,25,H3,25,H3,50, H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,25,H3,50,H3,50,
// //不得真假 不做挣扎 不惧笑话
H2,50,H1,25,M6,25,M6,25,H1,50, M6,25,H2,25,H1,25,M6,50,M6,25,H1,50,H1,50, H3,100,H3,25,H4,25,H3,50,H3,25,H2,50,H2,50,Z0,25,
//我曾将青春翻涌成她 也曾指尖弹出盛夏 心之所动且就随缘去吧
// H1,50,H2,50,H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H2,50, H3,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H6,25,H5,25,H5,50,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H3,50,H3,50, H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,100,H1,100,Z0,10,
// //逆着光行走任风吹雨打吧
// M6,25,H3,50,H3,50,H2,50,H1,25,M6,25,M6,25,H3,50,H2,50,H1,25,M6,25,M6,25,H1,50,H1,50,H1,50,H1,100,Z0,10,
};
int length = sizeof(wind_rise)/sizeof(wind_rise[0]);
for(int i=0;i<(length/2);i++)
{
buzzer_on(wind_rise[i*2],260);
osDelay(wind_rise[i*2+1]*5);//本文使用freertos 如果未使用把osDelay换为HAL_Delay即可
}
}
void buzzer_on(uint16_t psc, uint16_t pwm)
{
__HAL_TIM_PRESCALER(&htim3, psc);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, pwm);
}
void buzzer_off(void)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, 0);
}
void star_music(void)
{
int16_t solitary_brave[]=
{
M5,50,M6,50,M7,50,Z0,50 //爱你孤身走暗巷
};
int length = sizeof(solitary_brave)/sizeof(solitary_brave[0]);
for(uint8_t i=0;i<(length/2);i++)
{
buzzer_on(solitary_brave[i*2],500);
osDelay(5*solitary_brave[i*2+1]);//本文使用freertos 如果未使用把osDelay换为HAL_Delay即可
}
}
void myTask_buzzer(void const * argument)//freertos任务 如果未使用 删去即可
{
while(1)
{
star_music();
osDelay(400);
}
}
.c
#ifndef _buzzer_
#define _buzzer_
#include "includes.h"
#define proport 72000 //Tclk/(arr+1)=72000000/(1000)
//根据Tout= ((arr+1)*(psc+1))/Tclk推出psc值就是本句define定义的值,Tout为音调频率131Hz的倒数,Tclk=72MHz
#define L1 ((proport/262)-1)//低调 do 的频率
#define L2 ((proport/296)-1)//低调 re 的频率
#define L3 ((proport/330)-1)//低调 mi 的频率
#define L4 ((proport/349)-1)//低调 fa 的频率
#define L5 ((proport/392)-1)//低调 sol的频率
#define L6 ((proport/440)-1)//低调 la 的频率
#define L7 ((proport/494)-1)//低调 si 的频率
#define M1 ((proport/523)-1)//中调 do 的频率
#define M2 ((proport/587)-1)//中调 re 的频率
#define M3 ((proport/659)-1)//中调 mi 的频率
#define M4 ((proport/699)-1)//中调 fa 的频率
#define M5 ((proport/784)-1)//中调 sol的频率
#define M6 ((proport/880)-1)//中调 la 的频率
#define M7 ((proport/988)-1)//中调 si 的频率
#define H1 ((proport/1048)-1)//高调 do 的频率
#define H2 ((proport/1176)-1)//高调 re 的频率
#define H3 ((proport/1320)-1)//高调 mi 的频率
#define H4 ((proport/1480)-1)//高调 fa 的频率
#define H5 ((proport/1640)-1)//高调 sol的频率
#define H6 ((proport/1760)-1)//高调 la 的频率
#define H7 ((proport/1976)-1)//高调 si 的频率
#define Z0 0//
void Solitary_brave(void);
void Wind_Rises(void);
extern void buzzer_on(uint16_t psc, uint16_t pwm);//播放一个音符
extern void buzzer_off(void); //停止播放