根据上面的求解方法,就可求出C调其他音符相应的计数器的预置初值如表1所示[2]:
表1 C调音符计数器预置初值
音符 1
频率 262 277 293 311 329 349 370 392 415 440 466 494
初值 F88C F8F3 F95B F9B8 FA15 FA67 FAB9 FB04 FB4A FB90 FBCF FC0C
音符
频率 523 553 586 621 658 697 739 783 830 879 931 987
初值 FC44 FC79 FCAC FCDC FD09 FD34 FD5C FD82 FDA6 FDC8 FDE7 FE05
音符
频率 1045 1106 1171 1241 1316 1393 1476 1563 1658 1755 1860 1971
初值 FB21 FE3C FE55 FE6D FE84 FE9A FEAD FEC0 FE02 FEE3 FEF3 FF02
通过举例来说明音符的节拍。在一张音乐简谱中,经常会看到这样的表达式,1=C 、1=G ,这里1=C,1=G表示乐谱的曲调,和前面所描述的音调有比较大的联系, 、 就是用来表示节拍的。以 为例加以说明,它表示乐谱中以四分音符为节拍,每一小结有三拍。比如:
其中1、2为一拍,3、4、5为一拍,6为一拍,共三拍。1和2音符的时长为四分音符的一半,即为八分音符,3、4为八分音符的一半,即为十751分音符,5的时长为四分音符的一半,即为八分音符长,6的时长为四分音符。那么一拍到底该唱多久呢?通常情况下,如果乐曲没有特殊说明,一拍的时长大约为400-500ms 。假如把一拍的时长看做400ms,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长为200ms,十751分音符的时长为100ms。
单片机控制一个音符唱多久采用循环延时的方法来实现。首先,确定一个基本时长的延时函数,如果以十751分音符的时长为基本延时时间,则对于一个音符,如果它为十751分音符,则只需调用一次延时函数,如果它为八分音符,则只需调用二次延时函数,如果它为四分音符,则只需调用四次延时函数,依次类推。
知道一个音符音调和节拍的确定方法,就具备了在单片机上实现演奏音乐的基本条件。具体的实现方法为:将乐谱中的每个音符的音调及节拍变换成相应的音调参数和节拍参数,将他们做成数据表格,存放在存储器中,通过程序取出一个音符的相关参数,播放该音符,该音符唱完后,接着取出下一个音符的相关参数……,如此直到播放完毕最后一个音符,根据需要也可循环不停地播放整个乐曲。另外,对于乐曲中的休止符,一般将其音调参数设为FFH,FFH,其节拍参数与其他音符的节拍参数确定的方法一致,乐曲结束节拍参数用00H表示[2]。“生日快乐”歌的简谱图见附录2。 AT89S51单片机的音乐彩灯控制器设计+仿真图+源代码(3):http://www.751com.cn/zidonghua/lunwen_1833.html