电子琴设计报告完整.docx
- 文档编号:23551855
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:15
- 大小:140.31KB
电子琴设计报告完整.docx
《电子琴设计报告完整.docx》由会员分享,可在线阅读,更多相关《电子琴设计报告完整.docx(15页珍藏版)》请在冰豆网上搜索。
电子琴设计报告完整
电子琴设计报告
院 系:
计算机科学学院
专 业:
计算机科学与技术
学 号:
201003784
姓 名:
张林峰
班级:
计科1002
设计时间:
2012.10.22
设计地点:
4#2号机房
指导教师:
严圣华
目录
一、总体方案
二、硬件介绍
三、音乐产生原理
四、软件设计
五、电子琴演示
六、完整代码
七、实验体会
1、总体方案
1.1设计要求
1.要求达到电子琴的基本功能,可以用弹奏出简单的乐曲。
2.用键盘作出电子琴的按键,每键代表一个音符。
3.各音符按一定的顺序排列,必须符合电子琴的按键排列顺序。
4.固定音乐播放有按键控制。
1.2电子琴系统的组成
STC89C52单片机设计微型电子琴的方法,仅需STC89C52最小系统,扩展一组矩阵键盘,再接一组发光二极管用来指示电子琴的工作状态。
本系统分为两个部分,一个是音乐另一个是电子琴。
音乐播放部分:
音乐实际上是有固定周期的信号。
本文介绍用STC89C52的两个定时器(如T0,T1)控制,在P1.3脚上输出方波周期信号,产生乐音
电子琴弹奏部分:
实际上就是把每个按键所对应的值经过处理后发给单片机,再在单片机内把数字当作指针指向所对应的音符。
2、硬件介绍
2.1STC89C52
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
2.2STC89C52引脚图
2.3引脚功能介绍
在这里就只介绍一下制作电子琴所用到的一些引脚功能。
VCC:
供电电压。
GND:
接地。
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3口连接矩阵键盘用来控制音符输出及音乐播放。
P0口控制数码管,以显示音符。
P2.6连接锁存器U6控制数码管的段选。
P2.7连接锁存器U7控制数码管的位选。
P2.0控制蜂鸣器
2.4矩阵键盘工作原理
列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
具体的识别及编程方法如下所述。
2.5矩阵键盘的按键识别方法
1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
三、音乐产生原理
3.1不同频率产生原理
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P2.0反相,然后重复计时再反相。
就可在P1.3引脚上得到此频率的脉冲。
利用STC89C52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
3.2计数值TH0及TL0的计算方法
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
要是计数器记956次,就要设定此时的TH0、TL0的值。
TH0=(65536-956)/256=(11111100)2=0xfc
TL0=(65536-956)%256=(01000100)2=0X44
3.3音节频率表
4、软件设计
4.1数组的运用
为数码管写了一个显示0~F的数组,便于直接调用,来显示不同音符表示的数字,代码如下:
ucharcodeshuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,};
不同频率声音的TH0、TL0值也分别存在两个数组中,便于直接运用,如下:
codeunsignedcharFREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE00xFF,0x00,};
codeunsignedcharFREQL[]=
{0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,0x00,};
一首歌的每个音符对应频率在TH0、TL0数组中的地址也存入一个新数组中,如下:
codeunsignedcharsszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
4.2键盘
通过switch语句,每按下一个键,产生一个num值,如下:
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0){
switch(temp)
{
case0xe0:
num=0;break;
case0xd0:
num=1;break;
case0xb0:
num=2;break;
case0x70:
num=3;break;
}
}
4.3其他一些功能子函数
如通过中断函数voidt0char()interrupt1
{
TR0=0;
beep=!
beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}产生不同频率的电压变换,进而使蜂鸣器产生不同频率的声音。
延时函数、数码管显示函数、声音播放函数。
4.4整体构思
由于本键盘的每列接P3口的低4位,每行接P3口的高4位,先使某一列的4个键一边接低电平,当该行的一个按键按下时,低电平传到该按键所对应的行P3口高位。
然后通过switch语句来检测到底是那一个按键传递的低电平。
不同按键按下,产生一个不同的num值
按键产生的num值,先判断如果num>0传递给音频对应的定时器高八位、第八位,数组函数中,以及数码管显示数组函数中,来产生频率,显示音符。
anjian(num);
if(num>0)
{timer0h=FREQH[num];
timer0l=FREQL[num];
display(num);
time=1;
song();
}
如果num=0则运行音乐播放部分,
else{
i=0;
while(i<100){
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
6、完整代码
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitbeep=P2^0;
uchartimer0h,timer0l,time,i,num,temp,k;
codeunsignedcharsszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
voiddelay(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1 { for(t2=0;t2<8000;t2++) { ; } } } voidt0int()interrupt1 { TR0=0; beep=! beep; TH0=timer0h; TL0=timer0l; TR0=1; } voidsong() { TH0=timer0h; TL0=timer0l; TR0=1; delay(time); } ucharanjian(i) { P3=0xfe; temp=P3; temp=temp&0xf0; if(temp! =0xf0) { switch(temp) { case0xe0: num=0;break; case0xd0: num=1;break; case0xb0: num=2;break; case0x70: num=3;break; } } P3=0xfd; temp=P3; temp=temp&0xf0; if(temp! =0xf0) { switch(temp) { case0xe0: num=4;break; case0xd0: num=5;break; case0xb0: num=6;break; case0x70: num=7;break; } } P3=0xfb; temp=P3; temp=temp&0xf0; if(temp! =0xf0) { switch(temp) { case0xe0: num=8;break; case0xd0: num=9;break; case0xb0: num=10;break; case0x70: num=11;break; } } P3=0xf7; temp=P3; temp=temp&0xf0; if(temp! =0xf0) { switch(temp) { case0xe0: num=12;break; case0xd0: num=13;break; case0xb0: num=14;break; case0x70: num=15;break; } } returnnum; } voidmain(void) { TMOD=1; EA=1; ET0=1; while (1) { anjian(num); if(num>=1) {timer0h=FREQH[num]; timer0l=FREQL[num]; time=1; song(); num=1; } elseif(num=0){ i=0; while(i<100){ k=sszymmh[i]+7*sszymmh[i+1]-1; timer0h=FREQH[k]; timer0l=FREQL[k]; time=sszymmh[i+2]; i=i+3; song(); } } } } 七、实验体会 无数次的实践是必须的。 不放弃,有时遇到了不能解决的难题,不要说我已经无能为力了,要不断的尝试,从上次失败中找原因! 做这个竞赛,我总共做了257次尝试! 最终取得成功!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子琴 设计 报告 完整
![提示](https://static.bdocx.com/images/bang_tan.gif)