豆皮 - STM32开发板基础教程(五) - 豆皮会唱歌 (原创)
发布: 2008-10-27 19:43 | 作者: littleworm | 来源: StmFans思蜕盟 OPELC 自由电子联盟
豆皮 - STM32开发板基础教程(五) - 我的豆皮会唱歌 (原创) 版权所有 STMFANS 原创,转载请保留出处 http://www.stmfans.com/bbs/viewthread.php?tid=1102&page=1&extra=page%3D1 |
呵呵 不是播放MP3啦(顺便说一下 豆皮播放MP3 bozai已经做出来了哦 呵呵 ) 是利用豆皮STM32开发板上的蜂鸣器播放不同音符 不同的pwm频率加到蜂鸣器上能产生不一样的音符 呵呵 原理到是简单 但是 蜂鸣器真的不好调 音符也不好确定 我花了好长的时间 才确定的频率 把实验室的人都吵疯了 一个个都对我有意见啊 因为我在不停的用蜂鸣器发出“鬼叫的声音” 娃哈哈哈 基本上可以用了 还将就听着 呵呵 附上一个音符表 大家也可以自己去尝试别的频率 呵呵 本教程的主角是:STM32 PWM 蜂鸣器 |
各音的频率 大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵 |
初始化pwm输出 豆皮借的是TIM4的channnel4 呵呵 /******************************************************************************* * Function Name : Change_for_Note * Description : 修改pwm频率 * Input : u16类型的频率值 * Output : None * Return : None *******************************************************************************/ void Change_for_Note(u16 NoteSet) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = NoteSet; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV4; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel4 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = NoteSet/2; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High ; TIM_OC4Init(TIM4, &TIM_OCInitStructure); } |
/* 取得音高和节拍 奏一个音符 */ void Sing_A_Note(int music,int mytime) { int i; Change_for_Note(music); for(i=0;i<mytime;i++) Delay_Ms(50); //nosound(); } |
呵呵 这个频率是我算了半天 算出来的 应该还算准的 呵呵 用在蜂鸣器上 娃哈哈哈 /* 定义节拍 */ #define _HALF 5 #define HALF 10 #define THREE_HALF 15 #define ONE 20 #define ONE_HALF 30 #define TWO 40 #define TWO_HALF 50 /* 定义音高 */ #define low_1 55042 #define low_2 49037 #define low_3 43687 #define low_4 41235 #define low_5 36735 #define low_6 32728 #define low_7 29157 #define mid_1 27520 #define mid_2 24519 #define mid_3 21843 #define mid_4 20617 #define mid_5 18368 #define mid_6 16364 #define mid_7 14579 #define high_1 13761 #define high_2 12259 #define high_3 10922 #define high_4 10309 #define high_5 9184 #define high_6 8182 #define high_7 7246 |
呵呵 歌曲音符和节拍数组 这个数组是我读大二的时候 写的一个PC机程序上面的 当时写的程序是调用主板BIOS的sound()函数 用电脑主板上的小喇叭播放歌曲 呵呵 附件里我也贴上来了 大家可以下载了在电脑上听 MIDI的声音哦 呵呵 // 播放一个歌曲 void Sing_A_Song(void) { /* 数组里数据为音高和节拍 累啊 */ u16 my_music[]={ low_5,HALF,mid_2,HALF,mid_1,HALF,mid_1,HALF,mid_3,ONE_HALF,/**/ low_5,HALF,mid_1,HALF,low_7,HALF,mid_1,HALF,mid_3,ONE_HALF, mid_3,ONE,/**/mid_1,_HALF,low_7,_HALF,low_6,HALF,mid_1,HALF, mid_1,HALF,low_6,_HALF,mid_4,_HALF,mid_4,HALF,mid_3,HALF,mid_3,ONE_HALF, mid_1,_HALF,mid_5,HALF,mid_4,HALF,mid_3,_HALF,mid_2,_HALF, mid_2,ONE_HALF,/**/mid_6,_HALF,mid_3,HALF,low_6,HALF,low_6,HALF, low_5,HALF,low_6,HALF,mid_3,ONE,mid_1,_HALF,low_7,_HALF, mid_1,HALF,low_7,HALF,mid_1,HALF,mid_5,ONE,mid_1,HALF,mid_1,HALF, mid_1,_HALF,mid_1,_HALF,mid_5,HALF,mid_6,_HALF,mid_5,_HALF, mid_5,HALF,mid_1,HALF,mid_5,HALF,mid_4,ONE,mid_3,_HALF, mid_1,_HALF,mid_1,_HALF,low_5,_HALF,low_5,HALF,low_5,ONE,/**/ mid_1,HALF,mid_5,HALF,mid_6,HALF,mid_6,HALF,mid_1,HALF, mid_3,ONE,low_5,HALF,low_6,HALF,mid_1,HALF,mid_2,_HALF, mid_1,_HALF,mid_1,_HALF,mid_3,_HALF,mid_3,TWO,/**/mid_3,ONE_HALF, mid_1,_HALF,high_1,HALF,mid_7,_HALF,mid_7,_HALF,mid_7,HALF, mid_6,HALF,mid_6,_HALF,mid_7,_HALF,mid_6,HALF,mid_3,_HALF, mid_2,_HALF,mid_1,HALF,mid_2,HALF,mid_2,HALF,mid_1,_HALF, mid_5,_HALF,mid_5,HALF,mid_2,ONE,/**/mid_3,_HALF,mid_2,_HALF, mid_3,HALF,mid_6,HALF,mid_6,_HALF,high_1,_HALF,mid_6,HALF, mid_6,ONE_HALF,/**/mid_5,HALF,mid_6,HALF,mid_5,HALF,mid_5,HALF, mid_5,_HALF,mid_3,_HALF,mid_2,_HALF,mid_1,THREE_HALF,mid_1,HALF, low_6,_HALF,mid_1,_HALF,mid_2,HALF,mid_3,_HALF,low_6,_HALF, low_6,HALF,low_6,_HALF,mid_1,_HALF,mid_2,ONE_HALF,low_5,_HALF, low_5,_HALF,mid_5,_HALF,mid_6,_HALF,mid_5,HALF,mid_5,HALF, mid_6,HALF,mid_2,HALF,mid_2,ONE_HALF,/*repare*/mid_3,_HALF,mid_5,_HALF, mid_5,HALF,mid_3,_HALF,mid_3,_HALF,mid_3,HALF,mid_2,HALF, mid_1,_HALF,mid_2,_HALF,mid_1,HALF,mid_3,_HALF,mid_6,_HALF, mid_6,HALF,mid_3,HALF,mid_5,ONE_HALF,mid_3,HALF,mid_6,HALF, mid_7,_HALF,mid_6,_HALF,mid_6,THREE_HALF,mid_3,_HALF,mid_6,HALF, mid_7,HALF,mid_6,HALF,mid_6,HALF,mid_3,HALF,mid_2,HALF,mid_1,HALF, low_6,HALF,mid_2,HALF,mid_2,ONE,mid_2,_HALF,mid_3,_HALF,low_6,HALF, mid_1,_HALF,low_6,_HALF,mid_1,HALF,mid_1,_HALF,low_6,_HALF, mid_2,HALF,mid_3,ONE,mid_1,_HALF,low_7,_HALF,mid_1,HALF,mid_5,HALF, mid_5,HALF,mid_6,_HALF,mid_2,_HALF,mid_2,HALF,mid_3,HALF,mid_3,HALF, mid_1,_HALF,low_7,_HALF,low_6,HALF,mid_2,HALF,mid_2,HALF,mid_2,_HALF, mid_1,_HALF,mid_2,_HALF,mid_3,HALF,mid_2,_HALF,mid_2,HALF, mid_1,HALF,mid_1,HALF,mid_2,ONE_HALF,mid_2,TWO,/**/mid_3,_HALF,mid_5,_HALF, mid_5,HALF,mid_3,_HALF,mid_3,_HALF,mid_3,HALF,mid_2,HALF, mid_1,_HALF,mid_2,_HALF,mid_1,HALF,mid_3,_HALF,mid_6,_HALF, mid_6,HALF,mid_3,HALF,mid_5,ONE_HALF,mid_3,HALF,mid_6,HALF, mid_7,_HALF,mid_6,_HALF,mid_6,THREE_HALF,mid_3,_HALF,mid_6,HALF, mid_7,HALF,mid_6,HALF,mid_6,HALF,mid_3,HALF,mid_2,HALF,mid_1,HALF, low_6,HALF,mid_2,HALF,mid_2,ONE,mid_2,_HALF,mid_3,_HALF,low_6,HALF, mid_1,_HALF,low_6,_HALF,mid_1,HALF,mid_1,_HALF,low_6,_HALF, mid_2,HALF,mid_3,ONE,mid_1,_HALF,low_7,_HALF,mid_5,HALF, mid_5,HALF,mid_5,HALF,mid_6,_HALF,mid_2,_HALF,mid_2,HALF, mid_1,HALF,low_6,_HALF,mid_3,_HALF,mid_2,ONE_HALF,mid_2,_HALF, mid_1,_HALF,mid_2,_HALF,mid_3,_HALF,mid_2,HALF,mid_2,HALF, mid_1,_HALF,mid_2,_HALF,mid_1,HALF,mid_1,ONE_HALF,mid_1,ONE,1 }; u16 i=0; while( my_music != 1 ) { Sing_A_Note(my_music,my_music[i+1]); i=i+2; } } |
感觉在电脑上听的效果要好很多 不知道是不是蜂鸣器的质量问题还是我的频率没有选好 呵呵 先这样咯 有时间再来折腾 |
完整工程在附件里 敬请继续关注 豆皮的的教程会逐步推出 |


喔,想起当年,第一次发表文章的时候,写的就是发声程序
太难听了,蜂鸣器这东西实在不适合放音乐。
哈哈。
不过这个东西放放《生日歌》应该不错。
小时候的音乐卡片应该就是这个原理阿。
QUOTE:
额 我调试的时候更痛苦呢 这个已经是调的比较靠谱的发音了晕菜 电脑主板唱《烛光》 还将就能听 呵呵