教你如何使用STM32控制无源蜂鸣器发声播放音乐

教你如何使⽤STM32控制⽆源蜂鸣器发声播放⾳乐
⼀、⽆源蜂鸣器和有源蜂鸣器
有源蜂鸣器内含振荡源,只要⼀通电就发声,但发⽣频率固定,⾳⾊单⼀;⽆源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出⼀定频率的信号才能发声。
⼈⽿能听到的频率范围在20Hz--20kHz之间,通过STM32的GPIO引脚快速切换⾼低电平输出就能实现⽆源蜂鸣器的发声,切换的频率不同,发出的⾳调就不⼀样。
⼆、⾳乐播放的实现
⼀段⾳乐就是不同频率的声⾳按⼀定的时间节拍转换发出。所以⾳乐包含⾳调和节拍信息。
C调各⾳符频率如下:
⾳符频率 Hz⾳符频率 Hz
低1 Do262中1 Do523
低2 Re294中2 Re587
低3 Mi330中3 Mi659
多肽药物合成低4 Fa349中4 Fa698
低5 So392中5 So784
低6 La440中6 La880
低7 Si523中7 Si988
如果要实现歌曲“红尘情歌”,要准备相应的数据。
歌谱如下:
程序中⾸先准备⾳频数据表:
//        低Si Do Re  Mi  Fa So  La  Si ¸⾼Do¸⾼Re¸⾼Mi¸⾼Fa¸⾼So ⽆
uc16 tone[] ={247,262,294,330,349,392,440,294,523,  587,  659,  698,  784,  1000};
u8 music[]={  5,5,6,8,7,6,5,6,13,13,……};//⾳调
u8 time[] = {  2,4,2,2,2,2,2,8,4, 4, ……}; //节拍时间
依次从⾳调数组中取music[i],然后根据music[i]的值在tone数组中得到该⾳的发声频率(tone[music[i]]),调⽤sound函数控制蜂鸣器发声,声⾳的发声时间有time数组控制。
三、项⽬创建与配置
1、创建项⽬⽂件夹(设为pMusic)
2、通过Keil5创建新项⽬,保存在所创建的⽂件夹中(设项⽬名为pMusic),选择MCU芯⽚为"STM32F103ZE"(本程序使⽤的硬件为:STM32-PZ6806L开发板)
3、在pMusic项⽬⽂件夹中新建"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"⽂件夹。
癸氧喹酯
刷握①  在"CMSIS"⽂件夹中复制"core_cm3.h"和"core_cm3.c"⽂件;
②  在" Device "⽂件夹中复制"stm32f10x.h"、"system_stm32f10x.h"和"system_stm32f10x.c"⽂件;
③  在" Startup "⽂件夹中复制"startup_stm32f10x_hd.s"⽂件;
④在"Lib"⽂件夹中新建"inc"和"src"两个⼦⽂件夹,在"inc"⽂件夹中复制"misc.h"、"stm32f10x_gpio.h"和"stm32f10x_rcc.h"⽂件;在"src"⽂件夹中复制"misc.c"、"stm32f10x_gpio.c"和"stm32f10x_rcc.c"⽂件;
4、为项⽬添加"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"组,并将上述C程序⽂件和"startup_stm32f10x_hd.s"启动⽂件加⼊到相应组中。展开项⽬树如下:
5、打开“项⽬配置”对话框,在"Output"选项卡中选择"Create HEX File",在"C/C++"选项卡中的"Include Paths"中添加如下包含路径:".\CMSIS;", ".\Device;", ".\Lib\inc;",".\Public;"。
(以上步骤可以参看:
6、在"stm32f10x.h"中添加函数参数检查宏
(参看:)
#ifdef  USE_FULL_ASSERT
/**
* @brief  这个assert_param宏⽤于函数参数检查
* @param  expr:如果expr是 false,就调⽤ assert_failed函数报告源⽂件名和
*        失败的⾏号,如果expr是 true ,就返回⼀个空值
* @retval None
*/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT */
7、新建⼀个⽂件(system.h),保存到"Public"⽂件夹中,内容为:
#ifndef __SYSTEM__H
#define __SYSTEM__H
#include "stm32f10x.h"
//定义位带地址
受电弓试验台
#define BITBAND(addr,bitnum) ((addr&0xF0000000) + 0x02000000 + ((addr&0x000FFFFF)<<5) + (bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr,bitnum) MEM_ADDR(BITBAND(addr,bitnum))
//IO⼝地址映射
//数据输出寄存器地址
#define GPIOA_ODR_Addr          (GPIOA_BASE + 12)
#define GPIOB_ODR_Addr (GPIOB_BASE + 12)
#define GPIOC_ODR_Addr (GPIOC_BASE + 12)
#define GPIOD_ODR_Addr          (GPIOD_BASE + 12)
#define GPIOE_ODR_Addr (GPIOE_BASE + 12)
#define GPIOF_ODR_Addr (GPIOF_BASE + 12)
#define GPIOG_ODR_Addr          (GPIOG_BASE + 12)
//数据输⼊寄存器地址
#define GPIOA_IDR_Addr  (GPIOA_BASE + 12)
#define GPIOB_IDR_Addr  (GPIOB_BASE + 12)
#define GPIOC_IDR_Addr  (GPIOC_BASE + 12)
#define GPIOD_IDR_Addr  (GPIOD_BASE + 12)
#define GPIOE_IDR_Addr  (GPIOE_BASE + 12)
#define GPIOF_IDR_Addr  (GPIOF_BASE + 12)
#define GPIOG_IDR_Addr  (GPIOG_BASE + 12)
#endif
该⽂件定义了GPIO端⼝位带操作的宏。
(位带操作请参看:)
8、新建⽂件"SysTick.h",保存到"Public"⽂件夹中,内容为:
#ifndef __SysTick__H
#define __SysTick__H
#include "stm32f10x.h"
void SysTick_Init(u8 SYSCLK);
void delay_us(u32 nus);
void delay_ms(u16 nms);
#endif
新建⽂件"SysTick.c",保存到"Public"⽂件夹中,内容为:
#include "SysTick.h"
#include "misc.h"
u8 fac_us = 0;
u16 fac_ms = 0;
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        fac_us = SYSCLK / 8;
fac_ms = (u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = nus * fac_us;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do{
temp = SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = nms * fac_ms;
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do{
temp = SysTick->CTRL;
}while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0;
}
这两个⽂件实现了通过SysTick精准延时的函数,提供给后续的⾳频频率产⽣程序使⽤。
中空玻璃全自动打胶机
(关于SysTick,请参看:)
将"SysTick.c"⽂件添加到项⽬的"Public"组中。
9、实现发声
①开发板⽆源蜂鸣器的电路连接如下:
从电路连接可以看出通过MCU的PB5(GPIOB_5)控制蜂鸣器的发声。
②在项⽬⽂件夹的"User"⽂件夹下新建"Beep"⽂件夹,在项⽬中新建"beep.h"⽂件,保存在"User/Beep"⽂件夹中,⽂件内容为:
#ifndef __BEEP__H
#define __BEEP__H
#include "system.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
//定义GPIOB的位地址变量宏
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)
免洗内裤#define PBeep PBout(5)
#define BEEP_PORT  GPIOB
#define BEEP_PIN      GPIO_Pin_5
#define BEEP_PORT_RCC RCC_APB2Periph_GPIOB
void BEEP_Init(void);
void Sound(u16 frq);
void play(void);
#endif
③在项⽬中新建"beep.c"⽂件,保存在"User/Beep"⽂件夹中,⽂件内容为:
#include "beep.h"
#include "systick.h"
void BEEP_Init(void)

本文发布于:2024-09-21 16:47:36,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/126491.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:蜂鸣器   件夹   发声   地址   频率   实现   函数
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议