简易电子琴毕业论文.docx
《简易电子琴毕业论文.docx》由会员分享,可在线阅读,更多相关《简易电子琴毕业论文.docx(18页珍藏版)》请在冰豆网上搜索。
简易电子琴毕业论文
安徽财贸职业学院
毕业论文
电子琴的设计与制作
***********
********
专业:
应用电子技术
班级:
电子1001班
2012-10-13
电子琴的设计与制作
摘要:
在电子行业高速发展的今天,单片机已经广泛的应用到了各个行业之中,其中也就包括了我所设计的娱乐项目,随意的弹奏音乐并且伴着灯光的闪烁,这就是我所以利用89C51单片机所设计的声光电子琴,声光电子琴的设计理念完全是利用89c51单片机的功能的研究和理解以及延伸拓展。
以下我会详细介绍电路的设计和程序的编制过程。
关键词:
89c51单片机、电路、程序
前言
单片机因其体积小,功能强,价格低廉而得到广泛应用,同时随着我国经济的飞速发展,单片机在越来越多的领域得到了广泛的应用,现在国内的单片机多用于电话,玩具和LCD等产品,预计在未来,利用单片机发明的产品会越来越多,作为一名应用电子的应届毕业生来说,理解和掌握单片机的工作原理和使用技巧是必备的技能,基于这种考虑,我这次毕业设计的题目为简易电子琴。
钢琴,自从它发明的那天起,就成为人类的朋友,有的人们不能负担起钢琴的高额价钱,但随着时间的推移,科学技术的不断发展,电子琴的发明让人们找到了能与钢琴媲美的声音。
怎样让我们的电子琴随身携带呢?
这就要求人们不断设计出新型电子琴。
我所设计的该产品时根据自身的兴趣和爱好所设计的,通过对传统电子琴的认识和了解,知道了传统的电子琴是利用单片机的汇编语言的编程来实现的,而且功能单一,只能弹奏而不能随意的播放音乐,我所设计的产品是基于对89c51单片机的深入理解对传统电子琴的小小的改革和创新,并且以简单的C语言程序替代了复杂的汇编语言程序,声和光是新电子琴的主题,我相信在声光电子琴的不断革新达到人们所需娱乐设备的标准的时候,电子琴会被投入到批量生产之中。
下面就是制作电子琴的具体过程。
1.系统基本设计思路
此设计是在LED小灯上显示灯光的变换,扬声器播放弹奏的曲子。
电路包括:
键盘、单片机及LED显示电路,声音电路。
各部分说明:
(1)键盘用于弹奏音乐,八个按键8种音符。
(2)单片机通过输出各种电脉冲信号驱动控制各部分正常工作。
(3)单片机发送的信号分别经过LED显示电路通过译码最终在LED小灯和声音电路通过扬声器显示出来。
系统工作过程:
单片机要产生音频脉冲,主要处理过程是在CPU中完成的,CPU会随时对音符输入信号进行读取数据的操作。
在读取了相应的寄存器的值后,CPU将读取的值进行处理,再通过I/O口把音乐通过扬声器播放出来。
2.单元电路方案论证
根据设计要求,本系统主要由控制器模块、显示模块和输入模块构成。
为较好的实现各模块的功能,我们分别设计了以下几种方案并分别进行了论证。
2.1控制器模块
方案1:
采用凌阳系列单片机为系统的控制器
凌阳系列单片机可以实现各种复杂的逻辑功能,模块大,密度高,它将所有器件集成在一块芯片上,减少了体积,提高了稳定性。
凌阳系列单片机提高了系统的处理速度,适合作为大规模实时系统的控制核心。
方案2:
采用51系列作为系统控制器
单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制。
由于其功耗低、体积较小、技术成熟和成本低等优点,在各个领域应用广泛。
而且抗干扰性能好。
因51单片机价格比凌阳系列低得多,且本设计不需要很高的处理速度,从经济和方便使用角度考虑,本设计选择了方案2。
2.2发声模块
发声模块是本设计的最主要的部分。
基本方案:
发生电路是这次设计电路中最重要的组成部分,他承载着把单片机所产生的声音信号放大并输出的重要作用,而我的设计中的发声电路主要是由两个CS9013组成。
CS9013是一种小功率的放大管,属于NPN型号三极管,而对三极管引脚的判断有以下方法。
一、判断三极管的基极。
对于NPN型号的三极管,用黑表笔接某一个电极,红表笔分别接另外两个电极,若测量电阻值两个都小,调换表笔后被测电阻值都较大,则可判断第一次测量中黑表笔所接的是基极;如果测量值一大一小,相差很大,则第一次测量中黑表笔接的不是基极,应该更换其他电极重测。
二、测量三极管发射极e和集电极c。
三极管基极确定后,通过交换表笔,两次测量e,c极间的电阻,如果两次测量结果不相等,其中测得电阻值较小的一次为红表笔的是e极黑表笔接的是c极。
对于PNP型号的三极管,方法与NPN的相似,只是红黑表笔的作用相反,在测量e,c极间电阻时要注意,由于三极管的V(BR)CEO很小,很容易将发射结击穿。
当我们三极管的管脚判断结束以后,我们就可以用两个三极管构成一个达林顿结构。
首先当单片机P1.0口输出一个高电平,由两个三极管构成的达林顿成能导通,导通后又能对电流又一定的放大作用,这样传到扬声器时信号能让我们听的更清楚。
2.3编程软件模块
方案1:
采用汇编语言编程
汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用CPU的资源,相对高级程序设计语言来说,它又显得难掌握。
方案2:
采用C语言编程
C语言与其他高级语言相比,具有运算符的丰富性、语法表述的灵活性、对软硬件操作的兼容性、输入输出方式的新颖性等主要特征.深入分析研究这些特征,可以加深对C语言的认识;正确应用这些特征,可以灵活高效地解决各种实际问题.
因为我在大学期间对汇编语言没有深入的了解,而且在编程时一直用C语言,所以我选择了方案2。
2.4最终方案
经过反复论证,最终确定了如下方案:
(1)采用STC89C51单片机作为主控制器。
(2)采用达林顿效应使音乐信号放大
(3)采用C语言编程
3.STC89C51单片机
STC89C51是一种带8K字节可编程可檫除只读存储器的低电压、高性能COMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
单片机引脚图如图1所示。
图1STC89C51单片机引脚图
3.1最小系统设计
最小系统包括单片机及其所需的必要的电源、时钟、复位等部件,能使单片机始终处于正常的运行状态。
电源、时钟等电路是使单片机能运行的必备条件,可以将最小系统作为应用系统的核心部分,通过对其进行存储器扩展、A/D扩展等,使单片机完成较复杂的功能。
3.2时钟电路
STC89C51内部有一个用于构成振荡器的高增益反相放大器,引脚RXD和TXD分别是此放大器的输入端和输出端。
时钟可以由内部方式产生或外部方式产生。
内部时钟在此不做详细介绍。
外部方式的时钟电路如图3所示,RXD接地,TXD接外部振荡器。
对外部振荡信号无特殊要求,只要求保证脉冲宽度,一般采用频率在12MHz左右的方波信号。
图289c51内部时钟电路
3.3复位电路
当在89C51单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作(若该引脚持续保持高电平,单片机就处于循环复位状态)。
复位电路通常采用上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充放电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
除了上电复位外,有时还需要按键手动复位。
本设计就是用的按键手动复位。
按键手动复位有电平方式和脉冲方式两种。
其中电平复位是通过RST(9)端与电源Vcc接通而实现的。
按键手动复位电路见图4。
时钟频率用11.0592MHZ时C取10uF,R取10kΩ。
图389C51复位电路
4.程序流程图
结论
通过对自己在大学两年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了本设计。
这为自己今后进一步深化学习,积累了一定宝贵的经验。
撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
培养了我运用所学知识解决实际问题的能力。
参考文献
[1]白炽贵编著,单片机C语言案例教程,北京:
电子工业出版社,2011.1
[2]周良权主编.模拟电子技术基础北京:
高等教育出版社,2005.6
[3]卜锡滨主编.数字电子技术北京:
中国水利水电出版社,2011.1
[4]李华.单片机C语言编程[M].北京:
北京航空航天大学出版社,2005.8.1
[5]徐爱钧.单片机原理实用教程--基于Protrues虚拟仿真[M].北京:
电子工业出版社.2009.1
[6]李萍.AT89S51单片机、原理、开发与应用实例[M].北京:
中国电力出版社.2008.7
[7]张晔、王玉民等.单片机应用技术[M].北京:
高等教育出版社.2006.3
[8]付家才等.单片机控制工程实践技术[M].北京:
化学工业出版社.2004.5
[9]及力主编.电子CAD基于protel99SE北京:
北京邮电大学出版社,2008
[10]徐红升主编.电工基础及实训北京:
清华大学出版社,2009.5
致谢
附录1原理图
附录2PCB板图
附录3主要源程序
sfrP4=0xe8;//定义P4组I0口
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitspeaker=P1^4;//喇叭接30脚
sbitkey1=P1^0;//流水灯按键(暂时)
sbitkey2=P1^1;//播放音乐按键(暂定)
uchara,b,num1,s1num,n1,n2;
charnum;//定义num为可以负数
ucharcodeyinfu[]={0xfb,0xe9,//Do
0xfc,0x5c,//Re
0xfc,0xc1,//Mi
0xfc,0xef,//Fa
0xfd,0x45,//So
0xfd,0x92,//La
0xfd,0xd0,//Si
0xfd,0xee,//Do#
0x00,0x00,//间隔
};
ucharcodeshengri_tone[]={1,0,1,2,1,4,3,0,//生日快乐音调
1,0,1,2,1,5,4,0,
1,0,1,8,6,4,3,2,0,
7,0,7,6,4,5,4,0//0代表不发声,即停顿;数字即为音调
};
ucharcodeshengri_beat[]={24,1,24,48,48,48,72,5,//节拍
24,1,24,48,48,48,72,5,
24,1,24,48,48,48,48,72,5,
24,1,24,48,48,48,72,5//节拍,即tone表各音调的延时
};
ucharcodeledtable[]={0x7f,0xbf,0xdf,0xef,//取反
0xf7,0xfb,0xfd,0xfe};//P0组口的发光二极管代码(焊接过程可能会相反,具体更改)
ucharcodeledtable2[]={0x7f,0xbf,0xdf,0xef,//取反
0xf7,0xfb,0xfd,0xfe};//P2组口发光二极管代码,相反!
voidcheck_key();//改为P3组为按键
voidkeyscan();
voidturn();//顺时针流动
voidback();
voidqianhou();
voiddangshuang();
voiddelay(uintz);//延时函数声明
voiddelay1(void);//声明第二个延时函数
voidplay1(void);//播放生日快乐
voidmain()
{
s1num=0;//流水灯种类标志
key1=1;
key2=1;
TMOD=0x01;
TH0=a;
TL0=b;
ET0=1;//打开定时器,但是未允许中断
TR0=1;
while
(1)
{
check_key();
keyscan();
}
}
voidtime0()interrupt1
{
TH0=a;
TL0=b;
speaker=~speaker;
}
voidcheck_key()
{
P3=0xff;//先赋给P2组口高电平
switch(P3)//按下一个键相应4个灯亮
{
case0xfe:
P0=0xee;P2=0x77;a=0xfb;b=0xe9;EA=1;break;//P0,P2组为发光二极管组
case0xfd:
P0=0xdd;P2=0xbb;a=0xfc;b=0x5c;EA=1;break;//注意:
EA不能改为TR0
case0xfb:
P0=0xbb;P2=0xdd;a=0xfc;b=0xc1;EA=1;break;
case0xf7:
P0=0x77;P2=0xee;a=0xfc;b=0xef;EA=1;break;
case0xef:
P0=0xee;P2=0x77;a=0xfd;b=0x45;EA=1;break;
case0xdf:
P0=0xdd;P2=0xbb;a=0xfd;b=0x92;EA=1;break;
case0xbf:
P0=0xbb;P2=0xdd;a=0xfd;b=0xd0;EA=1;break;
case0x7f:
P0=0x77;P2=0xee;a=0xfd;b=0xee;EA=1;break;
default:
EA=0;speaker=0;//P0=0xff;P2=0xff;
}
}
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidkeyscan()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
s1num++;
while(!
key1);
if(s1num==1)
{
turn();
}
}
if(s1num==2)
{
back();
}
if(s1num==3)
{
qianhou();
}
if(s1num==4)
{
dangshuang();
}
if(s1num==5)
s1num=1;
}
if(key2==0)
{
delay(5);
while(~key2);
play1();
}
}
voiddelay1(void)//第二个延时函数
{
ucharn=15;
while(n--)
{
uchari;
for(i=0;i<125;i++);
}
}
voidplay1(void)//播放生日快乐
{
ucharm=0;
uchars;
ucharc=1;
P0=0xaa;
P2=0x55;
while
(1)
{
EA=0;
c=shengri_tone[m];//取音符
s=shengri_beat[m];//取节拍
a=yinfu[2*c-2];
b=yinfu[2*c-1];
EA=1;
while(s--)
{
delay1();
P0=~P0;
P2=~P2;
}
m++;
if(m>=33)return;//数值是shengri相关表中的元素数量
}
}
/*以下为N种流水灯流动花式*/
voidturn()//流水灯顺时针走动(5次)
{
for(num1=0;num1<8;num1++)
{
for(num=0;num<8;num++)
{
P0=ledtable[num];
delay(30);//时间暂定
}
P0=0xff;//之后关闭P1组
for(num=7;num>-1;num--)
{
P2=ledtable2[num];
delay(30);
}
P2=0xff;//之后关闭P2组
}
}
voidback()//逆时针流动
{
for(num1=0;num1<8;num1++)
{
for(num=0;num<8;num++)
{
P2=ledtable[num];
delay(30);
}
P2=0xff;
for(num=7;num>-1;num--)
{
P0=ledtable2[num];
delay(30);
}
P0=0xff;
}
}
voidqianhou()//前后来回
{
for(num1=0;num1<10;num1++)
{
for(num=0;num<8;num++)
{
P0=ledtable[num];
P2=ledtable2[num];
delay(30);
}
P0=0xff;
P2=0xff;
for(num=7;num>-1;num--)
{
P0=ledtable[num];
P2=ledtable2[num];
delay(30);
}
P0=0xff;
P2=0xff;
}
}
voiddangshuang()//单数双数
{
for(num1=0;num1<15;num1++)
{
P0=0x55;
P2=0xaa;
delay(150);
P0=0xaa;
P2=0x55;
delay(150);
}
}