3.2 编程语言的选择
基于单片机的系统,程序设计语言可以采用:汇编语言和单片机C51语言两种。汇编语言语言不够简洁,可读性差、移植性差[12]。针对不同的操作系统,不同的微控制器,指令都是不同的,即使是相似的,也不具有可移植性。但是汇编语言是针对专门的控制器的,所以运行速度可以精确到一个指令周期。读懂汇编语言要借助专门的控制器的指令手册以及各个寄存器的说明,所以很难读懂。然而,汇编语言编译后的代码比较短,运行速度会比较快。C语言简洁,灵活,移植性强。它属于高级语言,可以不做改变,移植到不同的微机平台上,而且C语言比较容易读懂[13]。但是编译后的代码会比较长,运行速度会比较慢。
由于最初阶段学习的是C语言编程,对C语言的掌握相对深些,又通过上述对二者的特性的对比,所以最终决定本次设计采用C51语言编程。
3.3 单片机发声基本原理
单片机发声是通过将单片机的某个口线上置为高电平或低电平,进而产生一定频率的波形来实现的。声音的频谱变化范围大到从几十赫兹到几千赫兹,所以,如果能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率波形,接上喇叭就能发出一定频率的声音。如果再通过延时程序控制高电平、低电平的持续时间,就可以改变输出的频率大小,进而改变音调。另外,我们还可以通过定时器T0来控制音符的节拍,给定不同的初值,就产生大小不同的定时时间。假如一首歌曲每分钟94拍,也就是一拍为0.64s。但T0的最大定时时间是131ms,所以不能直接通过改变T0的初值来实现不同节拍。我们可以把T0定为10ms作为一个时间基准,然后再设置一个中断计数器,可以通过判断中断计数器的计数值来设置每个节拍的时间长短。比如1/4拍的音符,需要定时时间是0.16s,相对应的时间常数按计算为16(也就是10H);3拍的音符,需要定时时间为1.92s,相对应的时间常数为192(也就是C0H)。我们可以把每一个音符的时间常数、其相对应的节拍常数结合起来,作为一组,把乐曲中的所有常数按顺序排成一个表,再通过查表程序依次读出,由此产生音符控制节奏,就实现了演奏的效果。另外,我们采用代码00H、FFH来分别表示结束符和休止符,即查表结果为00H,那么表示曲子结束;查表结果为FFH,那么曲子相应的停顿。如果在某些音符(比如两个相同的音符)间插入一个单位时间的频率稍有不同的音符就能产生手弹的节奏感。
3.4 主程序流程图
图12 主程序流程图
音乐盒开关按键控制音乐盒的开或者关,按下S1后,音乐盒默认的是歌曲播放模式,可以通过S3键选择不同的歌曲,按一下S2按键,工作模式转换为简易电子琴模式,此时可以通过4*4按键弹奏不同的音调。主程序流程图如图12所示。
3.5 单片机音阶代码的实现
音阶表示音调的高低,不一样的频率对应不一样的音阶。所以,我们可以控制单片机产生不同频率的方波进而生成各种音阶。我们知道频率和周期是成倒数关系的,所以通过控制单片机中的定时就可以控制方波的周期。定时器计数溢出,产生中断。与扬声器连接的单片机接口电平取反,便可得到方波周期,进而控制了频率[14],达到控制音阶的目的。音阶与频率的关系如表1所示。
假设各音阶对应的定时器计数初值为X,当晶体的振荡频率为6.144MHz,若定时器工作在方式1,则可根据下述公式(1)计算X:
(1)
- 上一篇:基于LQR球杆系统的控制方法研究与设计仿真
- 下一篇:VHDL基于FPGA的数字时钟设计+电路图
-
-
-
-
-
-
-
乳业同业并购式全产业链...
中考体育项目与体育教学合理结合的研究
java+mysql车辆管理系统的设计+源代码
十二层带中心支撑钢结构...
酸性水汽提装置总汽提塔设计+CAD图纸
电站锅炉暖风器设计任务书
杂拟谷盗体内共生菌沃尔...
当代大学生慈善意识研究+文献综述
河岸冲刷和泥沙淤积的监测国内外研究现状
大众媒体对公共政策制定的影响