如何利用蜂鸣器制作MIDI音乐

目录

  • 蜂鸣器简介
  • MIDI音乐制作原理
  • 《小星星》制作代码展示

引言:在单片机开发中我们经常会用到蜂鸣器实现一些简单提示的功能,但如何利用单片机制作一些更有趣的事情呢,今天我们将利用蜂鸣器来制作一首好听的MIDI音乐。很多人可能会觉得没必要,用手机我们就就可以想听什么歌就听什么歌了,但其实对于我们单片机开发者来说自己动手写一个程序蜂鸣器按照我们给的频率响起来,会让我们的开发过程变的更加有趣,也使得我们拥有更加浓厚的兴趣学下去。

一蜂鸣器简介
有源蜂鸣器和无源蜂鸣器的区别:
在这里插入图片描述
这里我们使用的是无源蜂鸣器,通过单片机予相应的频率使它发出相应的声音。

硬件设计图:
在这里插入图片描述
当我们PB5输出低电平使三极管导通,蜂鸣器就可以工作了,但由于我们使用的是无源蜂鸣器单纯的通电并不能使蜂鸣器发出鸣响,要使无源蜂鸣器鸣响需要我们PB5端口不断输出高低变化的脉冲信号,当信号频率不同时发出的声音就不同,根据这个原理,只要我们根据音乐乐谱让单片机PB5端口连续输出不同频率的信号蜂鸣器的鸣响就可以组成一支音乐啦。

在这里插入图片描述
如图单片机输出的信号是这样的一个高低电平信号,频率周期的数量就是蜂鸣器鸣响的时长,而改变每个频率周期中高低电平的比例就可以改变无源蜂鸣器发出的声音。
在这里插入图片描述
根据C字符对照表我们可以得到每个音调对应的频率。
二、《小星星》MIDI音乐制作过程

在这里插入图片描述

这是《小星星》的乐谱信息,根据上面的音调频率对照表,我们就可以把乐谱信息转化为频率信息。
相关乐谱信息:
乐谱图中重点看每个拍的时间信息
J=100表示每分钟有103拍,即60s=100拍,所以一拍的时间约为600ms
根据他是多少拍就可以算出蜂鸣器一个音调鸣响的时间
在这里插入图片描述

在我们的程序中我们把音乐的每个音调的频率信息和发声时间长度为一组放入 music1[ ]数组中其中奇数为音调频率信息偶数为发声时间长度,其中每个音调的发声时间长度可以根据乐谱看他是多少拍,根据一拍为多长时间可以计算出每个音调的时间。如在这首歌中每个音调都是一拍而这里一拍为600ms所以这里我们
每个音调发声时间都为600ms,关于乐谱的更多信息可以到网上查找。

> `这里是引用`
uc16 music1[64]={ //音乐1的数据表(奇数是对应音调频率,偶数是发声时间长度
523,600,
523,600,
784,600,
784,600,
880,600,
880,600,
784,600,
0,1200,
698,600,
698,600,
659,600,
659,600,
587,600,
587,600,
523,600,
0,1200,
784,600,
784,600,
698,600,
698,600,
659,600,
659,600,
587,600,
0,1200,
784,600,
784,600,
698,600,
698,600,
659,600,
659,600,
587,600,
0,1200
};
> 
``

>  void MIDI_PLAY(void){ //MIDI音乐 
>  	u16 i,e; 	
>  for(i=0;i<32;i++){ //这里因为这首歌有32个音调所以这里循环32次
> 		for(e=0;e<music1[i*2]*music1[i*2+1]/1000;e++){
> 			GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鸣器接口输出0
> 		    delay_us(500000/music1[i*2]); //延时		
> >			GPIO_WriteBit(BUZZERP ORT,BUZZER,(BitAction)(1)); //蜂鸣器接口输出高电平1
> > 		delay_us(500000/music1[i*2]); //延时	 		
>        }	 	
>    }
>  }

发布了7 篇原创文章 · 获赞 5 · 访问量 428

猜你喜欢

转载自blog.csdn.net/luozhizhong6666/article/details/104477844