艾巴生活网

您现在的位置是:主页>科技 >内容

科技

驱动蜂鸣器演奏乐曲(蜂鸣器驱动原理与演奏音乐的2种方法)

2024-11-14 20:34:54科技帅气的蚂蚁
电磁蜂鸣器的驱动原理:蜂鸣器发声的原理是电流通过电磁线圈,产生磁场驱动振膜发声。所以需要一定的电流来驱动,而单片机I O引脚的输出电

驱动蜂鸣器演奏乐曲(蜂鸣器驱动原理与演奏音乐的2种方法)

电磁蜂鸣器的驱动原理:

蜂鸣器发声的原理是电流通过电磁线圈,产生磁场驱动振膜发声。所以需要一定的电流来驱动,而单片机I/O引脚的输出电压很小。单片机输出的TTLK电平基本不能驱动蜂鸣器,因为需要加一个放大电路。这里,三极管被用作放大电路。这是示意图:

我这里的J8终端连接到芯片的P1 5端口。当P1 5输出高电平时,三极管截止,蜂鸣器不响。相反,当输出低电平时,蜂鸣器鸣响。

要驱动蜂鸣器发出像唱歌一样的声音,其实只需要让蜂鸣器发出不同频率和时长的声音就可以了。周期等于频率的倒数,所以可以通过频率知道这段时间,所以可以通过调用延时函数或者定时器来实现。同样的发声时长也可以通过延时功能实现,所以让蜂鸣器发声的关键是要知道需要多长时间!

用单片机演奏音乐,只要明确两个概念,即“音”和“拍”。

音调表示一个音符应该唱的频率。

节拍表示一个音符应该唱多长。

这里有两种方法可以实现这个功能:

(1)查表法这种方法的复杂性在于你要找出每个音符对应的频率(根据音符;查频率表),然后根据公式换算成相应的时间(半周),再通过延时功能实现。最后是编程。

整个过程是这样的:

首先根据《生日快乐歌》的配乐,将每个音调转换成相应的频率。

比如左边是生日歌的乐谱,右边是音符频率转换表。

在这里,我们先来了解一下乐谱。左边乐谱号下面有一个小音符。如果没有备注,则是常见的。数字上面有个小音符,但是5的低音是4.5,高音是5.5。其他笔记也是一样。

乐谱左上方写有“1=F”,一般乐谱在C调,表示“1=C”。注意,乐谱中的1234567(哆啦a梦Sorasido)对应的不是ABCDEFG而是CDEFGAB!因此,如果这里的调节是F调,

那就意味着2会唱G,3会唱A,7会唱E,所以这里的低音5应该对应低音1.5!所谓向左或向右的转变是必要的。如果还是不明白,看下面:

1应该对应C,4应该对应F吧?

现在1对应F,相当于4,对吧?

那么1.5对应什么呢?

4.5!

那是什么意思?

5!

那么,低音5是4.5,等于1.5吗?所以半周期是1803 s。

至于为什么按照半周期计算,是因为单片机通过循环设置和复位连接蜂鸣器的端口,所以是半周期。因为我用的是无源蜂鸣器,有源蜂鸣器是全周期的。

然后按照上面的原理,一个一个的用延时函数转换实现,因为每个音符的转换频率不一样,或者用多个延时函数来一个一个的实现精确的基音频率,但是这样太烦了,而且MCU本身也不专业。

唱歌。我们不应该为难他们,所以我们自己将就一下。所以为了适应每个音频率差不多的情况,延时函数是自己算的,不同的歌值不一样,所以这就是问题所在。

困难在于。

然后就是唱多久的问题。一首普通歌曲的默认节拍是400 ms-500 ms。

同样,在乐谱的左上方,写着“3/4”,表示四分音符为拍子,每个小结有三个拍子。

而且每个数字下面都有一条横线,那个时间就是那个节拍的时间乘以0.5,乘以0.25的两倍,乘以0.125的三倍。不要拿音乐基础知识来为难我。我是个音乐白痴。所以我是这么理解的。

哈哈哈哈~

至于节拍到频率的转换,也有对应的表格,如下图:

同样是通过延时功能实现的,当然会有误差。

编程的思路很简单,就是先把音符的频率和要唱的时间进行转换,放入两个数组中。然后在主程序中,通过延时达到相应的频率,唱完一次,停一会儿,再唱。

(2)用工具转码,用定时器实现这个代码明显来自网络。哈哈。原谅我,这个我不解释了。哎,再来说说步骤。(具体的我不是很懂,但是这个真的很通用,所以我就记在笔记里了。)

一开始用MUSICENCODE把乐谱转换成相应的代码,然后根据音调和音区生成新的频率表。所谓调区,就是降调、平调、升调,根据转换码的对应位就可以知道。

再计算一下歌曲的长度,就用while,用来设置唱完之后是否再做一遍或者执行其他动作。

然后取出数组数据的奇数位,那就是音长。然后根据这个,计算一个音会唱多久,把初始值赋给定时器。关于定时器的使用,稍后会发布。

唱一个音最好的方法是设定一个基本的持续时间,因为在这个例子中,一个四分之一拍大概是400ms-500ms,那么有的是1/4拍(100ms),有的是2/4拍(200ms),所以设定一个。

50 m定时器,通话时设置参数即可。这样的好处就是方便。

然后调用函数让它唱歌。

对比这两种方法的优缺点,第一种方法转码太复杂,但声音好,分辨率高。第二种方法是通用的!不同的歌曲,你只需要用工具把代码,然后再用一个数组保存这些值,然后传递

调用函数Play(音乐名称、调号、升降八度、演奏速度)即可,但这种方法达到的音质不是很理想。其实最重要的是,这种方法不懂音乐知识也没关系,第一种方法是

要获得正确的音高频率和音长,需要一定的知识。