电子琴的设计.docx
- 文档编号:9212092
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:314.74KB
电子琴的设计.docx
《电子琴的设计.docx》由会员分享,可在线阅读,更多相关《电子琴的设计.docx(16页珍藏版)》请在冰豆网上搜索。
电子琴的设计
1引言
随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
我们对于电子琴如何实现其功能,如声音强弱控制、节拍器、自动放音功能等等也很好奇。
又称作电子键盘,属于电子乐器(区别于电声乐器),发音音量可以自由调节。
音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。
它还可模仿多种音色,甚至可以奏出常规乐器所无法发出的声音(如合唱声,风雨声,宇宙声等)。
另外,电子琴在独奏时,还可随意配上类似打击乐音响的节拍伴奏,适合于演奏节奏性较强的现代音乐。
另外,电子琴还安装有效果器,如混响、回声、延音,震音轮和调制轮等多项功能装置,表达各种情绪时运用自如。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用STC89C52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
通过基于单片机的嵌入式电子琴的设计课题熟悉和理解单片机应用和开发过程,培养我们理论联系实际,实践出真知的科学严谨求学的态度,提高实践动手操作技能。
2硬件设计
2.1主控核心
2.1.1本实例采用AT89C52作为主控核心。
图3-1AT89C52芯片引脚图
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
2.2键盘模块
键盘是最常用的单片机输入设备,大致可以分为独立连接式键盘和矩阵式。
独立连接式键盘是最简单的键盘电路,每个键独立接入一根数据线。
这种键盘结构简单,使用方便,但是占用的I/O口线较多。
矩阵式键盘由行线和列线组成,按键位于行列的交叉点上,行线通过上拉电阻接到高电平。
行列式键盘可节省I/O口,适合按键数较多的场合。
所以本例的4X4键盘采用矩阵式键盘。
图3-5键盘输入模块
通过行列键盘扫描的方法可获取键盘输入的键值,从而知道按下的是哪个键,具体过程如下:
(1)查询是否键按下。
单片机向行扫描口输出全为“0”的扫描码,然后检测列线信号,只要有一列信号不为“1”,则表示有键按下,且不为“1”的列即是按下的键的所在列。
(2)查询按下键所在具体位置。
用逐行扫描的方法确定按下键所在的行号。
单片机先使第一行为“0”,其余行为“1”,接着进行信号检测,若全为“1”则按下键不在第一行;然后是第二行为“0”,其余行为“1”,接着进行信号检测,若全为“1”,则按下键不在第二行;往下依次类推。
(3)将得到的行号列号译码。
对于4X4行列式键盘,可用一个字节(8位)来对键盘编码。
本例中,将直接的高4为表示列号,低4位表示行号。
在键盘扫描过程中,应该注意以下几个问题:
(1)按下按键时,按键会产生机械抖动,一般持续几到几十毫秒。
在键盘扫描过程中,必须注意键盘的消抖处理,我们在实际制作中采用延时的方法来进行简易消抖。
(2)在键盘扫描过程中,应防止按一次键而多个对应键输入的情况。
在按键处理完毕后,还应检测按下的键是否松开,只有按下的键松开后程序才往下执行。
这样每按一个键,只做一个键处理。
表3-1键盘的按键与键值编码对应关系表
按键
列号
行号
键值编码
1(低3MI)
1
1
11H(00010001)
2(低4FA)
1
2
21H(00100001)
3(低5SO)
1
3
41H(01000001)
4(低6LA)
1
4
81H(10000001)
5(低7SI)
2
1
12H(00010010)
6(中1DO)
2
2
22H(00100010)
7(中2RE)
2
3
42H(01000010)
8(中3MI)
2
4
82H(10000010)
9(中4FA)
3
1
14H(00010100)
10(中5SO)
3
2
24H(00100100)
11(中6LA)
3
3
44H(01000100)
12(中7SI)
3
4
84H(10000100)
13(高1DO)
4
1
18H(00011000)
14(高2RE)
4
2
28H(00101000)
15(高3MI)
4
3
48H(01001000)
16(高4FA)
4
4
88H(10001000)
2.3复位电路
当单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。
如果RST持续为高电平,单片机就处于循环复位状态。
根据应用的要求,复位操作通常有两种基本形式:
上电复位和上电或开关复位。
本次设计采用手动复位电路。
在单片机启动后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。
当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。
随着时间的推移,电容的电压从5V释放到变为了1.5V,甚至更小。
根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。
单片机系统自动复位。
图3-6复位电路原理图
2.4时钟电路
时钟电路用于产生单片机工作所需的时钟信号。
震荡有两种方式:
外部震荡、内部震荡。
在AT89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器,如图3-6所示。
电路中的电容一般取30pF左右,而晶体的振荡频率范围通常为1.2~12MHz。
本例采用12MHz的晶振。
图3-7晶体振荡电路
2.5系统电路原理图
图3-8系统电路原理图
3系统软件设计
目前普通低档单片机的编程中,一般会用汇编和C。
汇编语言非常接近计算机的硬件,因此,它可以最大限度地发挥计算机硬件的性能。
用汇编写的程序执行速度相当快,适用于实时性要求较高的场合。
但是用汇编写的程序比较庞大,编写速度也比较慢,而且汇编程序的移植性较差。
C语言作为高级语言,运用灵活,可自定义很多东西,更改方便,移植性好,且无需懂得单片机的具体硬件也能编出程序。
但C语言写好后是不能直接运行,需要编译,经过编译生成单片机专用的机器码后才能直接运行,效率是要低于直接用汇编写出来的代码的。
不过如果谈到开发速度、软件质量、结构严谨、程序坚固等方面的话,则C语言的完美绝非汇编语言编程所可比拟的。
3.1系统主程序流程图
图4-1简易电子琴主程序流程图
主程序(程序见程序清单)
先将各部分数值初始化,然后扫描键盘,看是否有按键按下。
有按键按下则再逐行扫描获取键值;无按键按下则返回继续判断有无按键按下。
根据不同的键值,设定不同的计数初值,使用计数器T0,在模式1下计数。
接着判断按键是否释放,若未释放则继续计数,若释放则关闭计数器T0,返回再次判断有无按键按下。
其流程图如图4-1。
3.2中断服务子程序流程图
图4-3中断服务子程序流程图
C语言编写中断程序,在main函数中直接对各位进行操作,以确定中断优先级,开启中断允许及总中断允许。
为进行中断的现场保护,80C52单片机除采用堆栈技术外,还独特地采用寄存器组的方式。
但是C语言编程时,内存是由编译器分配的,不能简单的通过设置RS0,RS1来切换工作寄存器组。
否则会造成内存使用的冲突。
在C52中寄存器组选择取决于特定的编译器指令。
高优先级中断可以中断正在处理的低优先级程序,因此必须注意寄存器组。
分配的方法是使用usingn指定,其中n的值是0~3,对应使用4组工作寄存器。
定时器服务子程序:
voidtime0_int(void)interrupt1using0
{
TH0=STH0;
TL0=STL0;
P2_0=~P2_0;
}
4系统软件调试
此次设计使用KeilC软件进行调试。
调试软件介绍:
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
程序调试界面如图5-1所示:
图5-1KeilC调试界面
调试步骤:
1)打开KeilC软件,Project->NewuVisionProject,新建工程。
File->New,新建并添加源程序文件,保存时使用扩展名.c。
2)在ProjectWorkspace中,左击SourceGroup1,选择AddFilestoGroup‘SourceGroup1‘,然后选择相应源文件。
3)参数设置。
选中项目文件,右击“Target1”,在弹出的菜单中进行有关的参数设置。
4)编译。
单击Project菜单下的BuildTarget或Rebuildalltargetfiles菜单,对源文件进行编译。
当源文件有语法错误时,输出窗口会有提示。
5)仿真调试。
单击Debug菜单下的Start/StopDebugSession子菜单,单击Peripherals可打开单片机的I/O端口、定时器及中断等功能部件。
单击View菜单下的子菜单,可打开反汇编、存储器、堆栈、代码等窗口,进行有关数据的观察。
5系统软件仿真
此次设计使用的是Proteus软件进行仿真。
仿真软件介绍:
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
仿真步骤:
1)打开proteus仿真软件,设置好相应保持路径,在proteus软件库中找到相应的元件,如表6-1所示:
表6-1proteus软件元件清单
名称
所在库名
电阻
Resistors
排阻
ResistorsRESPACK
电容
Capacitors
晶振
MiscellaneousCRYSTAL
三级管
Transistors
74ls247
7段数码显示管
Optoelectronics7SEG-COM-AN
52系列单片机
Microprocessor
2)选择要使用的元件,在PickDevice窗口双击相应元件名称,即可将元件添加到主界面左侧的列表中;
3)放置元件到绘图区,单击列表中的元件,然后在右侧的绘图区单击,即可将元件放置到绘图区(每单击一次鼠标就绘制一个元件,在绘图区空白处单击右键结束这种状态);
4)元件连线,在引脚上鼠标指针变成X状,单击,移动到目的引脚,再次单击;
5)绘制电源和地,单击工具栏上的左起第8个工具(Inter-SheetTerminal),左侧工具栏显示TERMINALS,可在其中选择POWER或GROUND,像放置元件一样放置到绘图区;
6)电路连接无误后,调入软件调试步骤中已编译好的目标代码文件:
*.HEX,运行PROTEUS软件,进行软件仿真。
仿真结果如图6-1所示:
图6-1PROTEUS软件仿真结果图
6程序清单
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitSPK=P3^7;//P3.7外接扬声器
uintFreqTemp;
unsignedintcodeFreqtab[]={//定时半周期的初始值
64021,64103,64260,64400,//低音3456
64524,64580,64684,64777,//低音7,中音123
64820,64898,64968,65030,//中音4567
65058,65110,65157,65178};//高音1234
/*************************************************************
*函数功能:
用扫描法读P1外接4×4键盘
*函数返回:
按下键:
返回0~15、如无键按下:
返回16
**************************************************************/
UcharKeyscan(void)
{
Uchari,j,temp,Buffer[4]={0xfe,0xfd,0xfb,0xf7};
for(j=0;j<4;j++){//循环四次,扫描四行
P1=Buffer[j];//在低四位分别输出一个低电平
_nop_();
temp=0x80;//计划先读出P1.7位
for(i=0;i<4;i++){//循环四次,检查四列
if(!
(P1&temp)){//从高四位,截取1位
return(i+j*4);//返回取得的按键值
}
temp>>=1;//换右边一位
}}
return16;//没有键按下就返回16
}
/**************************************************************
*函数功能:
将参数分成十位、个位,分别显示到P2
*输入:
k(键盘数值)
***************************************************************/
voidDisplay(uchark)
{
P2=((k/10)<<4)+(k%10);
}
/**************************************************************
*主函数
***************************************************************/
voidMain(void)
{
ucharKey_Value=16,Key_Temp1,Key_Temp2;//读出的键值
TMOD=0x01;//T0定时方式1
ET0=1;//允许T0中断
EX0=1;//允许X0中断
EA=1;
while
(1){
TR0=0;//暂不发音
Key_Temp1=Keyscan();//读入按键
if(Key_Temp1!
=16){//有键按下
Display(Key_Value);//显示键值、延时消抖
Key_Temp2=Keyscan();//再读一次
if(Key_Temp1==Key_Temp2){//两次相等
Key_Value=Key_Temp1;//就确认下来
FreqTemp=Freqtab[Key_Value];//根据键值,取出定时半周期的初始值
Display(Key_Value);//显示
TR0=1;//启动定时器,发音
while(Keyscan()<16);//等待释放
SPK=1;//停止发音
}}}}
//==============================================================
voidT0_INT(void)interrupt1
{
TL0=FreqTemp;//载入定时半周期的初始值
TH0=FreqTemp>>8;
SPK=~SPK;//发音
7课程设计体会
这次实验总共经历了两周的时间,从功能需求分析到功能分析,从程序的设计到程序的调试,下载,最后终于完成了这次具有实际使用价值的实验。
在设计中我运用自己平时学到的一些知识,以及自己在课下所查找的进行设计,刚开始遇到很多困难,包括对使用C语言环境语言的不熟悉,后来一起和同学研究,而一些课程设计中的故障,也请同学帮忙参考一下,最终找到了解决问题的答案。
我感觉自己在设计方面提高很大,特别是在设计程序时,逻辑思维能力有所加强,同时对以前所学的知识有了更深刻的认识,并进一步的得到了巩固和提高,充分的做到了理论联系实际,也使我认识到理论与实际的差别,通过该课程设计,不但对单片机有了较为全面的认识,而且相关的知识也有了足够的掌握,我感觉最重要的还是设计思维的形成。
更发现自己在平时学习中的缺陷。
对以后的学习也有很大的帮助。
两周的课程设计,我所收获的不仅是学习知识方面,更多的是生活方面。
我了解到,在我们生活中,应该学会与别人共同分享,分享知识,分享问题,这样更有助于我们的交流,有利于我们共同进步,有利于我们对学习养成良好的兴趣。
最后,我要感谢那些带我们课程设计的老师们,感谢你们对我们的耐心,感谢你们对我们的鼓励,让我们有信心继续下去,成功走到最后。
参考文献
[1]《单片机C语言轻松入门》,周坚,北京航空航天大学出版社
[2]《51单片机C语言应用程序设计实例精讲》,戴佳,戴卫恒,电子工业出版社
[3]《8051单片机实践与应用》,吴金戎,沈庆国,郭庭吉,清华大学出版社
[4]《单片机实验与实践教程》,万光毅,严义,邢春香,北京航空航天大学出版社
[5]《单片机原理及应用技术》,范力昱,电子工业出版社
[6]孙涵芳.MCS-51/96系列单片机原理及应用(修订版).北京航空航天大学出版社.1994
[7]李朝青.单片机原理及接口技术(第3版).北京航空航天大学出版社.2005
[8]蒋辉平.基于Proteus的单片机系统设计与仿真实例.机械工业出版社.2009
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子琴 设计