||
我们可以利用单片机产生乐曲的音符,并通过蜂鸣器或喇叭播放出音乐。
Ⅰ单片机的发音
⑴ 音调
音调是表示一个音符唱多高的频率,和平时说的“音高”十分类似。
音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音。要想产生音频脉冲信号,需要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半个周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。
通常,利用AT89C5X单片机的内部定时器O,工作在方式1下,改变计数初值TH0和TL0来产生不同的频率(当然也可以利用延时的方法来获得)。
C调部分音符的频率与定时器TH/TL的预置初值(51单片机晶振频率为12MHz,定时器工作于方式1),如下表所示。
低音 | f/Hz | THx | TLx | 中音 | f/Hz | THx | TLx | 高音 | f/Hz | THx | TLx |
1 | 262 | 248 | 140 | 1 | 523 | 252 | 68 | 1 | 1045 | 254 | 34 |
2 | 293 | 249 | 92 | 2 | 596 | 252 | 173 | 2 | 1171 | 254 | 87 |
3 | 329 | 250 | 21 | 3 | 659 | 253 | 10 | 3 | 1316 | 254 | 133 |
4 | 349 | 250 | 140 | 4 | 697 | 253 | 52 | 4 | 1393 | 254 | 155 |
5 | 392 | 251 | 5 | 5 | 783 | 253 | 131 | 5 | 1563 | 254 | 194 |
6 | 440 | 251 | 144 | 6 | 879 | 253 | 200 | 6 | 1755 | 254 | 228 |
7 | 494 | 252 | 12 | 7 | 987 | 254 | 6 | 7 | 1971 | 255 | 3 |
⑵ 节拍
节拍表示一个音符唱多长的时间,在一张完整乐谱的开头,都有如1=C 4/4、1=G 3/4;……等的标识。这里的4/4、3/4用来表示节拍,而1=C、1=G表示一个乐谱的曲调,简单地说就是跟音调有关系。对于音符的节拍,这里以下图所示为例加以说明。
它表示乐谱中以四分音符为节拍,每一小节有三拍。其中,1、2为一拍,3、4、5为一拍,6为一拍。
从发音的时长角度看,1、2的时长为四分音符的一半,即为八分音符长;3、4的时长为八分音符的一半,即为十六分音符长;5的时长为四分音符的一半,即为八分音符长;6的时长为四分音符长。一般说来,如果乐曲没有特殊说明,则对于一拍的发音时间大约为400~500ms。
在单片机上可以采用循环延时的方法来实现控制一个音符唱多长时间,从而实现节拍。一般来说,首先需要编写一个精确地基本时长的延时程序,比如说以最短的十六分音符的时长为基本延时时间。对于一个音符,如果它为十六分音符,则只需调用一次延时程序,如果它为四分音符,则只需调用四次延时程序,如果它为二分音符,则只需调用八次延时程序,依次类推即可。
节拍也可以利用定时器中断产生。同样是找出整首乐曲中,最短的拍子,例如整首乐曲中,最短是1/4拍,若1/4拍的时间为125ms,则以1/4拍为基准,然后设定每125ms产生一次中断,其定时器初值为125000(晶振12MHz),它超过任何一个定时器模式的定时器值。若采用模式1,而定时器值设为62500,则只要执行2次中断,即可产生1/4拍的时间长度。同样,若要产生1/2拍的长度,则执行4次中断、若要产生3/4拍的长度,则执行6次中断……依此类推,节拍与定时器中断次数如下表所示。
拍数 | 中断次数 |
| 拍数 | 中断次数 |
| 拍数 | 中断次数 |
1/8 | 1 | 1/2 | 4 | 1 1/4 | 10 | ||
1/4 | 2 | 3/4 | 6 | 1 1/2 | 12 | ||
3/8 | 3 | 1 | 8 | 2 | 16 |
本例即是利用T0定时器方式1的中断产生音调,利用T1定时器方式1的中断产生节拍。
⑶ 移调
一首的歌曲如果是C调,则音名C唱Do,音名D唱Re,音名E唱Mi,音名F唱Fa,音名G唱So,音名A唱La,音名B唱Ti等。但是,并不是所有的歌曲都是在C调下演奏的,还有D调、E调、F调、G调等。D调是将C调各音符上升一个频率实现的,即C调下的音名D在D调下唱Do,C调下的音名E在D调下唱Re,C大调的音名F在D调下升高半音符F#唱Mi,C调下的音名G在D调下唱Fa,C调下的音名A在D调下唱So,C调下的音名B在D调下唱La,C调下的音名C在D调下升高半音C#符唱Ti。这种改变唱法称为移调。
E调是在D调的基础上进行移调的,而F调是在E调的基础上进行移调的……下表为各调音符与音名的关系。
音名 调 | Do | Re | Mi | Fa | So | La | Ti |
C调 | C | D | E | F | G | A | B |
D调 | D | E | F# | G | A | B | C |
E调 | E | F# | G# | A | B | C | D |
F调 | F | G | A | B | C | D | E |
G调 | G | A | B | C | D | E | F# |
A调 | A | B | C# | D | E | F# | G# |
B调 | B | C | D | E | F | G | A |