国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

使用STM32控制無源蜂鳴器發(fā)聲播放音樂(STM32_07)

發(fā)布者:草莓熊貓最新更新時間:2019-05-29 來源: eefocus關(guān)鍵字:STM32控制  無源蜂鳴器  播放音樂 手機看文章 掃描二維碼
隨時隨地手機看文章

一、無源蜂鳴器有源蜂鳴器


有源蜂鳴器內(nèi)含振蕩源,只要一通電就發(fā)聲,但發(fā)生頻率固定,音色單一;無源蜂鳴器內(nèi)部不含振蕩源,內(nèi)部結(jié)構(gòu)相當(dāng)于電磁場揚聲器,可以通過給他輸出一定頻率的信號才能發(fā)聲。


人耳能聽到的頻率范圍在20Hz--20kHz之間,通過STM32的GPIO引腳快速切換高低電平輸出就能實現(xiàn)無源蜂鳴器的發(fā)聲,切換的頻率不同,發(fā)出的音調(diào)就不一樣。


二、音樂播放的實現(xiàn)


一段音樂就是不同頻率的聲音按一定的時間節(jié)拍轉(zhuǎn)換發(fā)出。所以音樂包含音調(diào)和節(jié)拍信息。

如果要實現(xiàn)歌曲“紅塵情歌”,要準(zhǔn)備相應(yīng)的數(shù)據(jù)。


歌譜如下:



程序中首先準(zhǔn)備音頻數(shù)據(jù)表:


//         低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,……};//音調(diào)


u8 time[] = {  2,4,2,2,2,2,2,8,4, 4, ……}; //節(jié)拍時間


依次從音調(diào)數(shù)組中取music[i],然后根據(jù)music[i]的值在tone數(shù)組中得到該音的發(fā)聲頻率(tone[music[i]]),調(diào)用sound函數(shù)控制蜂鳴器發(fā)聲,聲音的發(fā)聲時間有time數(shù)組控制。


三、項目創(chuàng)建與配置


1、創(chuàng)建項目文件夾(設(shè)為pMusic)


2、通過Keil5創(chuàng)建新項目,保存在所創(chuàng)建的文件夾中(設(shè)項目名為pMusic),選擇MCU芯片為"STM32F103ZE"(本程序使用的硬件為:STM32-PZ6806L開發(fā)板


3、在pMusic項目文件夾中新建"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"文件夾。


①  在"CMSIS"文件夾中復(fù)制"core_cm3.h"和"core_cm3.c"文件;


②  在" Device "文件夾中復(fù)制"stm32f10x.h"、"system_stm32f10x.h"和"system_stm32f10x.c"文件;


③  在" Startup "文件夾中復(fù)制"startup_stm32f10x_hd.s"文件;


④在"Lib"文件夾中新建"inc"和"src"兩個子文件夾,在"inc"文件夾中復(fù)制"misc.h"、"stm32f10x_gpio.h"和"stm32f10x_rcc.h"文件;在"src"文件夾中復(fù)制"misc.c"、"stm32f10x_gpio.c"和"stm32f10x_rcc.c"文件;


4、為項目添加"CMSIS"、"Device"、"Public"、"Startup"、"User"和"Lib"組,并將上述C程序文件和"startup_stm32f10x_hd.s"啟動文件加入到相應(yīng)組中。展開項目樹如下:



5、打開“項目配置”對話框,在"Output"選項卡中選擇"Create HEX File",在"C/C++"選項卡中的"Include Paths"中添加如下包含路徑:".CMSIS;", ".Device;", ".Libinc;",".Public;"。


(以上步驟可以參看:使用STM32固件庫操作控制LED燈(CMSIS)   使用STM32固件庫函數(shù)操作控制LED燈


6、在"stm32f10x.h"中添加函數(shù)參數(shù)檢查宏


(參看:使用STM32固件庫函數(shù)操作控制LED燈)


#ifdef  USE_FULL_ASSERT


/**


  * @brief  這個assert_param宏用于函數(shù)參數(shù)檢查


  * @param  expr:如果expr是 false,就調(diào)用 assert_failed函數(shù)報告源文件名和


  *         失敗的行號,如果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"文件夾中,內(nèi)容為:


#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口地址映射


//數(shù)據(jù)輸出寄存器地址


#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)


//數(shù)據(jù)輸入寄存器地址


#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在數(shù)碼管顯示數(shù)字)


8、新建文件"SysTick.h",保存到"Public"文件夾中,內(nèi)容為:


#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"文件夾中,內(nèi)容為:


#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;


}


這兩個文件實現(xiàn)了通過SysTick精準(zhǔn)延時的函數(shù),提供給后續(xù)的音頻頻率產(chǎn)生程序使用。


(關(guān)于SysTick,請參看:在STM32項目中使用SysTick實現(xiàn)延時)


將"SysTick.c"文件添加到項目的"Public"組中。


9、實現(xiàn)發(fā)聲


①開發(fā)板無源蜂鳴器的電路連接如下:


從電路連接可以看出通過MCU的PB5(GPIOB_5)控制蜂鳴器的發(fā)聲。


②在項目文件夾的"User"文件夾下新建"Beep"文件夾,在項目中新建"beep.h"文件,保存在"User/Beep"文件夾中,文件內(nèi)容為:


#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"文件夾中,文件內(nèi)容為:


#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);      //設(shè)置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 不發(fā)音


         uc16 tone[] = {247,262,294,330,349,392,440,294,523,587,659,698,784,1000};//音頻數(shù)據(jù)表


         //紅塵情歌


         u8 music[]={       5,5,6,8,7,6,5,6,13,13,//音調(diào)


                                                                           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]
關(guān)鍵字:STM32控制  無源蜂鳴器  播放音樂 引用地址:使用STM32控制無源蜂鳴器發(fā)聲播放音樂(STM32_07)

上一篇:S3C2440核心板原理圖設(shè)計:與SDRAM接線分析
下一篇:stm32使用MDK開發(fā)中的一些常見問題

推薦閱讀最新更新時間:2025-06-27 04:02

STM32定時器控制led燈亮滅
SysTick—系統(tǒng)定時器是屬于 CM3 內(nèi)核中的一個外設(shè),內(nèi)嵌在 NVIC 中。系統(tǒng)定時器是一個 24bit 的向下遞減的計數(shù)器,計數(shù)器每計數(shù)一次的時間為 1/SYSCLK,一般我們設(shè)置 系統(tǒng)時鐘 SYSCLK 等于 72M。當(dāng)重裝載數(shù)值寄存器的值遞減到 0 的時候,系統(tǒng)定時器就產(chǎn) 生一次中斷,以此循環(huán)往復(fù)。 在使用時,只需要配置前三個寄存器,最后一個校準(zhǔn)寄存器不需要使用。 接下來,利用 SysTick 產(chǎn)生 1s 的時基,LED 以 1s 的頻率閃爍。 1、設(shè)置重裝載寄存器的值 2、清除當(dāng)前數(shù)值寄存器的值 3、配置控制與狀態(tài)寄存器 配置頭文件: void PendSV_Handler(void) { }
[單片機]
STM32學(xué)習(xí)筆記七——LED閃爍的三種控制方法
法一:軟件延時(不精準(zhǔn)) void delay_nms(u16 time) { u16 i=0; while(time--) { i=12000; while(i--); } } 方法二: main.c #include stm32f10x.h __IO uint32_t TimingDelay; /****************** *函數(shù)名稱: LED_GPIO_Config() *功 能:實現(xiàn)LED等GPIO的配置 *參 數(shù):無 *返 回 值:無 *作 者:Katter ******************/ void LED_GPIO_Config(void) {
[單片機]
STM32控制器SPI接口NSS管理分析
看了很多關(guān)于NSS片選信號配置的資料,感覺沒有說清楚的,自己寫了一些個人的看法,希望對大家有用。 首先看我們看下NSS的結(jié)構(gòu)圖,如下。 從上圖中我們可以看出左邊的NSS代表硬件的引腳,右邊的internalnss是內(nèi)部NSS,微處理器根據(jù)這個內(nèi)部的NSS來確定不同的操作。 和NSS相關(guān)的寄存器標(biāo)志位主要是SSM、SSI以及SSOE。SSM用來配置是硬件模式還是軟件模式。SSI用來確定在軟件模式下NSS輸入的極性,SSOE用來決定是否允許內(nèi)部NSS信號送出的NSS引腳上。 對NSS的管理有硬件模式和軟件模式之分,所謂硬件模式(SSM=0,二選一處0端有效),就是內(nèi)部NSS的信號來自于外部NSS引腳,是確確實實的硬東西(引腳)
[單片機]
<font color='red'>STM32</font>微<font color='red'>控制</font>器SPI接口NSS管理分析
stm32快速學(xué)習(xí)6——SysTick 定時1s控制LED
設(shè)置使用外部8M晶振 設(shè)置引腳功能 設(shè)置systick為1s中斷 利用systick中斷就可以得到1s時間 //////////////////////////////////////////////////////////////////////////前言///////////////////////////////////////////////////////////////////////////////////////// stm32的systick通過少數(shù)的程序設(shè)置,當(dāng)使用systick_config()函數(shù)之后,其載入值就是你的參數(shù),并且自動打開中斷,并將中斷設(shè)為最低的優(yōu)先級,將其時鐘設(shè)為HCLK即系統(tǒng)時鐘7
[單片機]
<font color='red'>stm32</font>快速學(xué)習(xí)6——SysTick 定時1s<font color='red'>控制</font>LED
STM32為核心控制芯片實現(xiàn)閘門測量技術(shù)解析方案
在電子工程、資源勘探、儀器儀表等相關(guān)應(yīng)用中,頻率測量是電子測量技術(shù)中最基本最常見的測量之一,頻率計也是工程技術(shù)人員必不可少的測量工具。但是,傳統(tǒng)的頻率測量方法在實際應(yīng)用中有較大的局限性,基于傳統(tǒng)測頻原理的頻率計的測量精度將隨被測信號頻率的變化而變化,傳統(tǒng)的直接測頻法其測量精度將隨被測信號頻率的降低而降低,測周法的測量精度將隨被測信號頻率的升高而降低。本文中提出一種基于ARM與CPLD寬頻帶的數(shù)字頻率計的設(shè)計,以微控器STM32作為核心控制芯片,利用CPLD可編程邏輯器件,實現(xiàn)閘門測量技術(shù)的等精度測頻。 本設(shè)計的技術(shù)指標(biāo): 測頻范圍:1Hz~200MHz,分辨率為0.1Hz,測頻相對誤差百萬分之一。 周期測量:信號測量范圍與精
[單片機]
以<font color='red'>STM32</font>為核心<font color='red'>控制</font>芯片實現(xiàn)閘門測量技術(shù)解析方案
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved