1.2 基本原理
本设计利用单片机内部的定时器T0,通过设定时间定时来产生不同的频率,控制单片机输出口电平的变化从而驱动蜂鸣器发出各种频率的声音,同时通过延时子程序的延时作用来控制音符发音的时间;根据频率的高低通过程序实现LED彩灯有节凑的闪烁。
根据实际需要和编程经验,将所要播放的歌曲的音调和相应的节拍信息转换为单片机所需要的定时常数和延时常数,运用查表法得到定时时间和延时时间,进而分别实现定时器产生相应的脉冲频率和延时函数产生相应的持续时间,当一个音符演奏完成后,程序继续运行自动查找下一个音符的定时常数和延时常数,这样就能够听到动听悦耳的歌声。
音调是由不同的频率产生的,而每一个音符都是由音调和节拍组成的,音调决定该音符的高低,节拍决定了该音符有多少拍(即播放时间)。定义单片机的一个I/O端口输出蜂鸣器的控制信号,根据音调信息将声音输出口不断的置高置低,就可以得到该音符的频率,同时在规定的节拍内,根据音符信息产生延时,就可以得到该音符的演奏时间。进而能够听到单片机演奏的动听的音乐。
在单片机演奏音乐的同时,通过分析各音符的音调的高低,确定所要亮灯的个数,音调越高,亮灯的个数越多,音调低则亮灯的个数少,从而实现本设计的要求音乐信号能够控制彩灯信号,达到音乐动听,色彩亮丽的效果。
1.3 歌曲简谱的编码规则
一般来说,单片机演奏音乐是单音频率,并不包含相应幅度的谐波频率,即它不像电子琴那样能奏出多种音色的音乐。因此单片机奏乐只需弄清两个概念:“音调”和“节拍”。音调表示一个音符能够奏出多高的频率,节拍表示一个音符奏出多长的时间。
在音乐中的“音调”,就是大家所认为的“音高”。在音乐中把音A看作标准音,其频率为 。当两个音符频率相差一倍,也即 时,则称 比 高一个倍频, 在歌曲中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个音阶的分度基本上是对数关系。确定了这十二个音符的音高,就可以通过倍频程关系得到其他音符的频率[1]。
确定了一个音符的频率后,怎样使单片机发出相应频率的声音呢?通常采用单片机定时器中断的方法,将单片机控制蜂鸣器的I/O口不断取反,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,只用将定时器置不同的定时值即可实现。那么如何确定一个频率对应的定时器的初值呢?以标准音A作为例子:
A的频率 = 440 ,其周期由式(1)可得: (1)
根据上图得单片机的定时时间为: (2)
这个 即单片机上定时器的中断触发时间。通常选用的定时器的工作方式为方式1,单片机的定时器以振荡器的十二分频信号为计数脉冲。设振荡器频率为 ,则定时器的预置初值由式(3)来确定:
(3)
式(3)中 = = 65536, 为定时器待确定的计数初值。因此定时器的高低计数器的初值为:
将 代入式(4)(注意:计算时应将两者单位换算一致),即可求出标准音高A音在单片机晶振频率 ,定时器为工作方式1时定时器高低计数器的初值为: AT89S51单片机的音乐彩灯控制器设计+仿真图+源代码(2):http://www.youerw.com/zidonghua/lunwen_1833.html