《简易电子琴设计与实现.docx》由会员分享,可在线阅读,更多相关《简易电子琴设计与实现.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、简易电子琴设计与实现 简易电子琴设计与实现 一、概述 1.1 课题设计目的及其意义 单片机(单片微型计算机)是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠等特点。单片机的应用相当广泛,从平常的家用电器到航空航天系统和国防军事、尖端武器都能找到它的身影。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。 随着社会的发展进步,人们的生活水平也逐步提高,音乐已经成为了我们生活中很重要的一部分,在工作和学习之余,欣赏音乐不仅使身心得到放松,同时也提高人们的精神品质和个人素养。当代,爱好音乐的年轻人越来越多,也有不少人自己练习弹奏乐器,作为业余爱好和一种放松的手
2、段,鉴于一些乐器学习难度大需花费太多精力,且其价格太过于高昂,使得一部分有这种想法的人不得不放弃这种想法,而电子琴又是一种新型的键盘乐器,它是现代电子科技与音乐结合的产物,价格相对便宜,能够满足一般爱好者的需求,因此,在现代音乐中扮演着重要的角色。故简易电子琴的研制具有一定的社会意义。 1.2 课题设计的任务与主要内容 本文的主要内容是用AT89C51单片机为核心控制元件,设计一个简单的电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。定时器按设置的定时参数产生中断,由于定时参数不同,就会发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放
3、大滤波后,就会发出不同音调。 先根据要求设计硬件电路和编写相应的程序,然后进行仿真调试,最后细心焊接硬件电路图,将程序烤入芯片中,最终达到设计目的。本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。 具体实现的功能:按下音符键可以发出相应的音符。 二、基本组成和原理 2.1 音乐相关知识 在人类还没有产生语言时,就已经知道利用声音的高低、强弱等来表达自己的思想和感情。声带、琴弦等物体振动时会发出声波,声波通过空气传播进入人耳,人们就听到了声音。声音有噪音和乐音之分振动有规律的声音是乐音,音乐中所用的声音主要是乐音。 乐音听起来有的高、有的
4、低,这就叫做音高。音高是由发声物体振动频率的高低决定的,频率高声音就高,频率低声音就低。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。 一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同的频率组合,加以拍数对应的延时,构成音乐。如果单片机要自己播放音乐就必须考虑到节拍的设置。 对于AT80C51而言要产生一定频率的方波一般是先将某口线输出高电平,延迟一段时间后再输出低电平。通过改变延迟时间可以改变单片机的输出频率。单片机的延时主要有两种方式,即软件延时和使用定时/计数器延时。其中软件延时不是很精确,而电子琴电路由于每个音符的频率值要求比较严格,因此我
5、们选用定时/计数器延时。 由于本课程设计是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不由程序控制。因此,我们只需弄清楚音乐中的音符和对应的频率,利用单片机的定时/计数器来产生方波频率信号即可。 要产生相应的音频脉冲,只需要计算出某音频的周期,再除以2。利用 计数器计时半周期,计满时使P2.0反向,然后重复计时再反向。本例中,单 片机工作在12MHz时钟,使用定时器/计数器T0,工作模式为1,改变计数 初值TH0、TL0就可产生不同频率的脉冲信号。 例如低3MI音,频率为330Hz,其周期T=1/f=1/330=3030us,计数值N=3030/2=1515,所以每计数1515次P2.0
6、反向。计数初值T=65536-N=64021。C 调的各音符频率与计数值T的对照表如表1所示。 表1 C调各音符频率与计数值T对照表 2.2简易电子琴基本原理及其框图 1、基本思想: 简易的电子琴系统主要是采用AT89C51单片机,单片机工作于12MHZ的时钟频率,使用其定时/计数器T0,工作模式为1,设计4*4键盘矩阵,设置成16个音,可随意弹奏想要表现的音乐,因为单片机产生的音频脉冲没有足够的驱动能力,所以用三极管放大电路实现音频的放大,保证扬声器能产生所要实现的音符声音。 2、硬件框图: 3、软件设计流程图: 本设计采用AT89C51单片机作为核心处理器件,按下复位键,进入初始化,调用键
7、盘扫面子程序,获得键值,查询音阶表,获取定时初值,向喇叭输入相应频率的脉冲驱动,发出相应的音调,若按键没有释放,则一直发声;若按键松开,则停止发声。当读到结束符时,停止播放音乐。 具体软件流程图如下: 1)中断服务子程序流程图: 2)主程序流程图: 三、系统的硬件结构 硬件电路的设计主要包括芯片89C51,、4*4键盘电路、振荡电路、复位电路及音频电路组成。 简易电子琴硬件电路图: 3.1 单片机89C51的简介 AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器
8、,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并
9、可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。 该系列单片机引脚与封装如下图所示: 主要引脚功能: 1、RST(9):复位输入。当振荡器复位时,要保持RST引脚2个机器周期的高电平时间; 2、XTAL1(19):反向振荡器放大器的输入及内部时钟工作电路的输入; 3、XTAL2(18):来自反向振荡器的输出; 4、P1口(18):P1口是从内部提供上拉电阻器的8位双向I/O口,P1
10、口缓冲器能接收和输出4个TTL门电流; 5、 _ EA/ P P V:当 _ EA保持低电平时,单片机只访问外部程序存储器。 _ EA为高 电平时,单片机只访问内部程序存储器。 3.2 键盘电路 键盘是最常用的单片机输入设备,大致可以分为独立连接式键盘和矩阵式。独立连接式键盘是最简单的键盘电路,每个键独立接入一根数据线。这种键盘结构简单,使用方便,但是占用的I/O口线较多。矩阵式键盘由行线和列线组成,按键位于行列的交叉点上,行列式键盘可节省I/O口,适合按键数较多的场合。所以本设计的4*4键盘采用矩阵式键盘。 3.3 振荡电路 单片机的时钟信号用来提供单片机内各种位操作的时间基准,时钟信号通常
11、有两种电路形式得到:内部振荡方式和外部振荡方式。 在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部震荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。晶振通常选用6MHz、12MHz或者 24MHz。本设计中采用的是12MHz。电容器C1、C2起稳定振荡频率、快速起振的作用,电容值一般530pF。内部振荡方式所得的时钟信号比较稳定,电路中使用较多。振荡方式如下图: 3.4 复位电路 复位操作完成单片机内电路的初始化,是单片机从一种确定的状态开始运行。 当单片机的复位引脚RET出现5ms以上的高电平时,单片机就完成了
12、复位操作。如果RST持续为高电平,单片机就处于循环复位状态,而无法执行程序。因此要求单片机复位后能脱离复位状态。 根据应用要求,复位操作通常有2种基本形式:上电复位、开关复位。 上电复位要求接通电源后,自动实现复位操作。开关复位要求在电源接通的条件下,在单片机运行期间,如果发生死机,用按钮开关操作使单片机复位。 上电后,由于电容要充电,是RST持续一段时间高电平时间。当单片机已经在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电且开关复位的操作。 通常选择C=1030uF,R=101k? 常用的复位电路如下图所示: 在单片机启动后,电容C两端的电压持续充电为5V,这是时候1
13、0K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。 3.5 音频放大电路 使用PNP管来放大,其中发射极接5V电源,集电极接喇叭,电路中的电容是用来隔离直流电用的。 PNP管放大原理:当PNP管的VC= 1; /换右边一位 return 16; /没有键按下就返回16
14、 主函数 */ void Main(void) uchar Key_Value = 16, Key_Temp1, Key_Temp2;/读出的键值 TMOD = 0x01; /T0定时方式1 ET0 = 1; /允许T0中断 EX0 = 1; /允许INT0中断 EA = 1;/开总中断 while(1) TR0 = 0; /T0工作停,暂不发音 Key_Temp1 = Keyscan(); /第一次读入按键 if(Key_Temp1 != 16) /有键按下 Key_Temp2 = Keyscan(); /再读一次 if (Key_Temp1 = Key_Temp2) /两次相等 Key_Value = Key_Temp1; /就确认下来 FTemp = tabKey_Value; /根据键值,取出定时半周期的初始值 TR0 = 1; /启动定时器T0,发音 while (Keyscan() 8; P20 = P20; /发音