单片机音乐设计详解

声音是由振动产生的,不同的振动频率产生不同的音高。振动次数多,音则高,振动次数少,音则低。音乐中使用 Do(C)、Re(D)、Mi(E)、Fa(F)、So(G)、La(A)、Si(B) 音符来表示固定的音高,常把中央 C 上的 A 音定为标准音高,其频率为每秒振动 440 周。

如何利用单片机使蜂鸣器发出 A 这个音呢?

音乐的产生主要通过单片机的 I/O 口输出高低不同的脉冲信号来控制蜂鸣器,一高一低为一周期,A 音的振动周期为 1s/440 = 2272us ,高低电平时间各取一半为 1136us。用定时器计时这个半周期时间,当 I/O 输出高电平 1136us 后产生中断,再输出低电平 1136us,如此反复,就可产生 A 这个音。

音符对应频率周期表:

从表中可以发现,高中低音之间正好相差一个倍频,高音 = 2中音,中音 = 2低音。在音乐学中称它相差一个八度音,在一个八度音内,又包含 12 个半音,以 1 — i 八音区为例,12 个半音是: 1—#1、#1—2、2—#2、#2—3、3—#3、#3—4、4—#4,#4— 5、5 一#5、#5—6、6—#6、#6—7、7— i。#1 频率的计算方式 262 + (294 - 262)/2,其它半音频率的计算方式即如此。

当然,对于单片机来说,蜂鸣器只能发出单音,它既没有音色,也没有振幅,所以没有必要细分那么多音调。

另外还有节拍,既拍速,每个音调所发音的长度,随便拿一张钢琴简谱看一下:

1=B 表示 Do = B,即该曲子为 B 调,4/4 是拍号,表示这曲子是以 4 分音符为一拍,每小节有 4 拍 。125 为 4 分音符的拍速,每分钟 125 拍,1 拍即 60s/125 = 480ms 。使用小节的记法,上面简谱中没有下划线的数字为 1 拍,记做  1/4 拍为 480ms, 带一个下划线的,记 1/8 拍为 240ms,带两个下划线的 ,记 1/16 拍为 120ms。

这里,已经知道了音调的频率和延时时间,通过一个数组表来记录音乐的数据,每 3 个字节为一组,第一个字节记录音符,第二个字节记录音高,第三个字节记录时间。音符范围 0 - 7,对应的是音调的频率(0 为休止符,1 - 7 为 Do - Si )。音高范围 1 -5 ,对应超低音到超高音(1:超低音,2:低音,3:标音,4:高音,5:超高音)。延时时间:1/4 记作 4, 1/8 记作8, 1/16 记作 16。以上面简谱为例:

unsigned char music = {0,3,8,   5,2,8,    1,3,8,    2,3,8, ......}

在主程序循环中,计算频率,赋值定时器初始值,然后延时。

赞(0) 打赏
取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

    暂无评论...