简易电子琴设计.docx
《简易电子琴设计.docx》由会员分享,可在线阅读,更多相关《简易电子琴设计.docx(23页珍藏版)》请在冰豆网上搜索。
简易电子琴设计
目录
第一章概述2
1.1电子琴功能模式介绍2
1.2系统设计的任务与要求2
第二章系统总体方案及硬件设计3
2.1系统总体方案3
2.2总体硬件组成框图3
2.2.1子系统模块一3
2.2.2子系统模块二4
2.2.3子系统模块三5
2.2.4AT89C51复位模块6
2.2.5AT89C51晶振模块6
第三章软件设计7
3.1系统软件设计7
3.1.1内置歌曲输出7
3.2系统总流程图8
第四章Proteus软件仿真9
4.1程序仿真9
4.2proteus仿真9
设计体会12
附录一:
源程序13
附录二:
总原理图22
第一章概述
1.1电子琴功能模式介绍
本次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的电子琴。
本方案以AT89C51单片机作为主控核心,与键盘、扬声器、显示等模块组成核心主控制模块。
而在播放音乐方面,一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,再加上一定的延时作为节拍,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了。
查找想要播放歌曲的歌谱,翻译出对应的频率及延时节拍,存储到单片机存储单元里,再通过所编程序即可控制歌曲播放。
1.2系统设计的任务与要求
采用单片机完成,要求结构简单、成本低;实现7种不同音阶;产生不同频率方波输出到蜂鸣器,实现音量的高低可调;具有电源指示灯,工作指示灯,7个音阶指示灯;完成原理图和PCB布板;完成实物制作和软硬件调试工作;或完成模拟仿真,完成课程设计报告。
第二章系统总体方案及硬件设计
2.1系统总体方案
本次设计提出了用AT89C51单片机为核心控制元件,设计一个简易的电子琴。
本方案以AT89C51单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块在主控模块上设有11个按键(一个功能切换键等)和扬声器。
根据使用者的操作随意弹奏想要表达的音乐。
2.2总体硬件组成框图
实验中每按下一个琴键,单片机能够检测到键盘的按键,并根据按键的位置,通过程序来控制,使蜂鸣器发出不同频率(音调)的声音,声音延迟一段时间,等到按键放开之后,声音停止。
然后再继续扫描,看是否有键按下。
如此循环,即可实现基本的琴键功能。
图2.2总体硬件组成框图
2.2.1子系统模块一
LED显示模块如图所示,数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
图2.2.1LED数码管
2.2.2子系统模块二
播放模块是蜂鸣器构成。
它几乎不存在噪声,音响效果较好,而且由于所需驱动功率较小,且价格低廉,所以被广泛应用。
图2.2.2蜂鸣器播放器
2.2.3子系统模块三
电子琴设有11个按键,分别代表七个音符、一个功能切换键、高中低控制键。
通过软硬件设计,按键触发外部中断,中断使程序跳转,实现模式转换,启动电子琴。
然后通过查询电子琴所按下的按键,读取电子琴输入状态,跳转到对应的程序人口,实现各种琴键的声音。
P3.5———高音阶切换键
P3.4———中音阶切换键
P3.3———低音阶切换键
P1.0———do音输入键
P1.1————re音输入键
P1.2————mi音输入键
P1.3————fa音输入键
P1.4————so音输入键
P1.5————la音输入键
P1.6————ti音输入键
图2.2.3按键排列
2.2.4AT89C51复位模块
开关按下,实现单片机的复位。
此复位电路连接到AT89C51的RST管脚上。
图2.2.4复位部件
2.2.5AT89C51晶振模块
本次采用12MHZ晶振,机器周期为1us,连接两个电容,连接到AT89C51的XTAL1,XTAL2上面,连接电路图。
图2.2.5晶振模块
第三章软件设计
3.1系统软件设计
本设计用的C语言编程。
C语言是一种计算机程序设计语言。
它既有高级语言的特点,又具有汇编语言的特点。
它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。
因此,它的应用范围广泛。
3.1.1内置歌曲输出
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们只要把一首歌曲的音阶对应频率关系正确即可。
本设计所选歌曲为《两只老虎》。
3.2系统总流程图
图3.2总流程图
第四章Proteus软件仿真
4.1程序仿真
在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:
中心控制模块的调试,音乐播放模块的调试,按键控制模块的调试等,最后将各模块组合后进行整体测试。
首先对各模块的功能进行调试,主要调试各模块能否实现指定的功能。
然后通过Keil软件对编好的程序进行调试,检查语法错误。
Keil下编译,产生目标HEX文件,Proteus下ProgrammeFiles选择产生的HEX文件,点击运行开始模拟。
4.2proteus仿真
首先,尝试仿真模拟,低音曲调。
改变频率,实现高中低音的切换。
如图用显示数字“L”代表低音。
图4.2-1低音显示
达到设定的中音频率,用数字“N”代表中音。
尝试比较,同一音符的不同音调即可辨别中低音的区别。
其音调略高于低音,需细细辨别。
如图中音显示N。
图4.2-2中音显示
达到预设的高音阶。
与低音、中音相比较,便可分辨出。
本次仿真用数字“H”代替高音。
仿真结果显示H。
图4.2-3高音显示
电子琴的关键功能是能弹奏乐符,上述仿真已经完成了高中低音和内置歌曲播放。
现在,开始真正的音符仿真调试。
音符有7个,分别是1,2,3,4,5,6,7,形声以DO、RA、M、FA、SO、LA、SI试音。
分别尝试按七个按键开关,切换于不同的频率,发出不同的音阶。
再分别用高、中、低音发声,分别听取不同的音调。
另外,功能切换键开关的动合实现内置歌曲和弹奏的切换。
在播放内置歌曲时,按下按键开关,歌曲停止,便可开始音阶弹奏。
本次报告截取音阶2的Proteus仿真图。
见图。
图4.2-4音阶2的仿真
设计体会
本次试验通过制作电子琴,将几个模块融合起来,对使用单片机设计简易电子琴进行了分析。
利用单片机产生不同频率来获得我们要求的音阶。
说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大,同时通过显示模块来确知自己所弹的音符。
通过这次实训设计,我感觉收获了很多:
通过这次的单片机实训,我加深了对单片机系列知识及其系统的认识。
这个设计题目并不怎么难,但从中体现到了个系统开发设计的过程,足以让我们受益匪浅。
在这次的实训中,让我更进一步的提高了动手能力,也重新复习了一次单片机的程序编程能力,在这期间,让我更加深刻了体会到了设计的思路,加强了对编程能力的理解和对相应资料的查阅。
在这次实训过程中,能够得以顺利的完成,是所有曾经指导过我的老师,帮助过我的同学以及团队成员共同努力地结果,在这里我要对你们表示深深的谢意!
参考文献
贾宗璞,许合利.C语言程序设计.江苏:
中国矿业大学出版社,2007.109-119
余发山,王福忠.单片机原理及应用技术.江苏:
中国矿业大学出版社,2008.241-247
附录一:
源程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitP1_0=P1^0;
sbitP1_1=P1^1;
sbitP1_2=P1^2;
sbitP1_3=P1^3;
sbitP1_4=P1^4;
sbitP1_5=P1^5;
sbitP1_6=P1^6;
sbitP1_7=P1^7;
sbitLED1=P2^6;
sbitLED2=P2^7;
sbitchange=P3^2;
sbithigh=P3^5;
sbitnormal=P3^4;
sbitlow=P3^3;
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitspeaker=P2^2;
unsignedchari;
unsignedcharkey,yin=0;
ucharm,n;
bita=0;//a为change键的键值
ucharseg[]={0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
0x37,/*N*///中音
0x38,/*L*///低音
0x76,/*H*///高音
0x79/*E*/};//共阴极数码管
codeunsignedcharFH[]={0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
codeunsignedcharFL[]={0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
codeucharstar[]={1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1,5,6,5,4,3,1,1,12/*低音5*/,1,1,12,1};
codeucharshijian[]={4,4,4,4,4,4,4,4,4,4,8,4,4,8,2,1,2,1,4,4,2,1,2,1,4,4,4,4,6,4,4,6};
voidinit(void);
voidmusic();
voidplay();
voidseg1();
voidyinjie();
/*********主程序*****////
voidmain()
{
init();
while
(1)
{
if(a==0)
music();
else
play();
}
}
//*******1ms延迟********//
voiddelay(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=340;j>0;j--);
}
//*******初始化数据*****//
voidinit(void)
{
speaker=0;
LED1=1;
LED2=0;
EA=1;//开总中断
TCON=0x01;//外部中断0设置为边沿触发
EX0=1;//开外部中断0
ET0=1;
ET1=1;
TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
///******数码管动态显示*******/////
voidseg1()
{
P2_0=1;//关数码管1
P2_1=0;//开数码管2
P0=seg[n+1];//送数码管2的数据
delay(15);//延时15ms
P2_1=1;//关数码管2
P2_0=0;//开数码管1
P0=seg[yin];//yin为high,normal,low的判断结果送数码管1的数据
delay(15);//延时15ms
}
//********高低音的选择*******//////
voidyinjie()
{
if(normal==0)
{
delay(5);
if(normal==0)
{yin=10;
m=0;
//返回10为seg[10]显示C
}
}
if(low==0)
{
delay(5);
if(low==0)
{yin=11;
m=1;
//返回11为seg[11]显示L
}
}
if(high==0)
{
delay(5);
if(high==0)
{yin=12;
m=2;
//返回12为seg[12]显示H
}
}
if(yin==0)
{
yin=13;
}
}
//********外部中断0********//
voidinter0()interrupt0
{
if(change==0)
{
delay(5);
while(change==0);
a=~a;
LED1=~LED1;
LED2=~LED2;
}
}
/////*******播放音乐程序*****////
voidmusic()
{
TH0=FH[star[i]-1];
TL0=FL[star[i]-1];
while(a==0)
{
if(i<32)
{
TR0=1;
delay(57*shijian[i]);
i++;
}
if(i==32)
{
i=0;
}
}
}
////*******演奏模式*****//////
voidplay()
{
TR0=0;
TR1=0;
yinjie();
P2_1=1;//关数码管2
P2_0=0;//开数码管1
P0=seg[yin];
if(yin!
=13&&a==1)
{
if(P1_0==0)
{
TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_0==0)
{n=0;
seg1();
}
}
if(P1_1==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_1==0)
{n=1;
seg1();
}
}
if(P1_2==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_2==0)
{n=2;
seg1();
}
}
if(P1_3==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_3==0)
{n=3;
seg1();
}
}
if(P1_4==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_4==0)
{n=4;
seg1();
}
}
if(P1_5==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_5==0)
{n=5;
seg1();
}
}
if(P1_6==0)
{TH1=FH[7*m+n];
TL1=FL[7*m+n];
TR1=1;
while(P1_6==0)
{n=6;
seg1();
}
}
}
}
//******定时器0中断******//////
voidtimer0()interrupt1
{TR0=0;
TH0=FH[star[i]-1];
TL0=FL[star[i]-1];
speaker=~speaker;
TR0=1;
}
//******定时器1中断******//////
voidtimer1()interrupt3
{TR1=0;
TH1=FH[7*m+n];
TL1=FL[7*m+n];
speaker=~speaker;
TR1=1;
}
附录二:
总原理图