经常看到一些刚学单片机的朋友对单片机演奏音乐比较有兴趣,本人也曾是这
样。在此,本人将就这方面的知识做一些简介,但愿能对单片机演奏音乐比较有兴
趣而又不知其解的朋友能有所启迪。
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,
也就是说不能象电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两
个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示
一个音符唱多长的时间。
在音乐中所谓“音调”,其实就是我们常说的“音高”。在音乐中常把中央 C 上方
的 A 音定为标准音高,其频率 f=440Hz。当两个声音信号的频率相差一倍时,也即
f2=2f1 时,则称 f2 比 f1 高一个倍频程, 在音乐中 1(do)与 ,2(来)与 ……
正好相差一个倍频程,在音乐学中称它相差一个八度音。在一个八度音内,有 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,它以振荡器的十二分频信号为计数脉冲。设振荡
器频率为 f
0
,则定时器的予置初值由下式来确定:
t = 12 *(T
ALL
– T
HL
)/ f
0
式中 T
ALL
= 2
16
= 65536,T
HL
为定时器待确定的计数初值。因此定时器的高
低计数器的初值为:
TH = T
HL
/ 256 = ( T
ALL
– t* f
0
/12) / 256