有源蜂鳴器內含振蕩源,只要一通電就發聲,但發生頻率固定,音色單一;無源蜂鳴器內部不含振蕩源,內部結構相當于電磁場揚聲器,可以通過給他輸出一定頻率的信號才能發聲。
人耳能聽到的頻率范圍在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,
上一篇:S3C2440核心板原理圖設計:與SDRAM接線分析
下一篇:最后一頁
推薦閱讀
史海拾趣
Alliance Memory是一家專注于存儲器產品的公司,以下是其發展歷程的五個相關故事:
成立與發展初期: Alliance Memory成立于2006年,總部位于美國南卡羅來納州。公司專注于提供DRAM(動態隨機存取存儲器)和SRAM(靜態隨機存取存儲器)解決方案。在成立之初,公司致力于與全球供應鏈建立緊密的合作關系,以確保產品的質量和可靠性。通過與先進制造廠商合作,Alliance Memory能夠提供高品質的存儲器產品,滿足客戶的需求。
擴大產品線: 隨著市場需求的增長,Alliance Memory不斷擴大其產品線,涵蓋各種容量和類型的DRAM和SRAM產品。公司不斷改進和優化其制造工藝,并與全球領先的技術合作伙伴密切合作,以確保產品的性能和穩定性。通過不斷提供新的存儲器解決方案,Alliance Memory成功吸引了更多的客戶,并在行業中樹立了良好的聲譽。
全球市場拓展: Alliance Memory的產品銷售遍布全球各個地區,包括美國、歐洲、亞洲等市場。公司與全球各地的分銷商和代理商建立了穩固的合作關系,以擴大其產品的市場份額。通過在全球范圍內提供及時和高效的客戶服務,Alliance Memory不斷增強了其在國際市場上的競爭力。
技術創新與研發投入: 作為一家技術驅動型公司,Alliance Memory不斷投入研發和創新,以提供最先進的存儲器產品。公司的研發團隊與業界領先的技術合作伙伴密切合作,不斷推出具有競爭優勢的新產品。通過持續的技術創新,Alliance Memory得以不斷滿足客戶不斷增長的需求,并保持在行業中的領先地位。
可持續發展與社會責任: 除了致力于業務發展,Alliance Memory還積極履行企業社會責任,關注環境保護和社會公益事業。公司采取了一系列可持續發展的舉措,包括節能減排、資源循環利用等,努力降低對環境的影響。此外,Alliance Memory還參與各種公益活動,支持教育、環保和社區發展等領域的項目,為社會做出積極貢獻。
2014年,ACAM公司迎來了一個重要的里程碑事件——被奧地利微電子股份有限公司收購。這次收購極大地增強了ACAM公司在時間數字轉換器(TDC)技術領域的實力。奧地利微電子在半導體行業有著深厚的積累和豐富的經驗,與ACAM公司的技術優勢相結合,進一步提升了ACAM公司在市場上的競爭力。
在快速發展的過程中,BCD Semi(Diodes)積極尋求風險投資和資本運作的支持。公司通過吸引國內外知名的投資機構參與投資,獲得了大量的資金支持,為公司的研發、生產和市場拓展提供了有力的保障。同時,BCD Semi還通過并購、合作等方式,與行業內的其他企業實現資源共享和優勢互補,進一步提升了公司的綜合實力。
為了進一步擴大市場份額,Appointech Inc公司開始積極拓展海外市場。通過與國際知名企業的合作,公司成功打入國際市場,產品銷量大幅提升。同時,公司還積極參加國際電子展會和交流活動,與全球同行建立了廣泛的合作關系,為公司的長遠發展奠定了堅實的基礎。
EM Devices Corporation的創始人在電子工程領域有著深厚的背景,他們看到了當時市場上對高性能電子元件的迫切需求。于是,他們決定創辦EM Devices Corporation,專注于研發和生產高質量的電子元件。起初,公司面臨了資金、技術和市場等多方面的挑戰。然而,憑借創始人對技術的執著追求和對市場的敏銳洞察,公司成功研發出了一款具有競爭力的產品,并逐漸在市場上獲得了認可。
隨著公司的發展,EM Devices Corporation不斷加大對研發的投入,致力于推出更具創新性的產品。一次偶然的機會,公司的研發團隊發現了一種新型材料,它具有優異的電氣性能和穩定性。經過數月的艱苦研發,公司成功將這種材料應用于產品中,并推出了一款性能卓越的新型電子元件。這一創新產品不僅為公司帶來了豐厚的利潤,還進一步鞏固了公司在行業內的領先地位。
模擬信號——在時間上和數值上連續的信號。 數字信號——在時間上和數值上不連續的(即離散的)信號。 模擬電路——對模擬信號進行傳輸、處理的電子線路。 數字電路——對數字信號進行傳輸、處理的電子線路。 N進制數 十進制數:將N進制 ...… 查看全部問答∨ |
|
平臺PXA270+wince5.0 我在改一個touch驅動,其中需要判斷touch irq的狀態,即中斷引腳是高還是低,我的中斷信號連到了GPIO_40,所以我使用g_pGPIORegs->GPLR1 & 0x00000100來判斷high或者low,但是測試發現,不管touch有沒有點住,返回值都是h ...… 查看全部問答∨ |
|
·直播時間:2007年11月23日上午10:00——11:30時 ·訪談嘉賓:周鐵文 張向東 ·嘉賓簡介:周鐵文-產品市場管理本部整機事業部總監 張向東-紫金橋軟件石化領域 ...… 查看全部問答∨ |
|
LED照明是繼白熾燈、熒光燈之后照明光源的第三次革命,它在節約能源方面優勢明顯。LED模組壽命長,發光效果更好,并且更節能,這些都是其發展極被看好的主要因素。LED(Light Emitting Diode),發光二極管,是一種固態的半導體器件,它可以直接把 ...… 查看全部問答∨ |
|
求助!使用MSP430F1611的,但是沒有講到MSP430F1611的IIC的寄存器,想下載又沒有,datasheet不全,有高手有datasheet關于MSP430F1611的寄存器的資料嗎,或者硬件iic的例程也可以,謝謝啊… 查看全部問答∨ |