包括音调的数组、某个乐曲简谱的数组和乐曲节拍的数组。音乐的音高与频率是对应的,不同的频率驱动蜂鸣器会使蜂鸣器产生不同音高,因此首先要确定音调和频率之间的关系,如频率为1300赫兹的音就是中音的“1”,频率为1462赫兹的音为“2”,频率为1625赫兹的音为“3”……等等。所以需要定义一个数组,存放各种音调的频率值,顺序为中音、低音、高音,这样,根据简谱调用频率值时,只要直接用简谱做下标,但要注意,中音的下标为1-7(下标0空闲不用),低音下标为8-14,高音为15-21。
简谱和节拍都是包含多个值的变量,所以也要用数组存储其元素,并且,简谱可以做为音调的下标,而节拍,只要把最短音定为1,其他定为1的倍数,利用延时程序的倍数关系实现,具体实现如下:
void main(void)
{
……
//音调数组,分别对应中、低、高音的1-7
const int music_freq[]
={0,1300,1462,1625,1736,1950,2166,2437,650,731,812,868,975,
1083,1218,2600 };
//世上只有妈妈好的简谱
const int music[]
={6,5,3,5,15,6,5,6,3,5,6,5,3,1,13,5,3,2,2,3,5,5,6,3,2,1,5};
//世上只有妈妈好的节拍
const int music_dly[]
={3,1,2,2,2,1,1,4,2,1,1,2,2,1,1,1,1,4,3,1,2,1,1,2,2,4,};
}
(二)数码管显示简谱
通过数码管实时显示歌曲的简谱,这个操作放在播放歌曲函数中即可,实现如下:
for(delay=0;delay
{rTCON=0x0;*((unsigned char *)0x10000006) = 0;
*((unsigned char *)0x10000004) = seg7[b[i]];
}