电子琴设计报告.docx
《电子琴设计报告.docx》由会员分享,可在线阅读,更多相关《电子琴设计报告.docx(13页珍藏版)》请在冰点文库上搜索。
电子琴设计报告
电子系统设计实验
题目:
简易电子琴的设计
专业:
电子信息科学与技术
姓名:
学号:
一、设计任务及要求
1、要求有八个音阶,可以用数字芯片构成,也可以单片机构成。
2、EWB仿真。
3、搭建实物。
二、方案论证
1、方案一
该原理利用555定时器通过外围配置一定的电阻电容构成方波产生电路。
通过改变电阻和电容的值可以改变输出方波的频率。
该原理简单,成本低,设计起来比较容易,但是模拟器件设计出来误差比较大,电子琴的侵略要求比较高所以很难满足设计要求。
其原理图为:
2、方案二
该方案采样单片机编程控制,单片机采样超大规模集成电路技术把具有数据处理能力的中央处理器CPU、存储器ROM和RAM、多种I/O口和终端系统、定时器/计数器等集成到一块硅片上可用于构成各种控制和处理电路。
利用单片机内部定时器可产生不同频率的方波,频率可精确设置,可从1Hz—1MHz变化,其满足电子琴的高精度设计要求。
方案中为方便简单廉价,采样AT89C52单片机实现。
AT89C52的引脚图如下:
3、方案比较及选择
比较上述两种方案,虽然555定时器即方案一能实现最终的音节要求,但
相对稳定性很差。
而单片机频率范围很宽,外围电路很容易扩展,实现起来只是程序的问题,人机交互界面更加友好,所以,本次设计选择方案二。
三、硬件设计
1、电路整体框图
如图为电子琴的整体电路框图
2、单元模块电路
3.1、键盘模块
键盘模块是系统的主要的人机界面,也是电子琴系统最主要的部分之一,通过按键可以实现对系统的操作控制和设置,按下不同的按键可以发出不同的声音,本设计采用的是4*4的矩阵键盘,但是设计要求只需8个音阶,所以只需要8个按键即可,所以只用到矩阵键盘中的8个按键,即第一行和第二行的8个按键,按下相应的按键之后,数码管上会对应显示音阶的阿拉伯数字。
矩阵键盘图如下:
3.2、单片机控制模块
单片机控制着整个系统的正常运行与否,本实验采用的是AT89C52单片机,这款单片机操作起来比较简单,价格便宜,稳定性也很好,很适合我们初学者使用,当然主要是这款单片机的频率范围适合本次设计的要求,调节范围广。
单片机在使用时需加外围带电路,即复位电路,晶振电路。
以此保证单片机能正常工作且稳定性更佳,当然调节起来更加方便。
单片机控制模块如下图:
3.3、扬声器模块
扬声器模块即发声模块,从它的发声中听出8个音阶的变化,它的一端与单片机直接相接,另一端接+5V电源,连接简单而且发音清晰。
连接如下图:
3.4、数码管显示模块
显示模块采用的是共阴极的数码管,其显示的作用是为了更清楚的看到所按键的音阶,使人机交互界面更清晰便利,且连接电路图简单方便。
连接图如下:
四、软件设计
4.1设计思想
简易电子琴的设计主要是通过软件编程来并通过按键来改变输出语音信号的频率而发出不同的音阶,所以在设计时必须做好各个音阶的频率表便于程序中调用相关的音阶频率,其它的各个模块软件实现起来比较简单。
4.2主程序设计
软件设计流程图
程序开始,进入初始化,然后进行键盘扫描,判断是否有键按下,若有键按下则发出相应得声音同时数码管显示数字,若没有键按下则返回去继续扫描键盘知道有键按下为止。
这就是软件实现电子琴的设计流程。
五、系统电路及仿真结果
仿真效果:
按下不同的音阶键会有不同的频率的方波输出,按键松开没有按下时没有波形输出,所以上述波形符合电子琴的设计原理,也在其频率范围内变化。
六、实验结语
通过本次设计实验,使我知道了将理论知识和实际的东西结合起来的重要性,也让我对以前学过的相关知识有了很好的回顾和总结。
当然,在设计的过程中还是遇到了一些困难,例如,以前不知道音阶的频率也不知道怎么去设计这个实验,但是通过查资料等一些方法让这次设计顺利完成了并达到了理想的效果,所以这次设计让我的视野得到了开拓,对我以后的学习和工作有很好的帮助。
附件:
C语言程序
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#include//包括一个52标准内核的头文件
ulongn;
ucharcodejie8[8]={12,14,16,17,19,21,23,24};//1234567`1八个音符在频率表中的位置
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
sbitBEEP=P3^0;//喇叭输出脚
sbitwei=P2^1;
ucharth0_f;//在中断中装载的T0的值高8位
uchartl0_f;//在中断中装载的T0的值低8位
voidinit()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
wei=0;
P0=table[0];
}
//T0的值,及输出频率对照表
ucharcodefreq[36*2]={
0xA9,0xEF,//00220HZ,1//0
0x93,0xF0,//00233HZ,1#
0x73,0xF1,//00247HZ,2
0x49,0xF2,//00262HZ,2#
0x07,0xF3,//00277HZ,3
0xC8,0xF3,//00294HZ,4
0x73,0xF4,//00311HZ,4#
0x1E,0xF5,//00330HZ,5
0xB6,0xF5,//00349HZ,5#
0x4C,0xF6,//00370HZ,6
0xD7,0xF6,//00392HZ,6#
0x5A,0xF7,//00415HZ,7
0xD8,0xF7,//00440HZ1//12
0x4D,0xF8,//00466HZ1#//13
0xBD,0xF8,//00494HZ2//14
0x24,0xF9,//00523HZ2#//15
0x87,0xF9,//00554HZ3//16
0xE4,0xF9,//00587HZ4//17
0x3D,0xFA,//00622HZ4#//18
0x90,0xFA,//00659HZ5//19
0xDE,0xFA,//00698HZ5#//20
0x29,0xFB,//00740HZ6//21
0x6F,0xFB,//00784HZ6#//22
0xB1,0xFB,//00831HZ7//23
0xEF,0xFB,//00880HZ`1
0x2A,0xFC,//00932HZ`1#
0x62,0xFC,//00988HZ`2
0x95,0xFC,//01046HZ`2#
0xC7,0xFC,//01109HZ`3
0xF6,0xFC,//01175HZ`4
0x22,0xFD,//01244HZ`4#
0x4B,0xFD,//01318HZ`5
0x73,0xFD,//01397HZ`5#
0x98,0xFD,//01480HZ`6
0xBB,0xFD,//01568HZ`6#
0xDC,0xFD,//01661HZ`7//35
};
voiddelayms(uintxms)
{uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//定时中断0,用于产生唱歌频率
timer0()interrupt1
{
TL0=tl0_f;TH0=th0_f;//调入预定时值
BEEP=~BEEP;//取反音乐输出IO
}
//按键控制音阶声音输出(电子琴)
voidkeyscan()
{uchartemp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{temp=P1;
switch(temp)
{
case0xee:
P0=table[1];
tl0_f=freq[jie8[0]*2];//置一个音符的值
th0_f=freq[jie8[0]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0xde:
P0=table[2];
tl0_f=freq[jie8[1]*2];//置一个音符的值
th0_f=freq[jie8[1]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0xbe:
P0=table[3];
tl0_f=freq[jie8[2]*2];//置一个音符的值
th0_f=freq[jie8[2]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0x7e:
P0=table[4];
tl0_f=freq[jie8[3]*2];//置一个音符的值
th0_f=freq[jie8[3]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
}
TR0=0;
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delayms(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
P0=table[5];
tl0_f=freq[jie8[4]*2];//置一个音符的值
th0_f=freq[jie8[4]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0xdd:
P0=table[6];
tl0_f=freq[jie8[5]*2];//置一个音符的值
th0_f=freq[jie8[5]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0xbd:
P0=table[7];
tl0_f=freq[jie8[6]*2];//置一个音符的值
th0_f=freq[jie8[6]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
case0x7d:
P0=table[0];
tl0_f=freq[jie8[7]*2];//置一个音符的值
th0_f=freq[jie8[7]*2+1];
TR0=1;
for(n=0;n<10000;n++);//延时
break;
}
TR0=0;
}}
}
voidmain(void)//主程序
{
TMOD=0x01;//使用定时器0的16位工作模式
TR0=0;
ET0=1;
EA=1;
init();
while
(1)
{
keyscan();
}
}