使用STM32控制无源蜂鸣器发声播放音乐(STM32_07)

发布者:草莓熊猫最新更新时间:2019-05-29 来源: eefocus关键字:STM32控制  无源蜂鸣器  播放音乐 手机看文章 扫描二维码
随时随地手机看文章

一、无源蜂鸣器有源蜂鸣器


有源蜂鸣器内含振荡源,只要一通电就发声,但发生频率固定,音色单一;无源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。


人耳能听到的频率范围在20Hz--20kHz之间,通过STM32的GPIO引脚快速切换高低电平输出就能实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。


二、音乐播放的实现


一段音乐就是不同频率的声音按一定的时间节拍转换发出。所以音乐包含音调和节拍信息。

如果要实现歌曲“红尘情歌”,要准备相应的数据。


歌谱如下:



程序中首先准备音频数据表:


//         低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;", ".Libinc;",".Public;"。


(以上步骤可以参看:使用STM32固件库操作控制LED灯(CMSIS)   使用STM32固件库函数操作控制LED灯


6、在"stm32f10x.h"中添加函数参数检查宏


(参看:使用STM32固件库函数操作控制LED灯)


#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端口位带操作的宏。


(位带操作请参看:通过位带地址操作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,请参看:在STM32项目中使用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)


{


         GPIO_InitTypeDef GPIO_mode;


         RCC_APB2PeriphClockCmd( BEEP_PORT_RCC, ENABLE );         //使能GPIOB时钟


         GPIO_mode.GPIO_Pin = BEEP_PIN;


         GPIO_mode.GPIO_Speed = GPIO_Speed_50MHz;


         GPIO_mode.GPIO_Mode = GPIO_Mode_Out_PP;


         GPIO_Init(BEEP_PORT, &GPIO_mode);      //设置GPIOB_5为推挽输出,50MHz速度


}


 


void Sound(u16 frq)


{


         u32 n;


         if(frq != 1000) //如果频率不为1000则按频率输出,否则只延时


         {


                   n = 500000/((u32)frq);


                   PBeep = 0;


                   delay_us(n);


                   PBeep = 1;


                   delay_us(n);


         }else


                   delay_us(1000);


}


 


void play(void)


{


         //             低7  1   2   3   4   5   6   7  高1 高2 高3 高4 高5 不发音


         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,//音调


                                                                           5,5,6,8,7,6,5,3,13,13,


                                                                   2,2,3,5,3,5,6,3,2,1,


                                                                           6,6,5,6,5,3,6,5,13,13,


 


                                                                           5,5,6,8,7,6,5,6,13,13,


                                                                           5,5,6,8,7,6,5,3,13,13,


                                                                   2,2,3,5,3,5,6,3,2,1,


                                                                           6,6,5,6,5,3,6,1,   

[1] [2]
关键字:STM32控制  无源蜂鸣器  播放音乐 引用地址:使用STM32控制无源蜂鸣器发声播放音乐(STM32_07)

上一篇:S3C2440核心板原理图设计:与SDRAM接线分析
下一篇:stm32使用MDK开发中的一些常见问题

推荐阅读最新更新时间:2024-11-03 22:57

STM32单线串口对总线舵机的控制
1 总线舵机的介绍 总线伺服舵机即串行总线智能舵机,实际上可以理解为 数字舵机 的衍生品,数字舵机与模拟 舵机 相比而言是控制系统设计上的颠覆,而总线伺服舵机对于舵机而言则是在功能和运用上的颠覆。舵机的运用方式实际上只能发挥出总线伺服舵机非常小的一部分功能。这款TS-315是通过单线的串口通信对旋转进行控制的,控制字符串协议如下: 字符串协议: #1P1500T100 控制舵机旋转,无返回 (1P是ID为1的舵机,中间的1500是参数,范围是500-2500,控制舵机范围,后面的参数100,表示舵机旋转的时间参数,也就是速度,意思是舵机从当前角度达到命令中的1500的位置,所需要的时间为100ms,时间的范围是1-50000
[单片机]
<font color='red'>STM32</font>单线串口对总线舵机的<font color='red'>控制</font>
意法半导体(ST)与Yogitech合作开发STM32控制器安全组件
意法半导体(STMicroelectronics,简称ST)和Yogitech 签订了一项合作开发微控制器完整安全组件的协议,以简化基于STM32微控制器的关键安全应用的开发和认证过程。 意法半导体和Yogitech同意开发一个安全手册和测试软件库,作为一个简单、快速且高效的测试方式,使用IAR系统的定制化开发工具,检测并标记STM32微控制器潜在的危害性故障。合作双方瞄准一个仅在欧洲就预计约为4亿多欧元的巨大市场,工程师可从意法半导体的500余款微控制器中选择一款适合的产品,用于研发创新且安全的工业自动化用产品。 Yogitech首席执行官Silvano Motto表示:“鉴于现代集成电路的复杂性,使用黑匣子进行安全性分析的方
[单片机]
STM32水温控制系统硬件详解
系统介绍:基于STM32F103的水温控制系统.实现室温到100度任意区间水温控制.精度;+/-1摄氏度.平均响应应时间:5分钟.控制对象:1公斤水. 系统主要组成;铂金测温驱动电路(恒流源实现),市电电压过零检测电路.功率驱动电路(固态继电器实现),小信号放大电路(仪用运放实现),STM32单片机最小系统.500W水温加热管. 1,铂金电阻测温驱动电路 驱动PT100铂金测温电阻.和电阻桥原理相似.利用1MA精密恒流源加在铂金电阻一端,另一端接地.用另一个1MA精密恒流源加在精密100欧姆电阻一端,另一端接地.(选择100欧姆,是因为PT100在零度时电阻值是100欧姆) 这是铂金电
[单片机]
<font color='red'>STM32</font>水温<font color='red'>控制</font>系统硬件详解
如何设计一个以stm32控制核心的数字示波器?
随着集成电路的发展和数字信号处理技术的采用,数字 示波器 已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。 本文通过采用高速高性能器件,设计了一实时采样率为60 msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏度
[测试测量]
如何设计一个以<font color='red'>stm32</font>为<font color='red'>控制</font>核心的数字示波器?
STM32嵌入式微控制器快速上手——笔记
1、大端格式:数据的高字节存在低地址,低字节存在高地址; 小端格式:数据的低字节存在低地址,高字节存在高地址。 2、arm公司推出的AMBA片上总线标准包括:AHB系统总线和APB外设总线。 3、最大寻址空间4GB(2的32次方)。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以 字节 为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。 4、ARM指令集32位,Thumb指令集是ARM指令集的一个子集,允许指令编码长度为16位。ARM核就好比一个高中学校,那种包含普通高中和职业高中的。普通高中就相当
[单片机]
STM32串口接收字符串并控制LED
串口相关配置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
[单片机]
<font color='red'>STM32</font>串口接收字符串并<font color='red'>控制</font>LED
STM32控制器的可靠串口通信技术研究
引言 STM32F107微控制器是意法半导体推出的高性能32位以CortexM3为内核的面向工业控制的处理器。该处理器内部通过一个多层的AHB总线构架相连,其内部集成了丰富的外设,如USART、SPI、ADC等等。另外,STM32F107处理器还提供多达80个通用I/O接口,如此丰富的资源使STM32系列微控制器能够很理想地用于工业控制。本文设计出一种基于STM32F107的可靠串口通信设计方案,可以完成STM32F107处理器和PC机以及其他串口之间的可靠通信 。 1 串口通信的实现 1.1 硬件设计 STM32F107处理器的通用同步异步通信单元(USART)提供 5个独立的异步串行接口,并且都能工作在中断和DMA模式
[单片机]
<font color='red'>STM32</font>微<font color='red'>控制</font>器的可靠串口通信技术研究
STM32 PWM实现精确输出脉冲数控制电机
精确输出脉冲数控制电机,使用stm32单片机的pwm功能实现,精确控制脉冲个数 单片机源程序如下: #include stm32f10x_lib.h #include sys.h #include usart.h #include delay.h #include led.h #include exti.h #include key.h #define MOTOR_DIR PBout(11)// PB11 #define MOTOR_EN PEout(15)// PE15 u16 i; u16 fre; u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 u1
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved