日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/29 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 使用STM32F103控制无源蜂鸣器发声播放音乐 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

【注:學習STM32總結(jié)做的筆記,大神勿噴。有不足之處還望不吝賜教。
-----本篇大部分轉(zhuǎn)載而來,有侵權(quán)請聯(lián)系作者,謝謝。】
原博客地址:
https://blog.csdn.net/fanxp66/article/details/80264700
https://blog.csdn.net/SNEZ_H/article/details/71172010

一、無源蜂鳴器和有源蜂鳴器
有源蜂鳴器內(nèi)含振蕩源,只要一通電就發(fā)聲,但發(fā)生頻率固定,音色單一;無源蜂鳴器內(nèi)部不含振蕩源,內(nèi)部結(jié)構(gòu)相當于電磁場揚聲器,可以通過給他輸出一定頻率的信號才能發(fā)聲。
人耳能聽到的頻率范圍在20Hz–20kHz之間,通過STM32的GPIO引腳快速切換高低電平輸出就能實現(xiàn)無源蜂鳴器的發(fā)聲,切換的頻率不同,發(fā)出的音調(diào)就不一樣。

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

程序中首先準備音頻數(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ù)組控制。

如果我們能夠控制好頻率和節(jié)拍,那就有可能演奏出動聽的音樂。因此,我們首先需要搞清楚各音調(diào)的頻率,具體見下表(分別為低音、中音和高音):

我們知道了音調(diào)的頻率后,下一步就是控制音符的演奏時間。每個音符都會播放一定的時間,這樣才能構(gòu)成一首優(yōu)美的曲子,而不是生硬的一個調(diào)的把所有的音符一股腦的都播放出來。音符節(jié)奏分為一拍、半拍、1/4拍、1/8拍,我們規(guī)定一拍音符的時間為1;半拍為0.5;1/4拍為0.25;1/8拍為0.125……,所以我們可以為每個音符賦予這樣的拍子播放出來,音樂就成了。

從簡譜看,該音樂是C調(diào)的,這里的各音符對應的頻率對應的是上表中C調(diào)的部分。另外,該音樂為四分之三拍,每個對應為1拍。(我們知道,音符節(jié)奏分為一拍、半拍、1/4拍、1/8拍,我們規(guī)定一拍音符的時間為1;半拍為0.5;1/4拍為0.25;1/8拍為0.125……,)幾個特殊音符說明如下:
第一,普通音符。如第一個音符5,對應頻率393,占1拍。
第二,帶下劃線音符,表示0.5拍;兩個下劃線是四分之一拍(0.25)。
第三,有的音符后帶一個點,表示多加0.5拍,即1+0.5。
第四,有的音符后帶一個“—”,表示多加1拍,即1+1。
第五,有的兩個連續(xù)的音符上面帶弧線,表示連音,可以稍微改下連音后面那個音的頻率,比如減少或增加一些數(shù)值(需自己調(diào)試),這樣表現(xiàn)會更流暢,其實不做處理,影響也不大。

** 注:因為我不會看樂譜,編的并不怎么樣,所以。。。如果要改成別的歌曲,改時間和音調(diào)就可以了。**

源碼地帶:
beep.c

#include "beep.h" #include "delay.h"int melody[] = {50, 50, 50, 50, 200, 200, 200, 400, 400, 500, 500, 500};void BEEP_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_11);// GPIO_SetBits(GPIOA,GPIO_Pin_11); }void Sound(u16 frq) {u32 time;if(frq != 1000){time = 500000/((u32)frq);BEEP = 1;delay_us(time);BEEP = 0;delay_us(time);}elsedelay_us(1000); } void Sound2(u16 time) {BEEP = 1;delay_ms(time);BEEP = 0;delay_ms(time); }void play_successful(void) {int id=0;for(id = 0 ;id < 12 ;id++){Sound2(melody[id]);} } void play_failed(void) {int id=0;for(id = 11 ;id >=0 ;id--){Sound2(melody[id]);} } void play_music(void) { //紅海情歌 // 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, // 13,8,9,10,10,9,8,10,9,8,6,13,6,8,9,9,8,6,9,8,6,5,13,2,3,5,5,3,5,5,6,8,7,6,6,10,9,9,8,6,5,6,8 }; // u8 time[] = {2,4,2,2,2,2,2,8,4, 4,2,4,2,2,2,2,2,8,4, 4, 2,4,2,4,2,2,4,2,2,8,2,4,2,2,2,2,2,8,4 ,4, // 2,4,2,2,2,2,2,8,4, 4,2,4,2,2,2,2,2,8,4,4,2,4,2,4,2,2,4,2,2,8,2,4,2,2,2,2,2,8, // 4,2,2,2,4,2,2,2,2,2,8,4,2,2,2,4,2,2,2,2,2,8,4,2,2,2,4,2,2,5,2,6,2,4,2,2,2,4,2,4,2,2,12 };/*************************************************************************************************************************///生日快樂 // 0 1 2 3 4 5 6 7 低1 低2 低3 低4 低5 低6低7uc16 tone[] ={250,262,294,330,350,393,441,495,525,589,661,700,786,882,990}; //音調(diào) u8 music[]={5,5,6,5,8,7,5,5,6,5,9,8,5,5,12,10,8,7,6,11,11,10,8,9,8,5,5,8,5,5,12,10,8,7,6,11,11,10,8,9,8 //樂譜音調(diào)}; u8 time[] = {1,2,2,2,2,4,1,2,2,2,2,4,1,2,2,2,1,4,4,1,2,2,2,2,4,1,2,4,1,2,2,2,1,4, 4,1,2,2,2,2,4,4 //節(jié)拍時間}; u32 yanshi;u16 i,e;yanshi = 10;for(i=0;i<sizeof(music)/sizeof(music[0]);i++){for(e=0;e<((u16)time[i])*tone[music[i]]/yanshi;e++){Sound((u32)tone[music[i]]);} } }

beep.h

#ifndef __BEEP_H #define __BEEP_H #include "sys.h"#define BEEP PAout(11) void BEEP_Init(void); void Sound(u16 frq); void Sound2(u16 time); void play_music(void); void play_successful(void); void play_failed(void);#endif

main.c

#include "sys.h" #include "delay.h" #include "usart.h" #include "key.h" #include "led.h" #include "beep.h" int main(void){ delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); KEY_Init(); LED_Init(); BEEP_Init(); while(1){ play_music(); } }

文件源碼下載鏈接:https://download.csdn.net/download/qq_28056277/10853285

https://download.csdn.net/download/qq_28056277/11429148
(考慮到積分越下載越貴的問題,就再上傳了一次)
轉(zhuǎn)載總結(jié)文章,若有侵權(quán),請聯(lián)系作者刪除,謝謝。

總結(jié)

以上是生活随笔為你收集整理的STM32 使用STM32F103控制无源蜂鸣器发声播放音乐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。