2 音乐程序的设计原理
2.1 音乐的基本知识说明
声音是由物体振动产生,正在发声的物体叫声源。振动的频率高,为高音;振动的频率低,为低音。人耳比较容易辨识的声音频率范围是20Hz到20,000Hz之间,一般音响电路是用正弦波信号驱动喇叭,从而产生悦耳的音乐;在数字电路里,则是用数字脉冲信号信号驱动喇叭,从而产生声音。如果声音的频率相同,人类耳朵很难区分哪个是脉冲信号产生的声音,哪个是正弦波信号产生的声音。
图2.1.1 声音的波形
2.2 音调
不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频
2
率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。
2.3 节拍
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
2.4 音调的产生
前面讲到声音只是某一范围的频率,也就所谓的音频。因为扬声器发生只需要半个周期即可,所以用单片机产生声音只要送电半个周期的时间就可以实现,我们用音调Do来举例,音调Do周期波形如图9。我们可以用延迟函数或者Timer定时中断可以产生音调。 计算音调Do的周期:
Do频率=262 Hz→T=1/f=1/262=3186μs 所以实际送电的时间只有3826/2=1908μs Do f=3186μs
2.5 延迟函数
对于12M Hz的8051系统而言,若要延迟1ms,可以用“delay1ms(1);”指令,若需要延迟5ms,则可使用“delay1ms(5);”.很明显,这个函数的刻度为1ms,但是如果要求小于1ms,我们可以改变内循环的数量决定延迟时间,因为内循环的数量为120,可延迟1ms,该函数的最小刻度为1ms;将内循环的数量改为12,可延迟0.1ms,
3
该函数的最小刻度为0.1ms,即100μs。如表1。
表1
内循环数量 120 60 6 3 1 最小延迟时间(ms) 1 0.5 0.05 0.025 0.0083 最小延迟时间(μs) 1000 500 50 25 8.3 1ms延迟函数如下: void delay1ms(unsigned char x) { unsigned char i,j; //声明变量 for(i=0;i for(j=0;j<120;j++) //内循环 } 8μs延迟函数如下: void delay8μs(unsigned char x) { unsigned char i,j; //声明变量 for(i=0;i for(j=0;j<120;j++) //内循环 } 音乐的拍子种类,找出其中最短的拍子,例如整首音乐中,包含1/4拍、1/2拍、3/4拍、1拍、2拍,则以1/4拍为基准,然后写一段1/4拍长度的延迟函数,若要产生1/4拍的长度,则执行该函数时,变量为1;若要产生1/2拍的长度,则执行该函数时,变量为2;如要产生3/4拍的长度,则执行该函数时,变量为3;若要产生1拍的长度,则执行该函数时,变量为4,如要产生2拍的长度,则执行该函数时,变量为8??依次类推。 2.6 定时中断 在Mode 1模式下,定时量最多可达65536,也就是65536μs,足以产生低音Do所需的半周期1908。所以,若要产生低音Do的音频,则只需要执行1908定时量的timer中断即可。每中断一次,就改变连接喇叭的输入/输出的状态,就能发出低音Do的声音。如要产生其他音阶,只需要按表1-1的T字段设定定时量即可。 如下程序一Mode 1来产生低音的Do: #include sbit speaker=P1^0; //声明输出端 4 main() {speaker=0; //喇叭初始值 IE=0x82; //启用Timer0 TH0=(65536-1908)/256; //填入定时量的高八位 TL0=(65536-1908)%6; //填入定时量的低八位 TR0=1; //启动Timer0 While(1); //停止 } //主程序结束 //========Timer0中断子程序=========== void tone_int(void)interrupt 1 //Timer 0中断之程序 {TH0=Do_H; //填入定时量的高八位 TH0=Do_L; //填入定时量的低八位 speaker=~speaker; } //喇叭反向输出 音乐中最短的拍子,例如在整首音乐中,最短的拍子为1/4拍,若1/4拍的时间为0.125s,则以1/4拍为基准,然后设定每0.125s产生一次中断,其定时量为125000,假设采用Mode 1,定时量设为62500,只要执行2次中断,即可产生1/4拍的时间长度。同理,若要产生1/2拍的长度,则执行4次中断,若要产生3/4拍的长度,则执行6次中断??依次类推。如表2。 表2 拍数 1/8 1/4 8/3 中断次数 1 2 3 拍数 1/2 3/4 1 中断次数 4 6 8 拍数 1又1/4 1又1/2 2 中断次数 10 12 16 2.7 节拍的产生 音阶的频率是固定的,而节拍有快有慢,拍子越短,节奏越快,拍子越长,节奏越慢。产生节拍的方法也是一种处理时间的方法。我们以生日快乐歌为例,它的前两个音节︱1· 1 2 1︱4 3 —︱,第一个音是Do,发生这个音的时间长度是250ms;停顿一下,再发出第二个音Do,还是持续250ms;接下来发Re的音,时间长达500ms、改发出Do的音,时间长达500ms,第一小节结束。紧接着是第二小节,首先发Fa的音,时间长达500ms;在发出Mi的音,时间长达1000ms,以下以此类推。节拍的产生我们同样可以采用延迟函数或者Timer定时中断两种方式。 5 3.硬件电路设计 3.1总体方案设计 晶振电路LCDAT89C51复位电路键盘电路蜂鸣器 图1 总体方案图 以AT89C51为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动扬声器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称。 3.2器件选择 3.2.1 单片机的选择 单片机型号的选择是根据控制系统的目标、功能、可靠性、性价比、精度和速度等来决定的。根据本课题的实际情况,单片机型号的选择主要从以下两点考虑;一是要有较强的抗干扰能力。二是要有较高的性价比。由于51系列在我国使用最广,且该系列的资料和能够兼容的外围芯片也比较多,特别是ATMEL公司89C系列单片机,其典型产品AT89C51单片机,具有较高的性能价格比。故本系统采用ATMEL公司生产的AT89C51单片机作为电子音乐盒的核心部件,AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元, 6 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库基于单片机的电子音乐盒的设计 - 图文(2)在线全文阅读。
相关推荐: