电子琴实验报告.docx
《电子琴实验报告.docx》由会员分享,可在线阅读,更多相关《电子琴实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
电子琴实验报告
电子琴实验报告
一,实验目的
1.进一步巩固和加深理论课基本知识的理解,提高综合运用所学知识的能力。
2.能根据需要选择参考书,查阅资料,通过独立思考,深入钻研有关问题。
3.学会自己独立分析问题、解决问题。
4.学习按键扫描及蜂鸣器应用和单片机设计方法。
5.设计任务及要求利用实验平台上矩阵键盘和蜂鸣器及单片机设计实现要求的电子琴。
二,实验要求
A.基本要求:
1:
能够通过键盘演奏音符。
2:
能够保存演奏的音乐,并实现回放。
3:
有音调调整功能(如:
C调,G调)。
三,实验基本原理
1.键盘接口必须具有去抖动、按键识别基本功能。
(1)去抖动:
每个按键在按下或松开时,都会产生短时间的抖动。
抖动的持续时间与键的质量相关,一般为5—20mm。
所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。
去抖问
题可通过软件延时或硬件电路解决。
(2)被按键识别:
如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。
常用的方法有行扫描法和线反转法两种。
行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。
线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。
2.利用键盘扫描原理分别设4×4矩阵键盘组成1—7数字键演奏音符,蜂鸣器发声,高电平发声,低电平不发声,并通过延迟程序控制输入的频率,不同的频率发出不同的音符,
四,实验设计分析
针对要实现的功能,采用AT89S52单片机进行设计,AT89S52单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-52指令系统及80C52引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为键盘演奏程序、音乐播放程序、音调调整程序,保存音乐程序,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。
第三部分是软件部分:
先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
五,实验要求实现
A.电路设计
1.整体设计
录音键
播放键
2.分块设计
模块电路主要分为:
键盘输入部分、播放部分、复位电路。
2.1键盘输入模块
键盘接入单片机P3接口,
2.2播放模块
播放模块是蜂鸣器构成。
蜂鸣器是一种一体化结构的电子讯响器,采用直流
图2-3发声模块电路图
电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子
设备、电话机、定时器等电子产品中作发声器件。
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。
而且由于所需驱动功率较小,且价格低廉,所以,被广泛应用。
2.3复位电路
AT89S52复位模块
AT89S52晶振模块
各模块拼接组合,电路总体设计图如下:
B.程序设计
B.1程序总体设计
本实验用C程序完成.
流程图如下:
结合电路图,程序设计的整体思路为:
电子琴按键方式:
1.按1键——发声音符为‘1’。
2.按2键——发声音符为‘2’。
3.按3键——发声音符为‘3’。
4.按4键——发声音符为‘4’。
5.按5键——发声音符为‘5’。
6.按6键——发声音符为‘6’。
7.按7键——发声音符为‘7’。
8.按8键——播放保存的音乐。
9.按9键——开始录音。
10.按10键——播放录音。
11.按11键——调整音调。
B.2程序主要模块
主程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
uchari,j,x=0,y=0,temp=0,u=0;
ucharcodec[]={3,3,4,5,5,4,3,2,1,1,2,3,3,2,2,0,3,3,4,5,5,4,3,2,1,1,2,3,2,1,1,0,2,2,3,1,2,3,4,3,1,2,3,4,3,1,1,2,5,0,3,3,4,5,5,4,3,2,1,1,2,3,2,1,1};
ucharm[100];
voiddelay(uinta)
{while(a--);}
voidmusic(ucharb)
{
switch(b){
case
(1):
for(i=0;i<66;i++){P2=0xff;delay(140);P2=0x00;delay(140);}break;
case
(2):
for(i=0;i<74;i++){P2=0xff;delay(123);P2=0x00;delay(123);}break;
case(3):
for(i=0;i<82;i++){P2=0xff;delay(111);P2=0x00;delay(111);}break;
case(4):
for(i=0;i<88;i++){P2=0xff;delay(103);P2=0x00;delay(103);}break;
case(5):
for(i=0;i<99;i++){P2=0xff;delay(92);P2=0x00;delay(92);}break;
case(6):
for(i=0;i<110;i++){P2=0xff;delay(83);P2=0x00;delay(83);}break;
case(7):
for(i=0;i<122;i++){P2=0xff;delay(74);P2=0x00;delay(75);}break;
}
}
voidmusicH(ucharb)
{
switch(b)
{
case
(1):
for(i=0;i<131;i++){P2=0xff;delay(68);P2=0x00;delay(68);}break;
case
(2):
for(i=0;i<147;i++){P2=0xff;delay(61);P2=0x00;delay(61);}break;
case(3):
for(i=0;i<165;i++){P2=0xff;delay(54);P2=0x00;delay(54);}break;
case(4):
for(i=0;i<175;i++){P2=0xff;delay(51);P2=0x00;delay(51);}break;
case(5):
for(i=0;i<196;i++){P2=0xff;delay(45);P2=0x00;delay(45);}break;
case(6):
for(i=0;i<220;i++){P2=0xff;delay(40);P2=0x00;delay(40);}break;
case(7):
for(i=0;i<245;i++){P2=0xff;delay(35);P2=0x00;delay(35);}break;
}
}
voidscan()
{
P3=0x0f;
if(P3==0x0e)
{
P3=0xf0;
switch(P3)
{
case(0x70):
if(u==0)music
(1);elsemusicH
(1);if(y==1){m[x]=1;x++;}break;
case(0xb0):
if(u==0)music
(2);elsemusicH
(2);if(y==1){m[x]=2;x++;}break;
case(0xd0):
if(u==0)music(3);elsemusicH(3);if(y==1){m[x]=3;x++;}break;
case(0xe0):
if(u==0)music(4);elsemusicH(4);if(y==1){m[x]=4;x++;}break;
}
}
elseif(P3==0x0d)
{
P3=0xf0;
switch(P3)
{
case(0x70):
if(u==0)music(5);elsemusicH(5);if(y==1){m[x]=5;x++;}break;
case(0xb0):
if(u==0)music(6);elsemusicH(6);if(y==1){m[x]=6;x++;}break;
case(0xd0):
if(u==0)music(7);elsemusicH(7);if(y==1){m[x]=7;x++;}break;
case(0xe0):
for(j=0;j<66;j++){music(c[j]);P2=0xff;delay(6000);}break;//保存一首歌
}
}
elseif(P3==0x0b)
{
P3=0xf0;
switch(P3)
{
case(0x70):
if(y==0){y=1;x=0;music
(1);}else{y=0;music
(1);}break;//录音开始和停止
case(0xb0):
for(j=0;j<(x+1);j++){music(m[j]);P2=0xff;delay(6000);}break;//播放录音
case(0xd0):
if(temp==0){u=1;temp++;}else{u=0;temp=0;}break;//调节音调
}
}
}
voidmain()
{
while
(1){
P2=0xff;
scan();
}
}
C.程序调试及仿真
本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。
程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。
通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序。
c.1利用Keil软件实验过程截图:
1,建一个工程,并设定与Proteus仿真相关的参数
2,编译程序,并生成HEX文件
c.2利用Proteus仿真实验过程截图:
五.实验总结及感想
本次实验制作简易电子琴,虽然花费了我们很多精力,但收获颇丰,一方面,将自己的理论知识与实践相结合起来,进一步巩固了专业基础知识和相关专业课程知识;另一方面,也培养了自己独立自主、综合分析的思维与创新能力,更让我知道了团队的力量是巨大的。
实验中将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。
本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。
思考:
可弹奏的音符数较少,只能在一定范围内满足用户需要。
可通过改进键盘识别模块和发生模块来增加其复杂度。
音色不可调,只有一种波形的频率输出。
可以在外围电路设计滤波电路,接在不同的输出口,通过软件实现不同端口的输出,从而接入不同的滤波电路,输出不同的波形,从而获得不一样的音色。
不能以和弦形式演奏,只能单个键按下输出单个的音阶。
设计的过程不是一帆风顺,遇到过各种各样的问题。
特别是设计软件时,一些很细小的问题都可能导致功能性的错误,修改了多次才通过仿真。
在设计过程中我发现自己对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以也利用图书馆、网络资源查阅了大量文献资料,也请教了老师和同学。
同时在具体的制作过程中我们发现一些书本上的知识与实际的应用存在着一定的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方面的问题,这也让我更深刻地体会到在今后的学习工作中也要注重理论联系实际。
六、参考书目
[1]李群芳,肖看,《单片机原理、接口及应用》,北京,清华大学出版社,2005年
[2]戴佳,戴卫恒,《51单片机C语言应用程序设计实例精讲》,电子工业出版社,2005年
[3]刘海成,《单片机及应用系统设计原理与实践》,北京,北京航空航天大学出版社,2009年