电子系统设计创新实验报告
题 目基于单片机系统的简易电子琴的设计与实现
学生姓名 严娅 叶帅 殷玉杰
学生学号 101234153 101234158 101234161
专业名称 电子信息工程
指导教师 肖永军
20##年 11 月 18 日
设计要求:
1、 能实现电子琴的基本功能,可以用弹奏出简单的乐曲。手动演奏,且能手动演奏7个八度音的音乐,音色纯正,且音长由按键按下持续的时间控制。
2、 手动演奏。能储存3首曲目,曲长度(既音符个数)不少于50个,音调、音色优美;可重复演奏。
3、 功能开关可由键盘完成手动、自动切换。
4、 功率不大于500mw,音质悦耳,无失真。
摘 要
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器,它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经落入现代人们的生活中,成为不可代替的一部分。为了加深对电子技术的理解,学以致用,提高动手能力,以AT89C52单片机为核心控制元件,设计一个电子琴。电子琴以乐音的发声原理为基础,使按键控制电路和蜂鸣器电路协调工作,实现了手动演奏方式,并能手动演奏7个八度音的乐音,自动演奏3首乐曲。通过keil4调试、proteus 仿真得到了理想的效果,验证了电路和程序的正确性。
一、系统总体设计
该设计要实现一种由单片机控制的电子琴,系统需要由按键控制电路、发音电路、AT89C52、晶振电路、复位电路五部分组成。该设计具有12个按键,可根据不同的按键按下时产生不同的音阶或者实现播放不同的功能,根据乐谱可以在键盘上进行演奏,音乐发生器会根据弹奏,通过扬声器将音乐播放出来。蜂鸣器发声电路由蜂鸣器和功率放大电路组成。
图1 系统总体设计框图
二、系统硬件设计
(1)系统的复位电路
任何含有计算机的系统,在启动运行时都需要复位,以便CPU和系统中的其他部件都处于某一确定的初始状态,并从这个状态开始执行工作。同样,单片机在外界的干扰下出现程序跑飞或者进入死循环的状况时,需要人为低进行复位操作,恢复正常状态。因此,手动复位是微机子系统的一个基本功能要求。
复位电路如下图所示:
该复位电路由R1,C3和开关K组成,当开关K断开时,C3两端电压较高,单片机RST端则为高电平,而当开关K闭合时,RST端接地,变为低电平,此时单片机复位。
(2)蜂鸣器驱动电路
由于无需较大的控制音量,采用三极管组成的蜂鸣器驱动电路即可满足发声需求,电路如图2所示,电路由蜂鸣器、三极管、电阻R13和R15组成。
图2 蜂鸣器驱动电路
(3)按键扩展电路
独立式按键:采用7个单独键K1-K7及1个音阶键K8,3个状态实现21个音阶,曲目选择键K9、K10、K11,功能切换键K12(手动、自动切换)。
描述各个按键的功能如下:
K1-K7 :手动演奏7个八度音的音乐,按键按下持续的时间控 制音长。
K8 :音阶键,按下一次K1-K7手动演奏音乐音阶改变,共3 个状态能实现21个音阶。
K9-K11:曲目选择键,3个按键分别对应3个乐曲。
K12 :功能选择键,切换手动演奏和自动播放。
(4)时钟电路
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。MCS-51内部有一个用于构成振荡器的高增益反相放大器。这个放大器外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中构成时钟电路。时钟频率越高,单片机控制器的控制节拍越快,运算速度也就越快。
三、系统软件设计
整个系统工作的流程图如下图所示:
系统上电初始化,然后进入等待按键状态,按下K1-K7执行手动演奏功能,继续按下K8取音阶。如功能键K12按下,切换自动播放功能,执行自动演奏程序。复位键RES按下返回原程序。
四、系统测试及仿真
在protues软件中绘制系统原理图,如下图所示:
在仿真的过程中,当文件导入到硬件后,当没有按下K12时候,在按下K1到K7情况下,依次发出七个音阶,按下K8音阶键后,按下K1到K7发音音阶改变,共有3个状态。按下K12后,按K9的时候,自动响起了第一首音乐,按下复位键回到初始状态,再按下K10时候响起第二首音乐,按下复位键回到初始状态,按下K11时候响起第三首音乐。复位键功能正常,按下复位键回到初始状态。
五、结论
经过几天的努力,简易电子琴的电路设计成功了。以单片机为基础的简易电子琴,运用了数字电子技术、单片机原理等基础电子有关知识。 基于单片机原理的电子琴大大简化了以前传统的音乐产生电路,使得元件得到减少,生产成本降低而且性能也得到了提高。系统在仿真过程中较为顺利,各按键功能皆能实现,在播放音乐的时候,乐音较为流畅,,能实现预期的所有要求。
第二篇:电子琴实验报告
电子琴实验报告
一, 实验目的
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<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar i,j,x=0,y=0,temp=0,u=0;
uchar code c[]={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};
uchar m[100];
void delay(uint a)
{while(a--);}
void music(uchar b)
{
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;
}
}
void musicH(uchar b)
{
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;
}
}
void scan()
{
P3=0x0f;
if(P3==0x0e)
{
P3=0xf0;
switch(P3)
{
case(0x70):if(u==0)music(1); else musicH(1);if(y==1){m[x]=1;x++;}break;
case(0xb0):if(u==0)music(2); else musicH(2);if(y==1){m[x]=2;x++;}break;
case(0xd0):if(u==0)music(3); else musicH(3);if(y==1){m[x]=3;x++;}break;
case(0xe0):if(u==0)music(4); else musicH(4);if(y==1){m[x]=4;x++;}break;
}
}
else if(P3==0x0d)
{
P3=0xf0;
switch(P3)
{
case(0x70):if(u==0)music(5); else musicH(5);if(y==1){m[x]=5;x++;}break;
case(0xb0):if(u==0)music(6); else musicH(6);if(y==1){m[x]=6;x++;}break;
case(0xd0):if(u==0)music(7); else musicH(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;//保存一首歌
}
}
else if(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;//调节音调
}
}
}
void main()
{
while(1){
P2=0xff;
scan();
}
}
C. 程序调试及仿真
本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。
通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序。
c.1 利用Keil软件实验过程截图:
1,建一个工程,并设定与Proteus仿真相关的参数
2,编译程序,并生成HEX文件
c.2利用Proteus仿真实验过程截图:
五.实验总结及感想
本次实验制作简易电子琴,虽然花费了我们很多精力,但收获颇丰,一方面,将自己的理论知识与实践相结合起来,进一步巩固了专业基础知识和相关专业课程知识;另一方面,也培养了自己独立自主、综合分析的思维与创新能力,更让我知道了团队的力量是巨大的。
实验中将程序烧入芯片,调试成功后,可任意弹奏自己想要的旋律。本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。
思考:可弹奏的音符数较少,只能在一定范围内满足用户需要。可通过改进键盘识别模块和发生模块来增加其复杂度。音色不可调,只有一种波形的频率输出。可以在外围电路设计滤波电路,接在不同的输出口,通过软件实现不同端口的输出,从而接入不同的滤波电路,输出不同的波形,从而获得不一样的音色。不能以和弦形式演奏,只能单个键按下输出单个的音阶。
设计的过程不是一帆风顺,遇到过各种各样的问题。特别是设计软件时,一些很细小的问题都可能导致功能性的错误,修改了多次才通过仿真。在设计过程中我发现自己对以前所学过的知识理解得不够深刻,掌握得不够牢固,所以也利用图书馆、网络资源查阅了大量文献资料,也请教了老师和同学。同时在具体的制作过程中我们发现一些书本上的知识与实际的应用存在着一定的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方面的问题,这也让我更深刻地体会到在今后的学习工作中也要注重理论联系实际。
六、参考书目
[1] 李群芳,肖看,《单片机原理、接口及应用》,北京,清华大学出版社,20##年
[2] 戴佳,戴卫恒 ,《51单片机C语言应用程序设计实例精讲》 , 电子工业出版社,20##年
[3] 刘海成,《单片机及应用系统设计原理与实践》,北京,北京航空航天大学出版社,20##年