豆皮 - 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   蜂鸣器  




各音的频率  大家可以参考着修改频率 这样就可以发出悦耳的声音了 呵呵


Image00000.jpg





初始化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;
    }
}




感觉在电脑上听的效果要好很多 不知道是不是蜂鸣器的质量问题还是我的频率没有选好 呵呵 先这样咯 有时间再来折腾




完整工程在附件里

敬请继续关注 豆皮的的教程会逐步推出


lvhaian (2008-10-27 21:29:11)
好文章,顶。
jasonjee (2008-10-27 21:58:50)
很不错,写的也很详细,相当好

喔,想起当年,第一次发表文章的时候,写的就是发声程序
sunke9 (2008-11-01 15:19:52)
这个有意思,试一试
lostgb (2008-11-01 22:46:17)
支持一下,很详细
lostgb (2008-11-01 22:47:25)
支持一下,写的很详细
ddllxxrr (2008-11-09 07:11:55)
好东东顶
ddllxxrr (2008-11-09 07:13:15)
太好了,收下太好了,收下 太好了,收下
wjmcu (2008-11-18 09:46:57)
支持一下,很详细
wjmcu (2008-11-18 09:47:35)
yayongzhang (2008-11-20 10:48:21)
小虫子辛苦了
lvhaian (2008-11-20 17:17:46)
虫子,把你工程下载进去了。

太难听了,蜂鸣器这东西实在不适合放音乐。

哈哈。

不过这个东西放放《生日歌》应该不错。

小时候的音乐卡片应该就是这个原理阿。
littleworm (2008-11-20 20:40:49)

QUOTE:

原帖由 lvhaian 于 2008-11-20 17:17 发表
虫子,把你工程下载进去了。

太难听了,蜂鸣器这东西实在不适合放音乐。

哈哈。

不过这个东西放放《生日歌》应该不错。

小时候的音乐卡片应该就是这个原理阿。 ...
额 我调试的时候更痛苦呢 这个已经是调的比较靠谱的发音了
晕菜 电脑主板唱《烛光》  还将就能听  呵呵
jameslee2005 (2008-12-05 12:36:54)
这个有意思,试一试
c51avr (2008-12-06 11:07:40)
呵呵,有意思
caixingang (2008-12-09 19:36:55)
回帖支持一下!
caixingang (2008-12-09 19:38:32)
下载不了附件了
wy118116 (2008-12-15 18:30:22)
辛苦了,我一定好好学习,哈哈
TONDA (2008-12-19 14:34:45)
这是一个很有创意的话题,可以发掘发掘。
lljyes (2008-12-20 12:53:48)
听听唱的如何!
mlf_003 (2008-12-22 13:59:14)
看看 哈哈!