那么,今天分享的是利用蜂鸣器来演奏一些简单的乐谱。
实验平台为stm32,当然51也完全可以做,其核心思想是相似的。
首先是对蜂鸣器的介绍。蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器包括有源蜂鸣器和无源蜂鸣器,有源蜂鸣器只要通上电就可以发声,而无源蜂鸣器需要有一定频率的脉冲才能发声。
上图为无源蜂鸣器电路,下图为有源蜂鸣器电路。因为单片机的输出电流很小,不能直接驱动蜂鸣器,所以用了三极管来放大电流。在上边的电路中,当输入高电平时,三极管导通,电流可以由3.3V电源流向蜂鸣器,当输入低电平时,三极管截止,蜂鸣器与GND相连。通过单片机管脚输出一段脉冲,即可让蜂鸣器发声。在下边的电路中,只要输入为低电平,三极管导通,蜂鸣器就可以发声。
那么,蜂鸣器发出的声音大小、音调高低和什么有关呢?声音大小和输入脉冲的占空比有关,占空比越大,声音越大,而音调的高低和脉冲频率有关,频率越高,音调也就越高,通常让输出频率为1.5~5kHZ。
接下来讲解具体如何实现让蜂鸣器演奏乐谱。
首先得对音乐简谱有一定了解。本人对音乐简谱也并不算很了解,如果要深入了解,请自行百度搜索。下面是我的一些粗略见解。
一首曲子包含音调和节拍。音调也就是平常我们说的音调,比如1,2,3,4,5,6,7。音调越来越高,音调还包括低音、中音、高音。而节拍就是一个调子唱多久,有的音拖的长一些,有的音就比较短。这两个要素是今天编程的核心。
首先说音调,前面讲到,音调的高低是和脉冲的频率有关系的,这个关系已经有人将它做成了表格,下面截取一部分:
频率与周期成倒数,在一个脉冲里面,让一半为高电平,一半为低电平,而脉冲周期可以通过延时函数来确定,于是,编写频率发生函数。
while(1)
{
beep=!beep;
led1=0;
delay_us(music[k]);
}
其中在delay_us()这个函数里的输入参数就可以根据乐谱然后查表得到,就是上面的半周期。 由于这个参数是随着乐谱变化的,因此,我们可以把乐谱转化之后的数据放到一个数组里面,持续地调用数组里的数据。
这样,音调就解决了。 接下来解决节拍的问题。 其实要解决节拍的问题,无非就是要考虑music[k]多久刷新一次。 我们可以想象一下,如果music[k]是每隔固定的一段时间跳到下一个,那么造成的后果就是两个音调之间的时间是一样的,这样听起来肯定是非常怪的。 假设music[k]刷新的特别快,beep刚好发生一次翻转,music[k]就发生了改变,这样也是不行的,因为如果刷新这么快的话,它连一个完整的脉冲周期都没有走完。 因此,music[k]应该要刷新慢一些,并且是随着乐谱改变的。 刷新的慢,听起来就会比较舒缓而已。
所以,我们可以采用定时器中断来实现。 每次发生中断,就让数组里的数据跳到下一个,实现数据的刷新,同时,改变定时器装载值,让每次发生中断所需的时间不一样,这个时间就是由乐谱的节拍决定的。
实现函数
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update))
{
if(k
这样也就完美解决了节拍的问题。 解决了这两个问题,理论上我们可以把任何一首简谱转化为频率(周期)和节拍(间隔时间)这两个量,然后用数组保存好,这样就可以通过蜂鸣器演奏出来了,当然,这需要花费很多的时间和精力,而且对于很多人来说,并不是很容易看懂简谱。
于是,有了一款软件可以比较方便的获取这些数据,软件截图如下
曲谱存贮格式 unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)
音高由三位数字组成:
个位是表示 1~7 这七个音符
十位是表示音符所在的音区:1-低音,2-中音,3-高音;
百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n): |0 |1 |2 |3 | 4 | 5 | 6
|几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n
十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音
百位是符点位: 0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11) :是指乐曲升多少个半音演奏;
|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;
|演奏速度(1-12000):值越大速度越快;
这款软件提取的信息比较丰富,如果要求不高的话,只要能够大概使用一下就好。比如它生成的音高,如果我们只是用来延时的话,那么只要把它扩大或者缩小一定倍数,使它落在频率(周期)区间(前面讲到是1.5~5kHZ,换算成半周期就是100us~500us左右),这样就可以比较简单的利用了。
总结:用蜂鸣器演奏乐曲,主要是要把握住两个核心。 一个是音调 ,这个通过改变脉冲频率来实现,其实就是通过精确延时来改变脉冲周期。 另一个是节拍 ,节拍可以简单理解为两个音调之间的时间间隔,要控制不同的节拍,其实就是隔多长的时间去刷新前面的音调,那么可以通过定时器中断来实现,定时的时间就是节拍长度,一旦发生中断,就刷新前面的音调,同时,给定时器装载一个新的值。
全部0条评论
快来发表一下你的评论吧 !