logo资料库

蜂鸣器唱歌,C语言音乐编码.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
单片机演奏音乐时音调和节拍的确定方法 来源:伟纳电子网站 www.willar.com 作者:chenming 经常看到一些刚学单片机的朋友对单片机演奏音乐比较有兴趣,本人也曾是这 样。在此,本人将就这方面的知识做一些简介,但愿能对单片机演奏音乐比较有兴 趣而又不知其解的朋友能有所启迪。 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率, 也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两 个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表 示一个音符唱多长的时间。 在音乐中所谓“音调”,其实就是我们常说的“音高”。在音乐中常把中央 C 上 方的 A 音定为标准音高,其频率 f=440Hz。当两个声音信号的频率相差一倍时,也 . 1,2(来)与 . 2 …… 即 f2=2f1 时,则称 f2 比 f1 高一个倍频程, 在音乐中 1(do)与 正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音内,有 12 个 半音。以 1—i 八音区为例, 12 个半音是:1—#1、#1—2、2—#2、#2—3、3 —4、4—#4,#4—5、5 一#5、#5—6、6—#6、#6—7、7—i。这 12 个音阶的 分度基本上是以对数关系来划分的。如果我们只要知道了这十二个音符的音高,也 就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。 知道了一个音符的频率后,怎样让单片机发出相应频率的声音呢?一般说来, 常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的 I/O 口 来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不 同频率的声音,我们只需将定时器予置不同的定时值就可实现。那么怎样确定一个 频率所对应的定时器的定时值呢?以标准音高 A 为例: A 的频率 f = 440 Hz,其对应的周期为: T = 1/ f = 1/440 =2272μs 由上图可知,单片机上对应蜂鸣器的 I/O 口来回取反的时间应为: t = T/2 = 2272/2 = 1136μs 这个时间 t 也就是单片机上定时器应有的中断触发时间。一般情况下,单片机 奏乐时,其定时器为工作方式 1,它以振荡器的十二分频信号为计数脉冲。设振荡 器频率为 f0,则定时器的予置初值由下式来确定: t = 12 * (TALL – THL)/ f0
式中 TALL = 216 = 65536,T HL 为定时器待确定的计数初值。因此定时器的高低计 数器的初值为: TH = TL = THL / 256 = ( TALL – t* f0/12) / 256 THL % 256 = ( TALL – t* f0/12) %256 将 t=1136μs 代入上面两式(注意:计算时应将时间和频率的单位换算一致), 即可求出标准音高 A 在单片机晶振频率 f0=12Mhz,定时器在工作方式 1 下的定时器 高低计数器的予置初值为 : 根据上面的求解方法,我们就可求出其他音调相应的计数器的予置初值。 440Hz = (65536 – 1136 * 12/12) /256 = FBH 440Hz = (65536 – 1136 * 12/12)%256 = 90H TH TL 音符的节拍我们可以举例来说明。在一张乐谱中,我们经常会看到这样的表达 式,如 1=C 、1=G …… 等等,这里 1=C,1=G 表示乐谱的曲调,和我们前面所 4 4 3 4 3 、 4 4 谈的音调有很大的关联, 4 乐谱中以四分音符为节拍,每一小结有三拍。比如: 3 就是用来表示节拍的。以 4 为例加以说明,它表示 其中 1 、2 为一拍,3、4、5 为一拍,6 为一拍共三拍。1 、2 的时长为四分音 符的一半,即为八分音符长,3、4 的时长为八分音符的一半,即为十六分音符长, 5 的时长为四分音符的一半,即为八分音符长,6 的时长为四分音符长。那么一拍到 底 该 唱 多 长呢 ? 一 般说 来 , 如 果 乐 曲 没 有 特 殊 说 明 , 一 拍 的 时 长 大 约 为 400—500ms 。我们以一拍的时长为 400ms 为例,则当以四分音符为节拍时,四分 音符的时长就为 400ms,八分音符的时长就为 200ms,十六分音符的时长就为 100ms。 可见,在单片机上控制一个音符唱多长可采用循环延时的方法来实现。首先, 我们确定一个基本时长的延时程序,比如说以十六分音符的时长为基本延时时间, 那么,对于一个音符,如果它为十六分音符,则只需调用一次延时程序,如果它为 八分音符,则只需调用二次延时程序,如果它为四分音符,则只需调用四次延时程 序,依次类推。 通过上面关于一个音符音调和节拍的确定方法,我们就可以在单片机上实现演 奏音乐了。具体的实现方法为:将乐谱中的每个音符的音调及节拍变换成相应的音 调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音 符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数……, 如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外, 对于乐曲中的休止符,一般将其音调参数设为 FFH,FFH,其节拍参数与其他音符 的节拍参数确定方法一致,乐曲结束用节拍参数为 00H 来表示。
下面给出部分音符(三个八度音)的频率以及以单片机晶振频率 f0=12Mhz,定 时器在工作方式 1 下的定时器高低计数器的予置初值 :
C 调音符 1 . # 1 . 2 . # 2 . 3 . 4 . # 4 . 5 . # 5 . 6 . # 6 . 7 . 频率 Hz 262 277 293 311 329 349 370 392 415 440 466 494 TH/TL F88B F8F2 F95B F9B7 FA14 FA66 FAB9 FB03 FB4A FB8F FBCF FC0B 1 C 调音符 频率 Hz 523 553 586 621 658 697 739 783 830 879 931 987 TH/TL FC43 3 4 2 4 1# 2# # FC78 FCAB FCDB FD08 FD33 FD5B FD81 FDA5 FDC7 FDE7 FE05 5 5# 6 6# 7 C 调音符 . 1 . 7 频率 Hz 1045 1106 1171 1241 1316 1393 1476 1563 1658 1755 1860 1971 TH/TL FB21 FE3C FE55 FE6D FE84 FE99 FEAD FEC0 FE02 FEE3 FEF3 FF02 . 6 . 2 . 4 . 3 . 5 #. 2 #. 4 #. 1 #. 5 #. 6
分享到:
收藏