基于MATLAB的数字电子琴设计【实用文档】doc_第1页
基于MATLAB的数字电子琴设计【实用文档】doc_第2页
基于MATLAB的数字电子琴设计【实用文档】doc_第3页
基于MATLAB的数字电子琴设计【实用文档】doc_第4页
基于MATLAB的数字电子琴设计【实用文档】doc_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于MATLAB的数字电子琴设计【实用文档】doc文档可直接使用可编辑,欢迎下载

*****************基于MATLAB的数字电子琴设计【实用文档】doc文档可直接使用可编辑,欢迎下载实践教学*******************题目:基于MATLAB的数字电子琴设计专业班级:姓名:学号:指导教师:成绩:摘要本次课设的任务是基于MATLAB设计一个数字电子琴,首先实现数字信号发生器的设计。数字信号发生器是一种基于软硬件实现的波形发生器,可以实现各种基本波形的产生。在工程的各种复杂信号是由这些基本信号叠加产生,因此它在工程分析和实验教学中有着广泛的应用,可用MATLAB实现。MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在数字信号处理方面方便实用.本文首先详细介绍了基于MATLAB的数字发生器的设计过程,实现了简单波形(正弦波、方波、三角波、锯齿波、白噪声、脉冲、阶跃)信号的具体实现方法。其次介绍了利用该数字信号发生器产生的正弦波信号和声卡设计的简易电子琴.关键词:MATLAB;数字信号发生器;简易电子琴目录TOC\o"1-2”\h\uHYPERLINK\l”_Toc393375326"前言1HYPERLINK\l”_Toc393375327"一、数字信号发生器2HYPERLINK\l”_Toc393375328"1.1图形用户界面的简介2HYPERLINK\l”_Toc393375329"1.2设计流程2_Toc393375332"2.1简易数字电子琴的简介6HYPERLINK\l”_Toc393375333”2.2实现原理6三、基于MATLAB的仿真及结果分析8HYPERLINK\l”_Toc393375335"3.1GUI界面8总结19HYPERLINK\l”_Toc393375339"参考文献20_Toc393375341”致谢34前言MATLAB(矩阵实验室)是MatrixLaboratory的缩写,是一种用于算法开发、数据可视化、数据分析以及数值计算的高级计算机语言和交互式环境.MATLAB可以进行矩阵运算、绘制函数图像和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域.Matlab环境下的图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面,可在图形用户界面内根据需要搭建图形,并对控件的回调函数进行编写,完成最完整的GUI界面编辑即可运行。本文主要利用MATLAB的图形用户界面设计数字信号发生器,在数字信号发生的基础上实现简易电子琴的设计。信号发生器又称信号源或振荡器,是一种能提供各种频率、波形和输出电平电信号的仪器,数字信号发生器只是信号发生器的一种,在生产实践和科技领域中有着广泛的应用.信号发生器按信号波形可分为正弦信号、函数(波形)信号、脉冲信号和随机信号发生器等四大类。能够产生多种波形,如正弦波、三角波、锯齿波、矩形波(含方波)、阶跃信号、脉冲信号的电路被称为函数信号发生器。本文设计了一种基于MATLAB图形用户界面的可以产生正弦波、方波、三角波、锯齿波、白噪声、脉冲信号、阶跃信号的虚拟数字信号发生器。一、数字信号发生器1.1图形用户界面的简介图形用户界面即GraphicalUserInterface,简称GUI,又称图形用户接口。Matlab环境下的图形用户界面(GUI)是由窗口、光标、按键、菜单、文字说明等对象构成的一个用户界面.用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等.MATLAB的用户,在指令窗中运行demo打开那图形界面后,只要用鼠标进行选择和点击,就可产生丰富的内容。对图形用户界面的操作一般有两个部分,首先按照设计的原理、要求,根据需要选择适当的图形对象搭建合理的GUI界面;然后对每个控件的回调函数在M文件内进行编写,使搭建的GUI界面能够运行。数字信号发生器的设计所使用的工具即GUI界面,用到的图形对象有pushbutton、Aexs、Slider、StaticText、EditText。模拟了七种信号:正弦波、方波、三角波、阶跃信号、斜波信号、锯齿波以及白噪声信号。具体的实现原理如下。1。2设计流程根据设计的要求分析出数字信号发生器的GUI界面构图,然后在MATLAB的workplace界面中输入guide,打开GUI界面.在GUI界面中搭建好具体的数字信号发生器的界面,并对每个控件的回调函数进行编写、保存M文件。运行,若结果正确,再同一个GUI界面中搭建好电子琴的GUI界面,利用数字信号发生器产生的正弦波,对电子琴每个控件的回调函数进行编写、保存M文件。运行,观察仿真结果.若数字信号发生器的仿真结果不正确,检查控件的回调函数,修改并保存M文件,再次运行观察仿真结果。具体的设计流程图如下:1.3波形实现的基本原理1.3.1正弦波的实现正弦信号的数学表达式如下:(1.1)其中:为幅值;为频率;为相位。在MATLAB中,由于处理对象均是离散的数字信号,将时间变量离散化并构造成一个一维数组用其中:为采样频率。但的值不能太大,否则波形显示会很慢。相应的正弦波信号的数字信号表达式为(1。2)幅值、频率、相位参数可以由用户界面上的滑动条或编辑框输入。在分别得到与的离散值后,用plot作图函数即可获得相应波形显示。1。3。2方波信号的实现方波信号的数学表达式为(1.3)该式可直接生成一个周期为,峰值为,占空比为的方波信号,的默认值为50%。在MATLAB中可得到幅值、频率、相位可调的方波信号函数(1.4)1。3.3三角波信号的实现在MATLAB中,可以用函数直接生成一个三角波信号,该函数可生成一个周期为,峰值为,最大值出现在位置的三角波。利用该函数,可得到幅值、频率、相位可调的三角波信号函数(1。5)1。3.4锯齿波信号的实现由于锯齿波信号与三角波信号相似,所以将函数中的参数值设为1,可得到锯齿波。该函数得到的幅值、频率、相位可调的锯齿波信号函数(1。6)1。3.5脉冲信号的实现由于脉冲信号与方波信号波形相似,用方波信号函数函数为基础,将其函数值加1,可得到最大值为2,最小值为0的脉冲波形,原函数的参数可用来调节脉冲的宽度。用该函数,得到幅值、频率、相位可调的脉冲信号函数。(1.7)1。3。6阶跃信号的实现由于阶跃信号比较特殊,可用函数直接表示,其函数表达式为(1.8)1。3.7白噪声信号的实现白噪声信号是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可借助于MATLAB中的函数,它的功能是产生一个均值为0,标准差为1的随机数列或矩阵函数,可得到一个均值为0,标准差为的维的随机矩阵。二、电子琴的实现2。1简易数字电子琴的简介在设计界面中包含A、B、C、D、E、F、G共7个琴键,由于低音频率区分不是很明显,此次课设选择的是中音频率,其中每个按键对应一个频率的正弦波信号,各按键对应的信号频率分别为392、440、494、523、587、659、698、784Hz。当用鼠标按下相应的键时发声,松开时发声停止,然后将数字信号写入声卡的缓冲区,由声卡播放出相应的声音。当用鼠标按下对应的键时即可发出相应频率的声音。2.2实现原理电子琴的实现基于之前设计的数字信号发生器,选择数字发生器产生的正弦波信号作为发声及显示波形,由回调函数和数字信号发生器结合起来,实现对波形的调用。每个键对应一定的频率,在各个键的回调函数中设置好频率及频谱显示,实现每个键有自己特定频率的功能,为了使最终仿真结果更好,选择音阶中音调高的频率作为调试频率。当键按下的时候,首先由相应的键和数字信号关联起来,随后将数字信号写入声卡的缓冲区,由声卡发出相应频率的声音,并显示波形及对应频率的频谱图,当键松开时声音即停止.此次电子琴的设计实现了正弦波显示、频谱显示以及发声的功能,从而实现虚拟电子琴的模仿功能。具体的实现流程图如下:开始开始打开MATLAB打开MATLAB搭建电子琴的GUI界面搭建电子琴的GUI界面执行并观察仿真结果执行并观察仿真结果结束结束图2.1电子琴的实现流程图三、基于MATLAB的仿真及结果分析3.1GUI界面3.1.1搭建数字信号发生器的GUI界面搭建的GUI界面如下图3。1:图3.1数字信号发生器的GUI界面3。1.2电子琴的GUI界面.搭建的数字电子琴GUI界面如图3。2所示:图3。2数字电子琴的GUI界面G该界面主要由琴键组成,每个按键对应一定的频率,模拟电子琴的发声功能,它的波形显示及频谱图在数字信号发生器中。3.2编写M文件3。2。1数字信号发生器的M文件(1)正弦信号的实现由正弦信号的数学表达式可知在程序中用到的具体表达式为(3。1)将时间变量离散化并构造成一个一维数组,要求采样频率不能太大,否则波形显示会很慢(2)方波信号的实现用函数直接生成一个方波信号,程序中使用的具体函数为(3。2)(3)三角波的实现函数直接生成一个三角波信号,程序中用到的具体实现函数为(3.3)(4)锯齿波信号的实现具体的函数实现形式为(3.4)(5)脉冲信号的实现抽样频率为8000,时间范围为[0,1],坐标抽为[0,a+1]。得到的幅值、频率、相位可调的脉冲信号函数。具体的函数(3.5)(6)阶跃信号的实现取1,A取1,t取[0,2],时间间隔为/100。阶跃信号的函数表达式为(3.6)(7)白噪声信号的实现白噪声是指功率谱密度在整个频域内均匀分布的噪声。白噪声的实现可借于MATLAB中的函数,产生一个均值为0,标准差为1的随机数列或矩阵该函数可得到一个均值为0,标准差为的维的随机矩阵.(3。7)3。3仿真结果数字信号发生器的仿真结果如下:正弦波的仿真结果图3.3数字信号发生器的正弦波波形方波信号的仿真结果图3.4方波信号的波形(3)三角波信号仿真结果图3.5三角波信号的波形阶跃信号仿真结果图3。6阶跃信号的仿真结果(5)斜波信号图3.7斜波信号的仿真结果(6)锯齿波信号的仿真结果图3。8阶跃信号的仿真结果(7)白噪声仿真结果(1)按键A的仿真结果图3。10按下A键,电子琴演奏时的效果(2)按键B的仿真结果图3.11按下B键,电子琴演奏时的效果(3)按键C的仿真结果图3.12按下C键,电子琴演奏时的效果总结本次的课程设计的任务是基于MATLAB设计一个数字电子琴,首先设计一个数字信号发生器。数字信号发生器和电子琴的搭建都是在GUI界面中进行搭建的,在GUI界面中搭建好具体的数字信号发生器的界面,并对每个控件的回调函数进行编写、保存M文件。运行,若结果正确,再同一个GUI界面中搭建好电子琴的GUI界面,利用数字信号发生器产生的正弦波,对电子琴每个控件的回调函数进行编写、保存M文件搭建完成之后对各个控件进行回调函数的编写.如果数字信号发生器的运行结果正确,则继续搭建电子琴否则修改直到正确为止。在本次的课程设计中,确实遇到了很多问题,但通过大家的帮助和自己的努力,最终实现所有的设计要求。本次课程设计也许还存在着一些不足,在以后学习生活中会更加努力,争取做得更好.参考文献[1]丁玉美.数字信号处理[M]。西安电子科技大学出版社,2003,3。[2]朱冰莲。数字信号处理[M]。电子工业出版社,2003,7。[3]程佩青。数字信号处理教程(第二版)[M]。北京:清华大学出版社,2001.[4]韩纪庆,张磊,郑铁然。语音信号处理[M]。北京:清华大学出版社,2004.[5]王济,胡晓.MATLAB在振动信号处理中的应用[M].北京:中国水利水电出版社:知识产权出版社,2006.[6]周祥才,杨铮.基于MATLAB的信号采样与重构的实现[J].实验技术与管理,2007,24[7]张志涌等.精通MATLAB[M].北京:北京航空航天大学出版社,2003.[8]车子萍。基于Matlab的虚拟信号发生器设计[J]。电脑学习,2010。1.[9]李益华。MATLAB辅助现代工程数字信号处理(第2版)。西安:西安电子科技大学出版社,2010[10]杨洁芳.基于MATLAB与声卡的低频信号发生器的设计与实现。电脑学习,2006附录:functionpushbutton16_Callback(hObject,eventdata,handles)Fs=8000;t=(0:2000)/Fs;pit=2*pi*t;a1=523;y=sin(a1*pit);axes(handles。axes1);plot(t,y);title(’时域波形')xlabel(’t’)ylabel(’y’)axis([0,。01,—2,2])axes(handles。axes2);f=fft(y,1024);f1=fftshift(f);w1=513:1024;w=4000*(w1-512)/512;F=abs(f1(513:1024));plot(w,F);title(’频谱图’)xlabel('w’)ylabel(’F(w)')sound(y);functionpushbutton24_Callback(hObject,eventdata,handles)Fs=8000;t=(0:2000)/Fs;pit=2*pi*t;a2=587;y=sin(a2*pit);axes(handles.axes1);plot(t,y);title('时域波形')xlabel('t')ylabel('y’)axis([0,.01,—2,2])axes(handles.axes2);f=fft(y,1024);f1=fftshift(f);w1=513:1024;w=4000*(w1-512)/512;F=abs(f1(513:1024));plot(w,F);title('频谱图')xlabel(’w’)ylabel(’F(w)')sound(y);functionpushbutton25_Callback(hObject,eventdata,handles)Fs=8000;t=(0:2000)/Fs;pit=2*pi*t;a3=659;y=sin(a3*pit);axes(handles。axes1);plot(t,y);title('时域波形’)xlabel('t')ylabel(’y')axis([0,。01,—2,2])axes(handles.axes2);f=fft(y,1024);f1=fftshift(f);w1=513:1024;w=4000*(w1—512)/512;F=abs(f1(513:1024));plot(w,F);title(’频谱图')xlabel(’w’)ylabel(’F(w)’)sound(y);functionpushbutton26_Callback(hObject,eventdata,handles)Fs=8000;t=(0:2000)/Fs;pit=2*pi*t;a4=698;y=sin(a4*pit);axes(handles.axes1);plot(t,y);title(’时域波形')xlabel('t’)ylabel('y’)axis([0,。01,—2,2])axes(handles。axes2);faxes(handles。axes1);plot(t,y);title('时域波形')xlabel(’t')ylabel(’y’)axis([0,。01,—2,2])axes(handles。axes2);f=fft=0:1/fs:1。0;y=a*sin(2*pi*(f*t+q/360));axes(handles.axes1);plot(t,y);title('时域波形');xlabel(’t’);ylabel('y');gridon;axis([0,。01,-2,2]);allback(hObject,eventdata,handles)t=(0:pi/100:2*pi);t0=1;A=1;y=0*(t〈t0)+A*(t〉t0);endt=0:1/fs:1.0;y=randn(size(t));title(’时域波形’);plot(t,y);title(’时域波形');xlabel(’t');ylabel(’y’);gridon;axis([0,Ts,—(a+1),(a+1)]);functionslider1_Callback(hObject,eventdata,handles)w=get(hObject,'value');set(handles。edit1,’string’,num2str(w));functionslider1_CreateFcn(hObject,eventdata,handles)ifisequal(get(hObject,’BackgroundColor’),get(0,’defaultUicontrolBackgroundColor'))functionslider2_Callback(hObject,eventdata,handles)w=get(hObject,’value');set(handles.edit2,’string',num2str(w));functionslider2_CreateFcn(hObject,eventdata,handles)ifisequal(get(hObject,’BackgroundColor'),get(0,'defaultUicontrolBackgroundColor’))set(hObject,’BackgroundColor',[.9。9。9]);endfunctionedit1_Callback(hObject,eventdata,handles)v=get(hObject,’string');set(handles。slider1,’value',str2double(v));functionedit1_CreateFcn(hObject,eventdata,handles)ifispc&&isequal(get(hObject,’BackgroundColor’),get(0,'defaultUicontrolBackgroundColor'))endfunctionedit3_Callback(hObject,eventdata,handles)v=get(hObject,'string’);set(handles。slider3,'value’,str2double(v));functionedit3_CreateFcn(hObject,eventdata,handles)get(0,'defaultUicontrolBackgroundColor'))set(hObject,’BackgroundColor','white');end致谢本次课设,我遇到了很多问题,首先感谢我的课程设计指导教师老师在这段时间一直给我的支持与鼓励。认真负责的监督我们课程设计的进度,耐心的指导我们使我们能够按时的完成任务。同时还要感谢在设计过程中同学们尤其是同组成员给给了我很大的帮助,对我课设过程中不明白的问题给予了即使的、耐心的帮助,让我对此次课设涉及的知识有了更加深刻的把握。他们提出了许多宝贵的建议使我们的设计能得到更好的完善,也加快设计的进程.还有感谢学校为我们提供的良好实验环境以及充足的实验设备,为我们的设计和调试提供了很大的方便.在这段时间学到了很多,虽然由于自身的不足没有能够为系统提出更好的解决方案.但这对我来说绝对是一个非常宝贵的历练.从中我切身体会到了理论和现实的差距,只有真正动手去做才能发现问题.同时,小组成员相互商讨解决方案,发现设计中的不足之处,使错误得到了即使改正,在此衷心地感谢老师以及这几周的殷切指导以及同学们提出诸多宝贵意见真诚地道一声,谢谢!单片机课程设计报告书小组成员:吕梦莎吴玉凤学号:1121307211213078班级:自动化1106指导教师:于振宇基于AT89C51的屏幕声光式可录音电子琴北京交通大学电子信息工程学院吕梦莎吴玉凤摘要:本文的主要内容是用AT89S51单片机为核心控制元件,通过脉冲触发产生出电子音调,与按键、扬声器、LCD显示屏等模块组成控制模块,设计一个电子琴。该系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用与参考价值。关键词:AT89C51、脉冲触发、屏幕声光式、录音、播放、演奏、电子琴。第一章引言1.1设计背景单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。

电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。

本文对利用单片机设计简易电子琴进行了分析,分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。本系统是简易电子琴的设计,按下四角自锁开关会使LCD显示屏显示当前音符名称、播放的歌曲名称或播放的录音名称,同时扬声器播放对应的音符,LED闪烁相应的节奏。通过设计本系统可熟悉掌握单片机的基本功能。1。2

设计任务

1、设计以单片机为核心的简易电子琴系统,可随意弹奏想要表达的音乐;

2、针对要求控制的对象完成程序的编制;3、硬件软件联调,完成题目所要求的功能;

1.3设计思路1、发声部分设计思路音乐是由不同频率的声音组成的。利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波。利用延时程序控制“高”“低"电平的持续时间,就能改变输出频率,从而改变音调.于是产生do,re,mi,fa,so,la,xi七个音符的变换。2、显示部分设计思路考虑到信息的多媒体传播已经成为信息化时代的主流,我们给电子琴设计了LCD显示器和节拍指示LED灯,带来视听双重冲击。LCD具有功耗低,显示质量高,数字式接口更加稳定可靠的优点.演示过程中可显示欢迎语,当前功能,按下的音符名称,当前播放的歌曲名称等。第二章方案论证采用AT89C51单片机作为主控芯片,设置独立按键、扬声器、LCD显示屏等外围器件,另外还用到一些简单器件如NPN型三极管及电阻等。利用按键实现音符和音调的输入;LCD显示屏进行被操作的按键显示;用PNP型三极管2N2907实现低音频功率放大;最后用扬声器发音。

主控芯片采用AT89C51单片机,它是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。避免了由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素.同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于娱乐方面,因此在设计上尽量使其安全以及简单易操作。具有经济可行性、技术可行性、实物应用性。第三章硬件系统设计3.1时钟电路MCS-51内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端输出端。本图采用内部时钟电路,如图3-1所示,通常在引脚XTALl和XTAL2上跨接石英晶体X1和两个补偿电容C1、C2构成自激振荡器.可以根据情况选择2~12MHz频率之间的石英晶体,补偿电容通常选择30pF左右的瓷片电容。图3-1时钟电路3。2复位电路单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。本实验采用上电自动复位方式,其结构图如图3—2所示。上电复位要求接通电源后,自动实现复位操作。复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。对于MCS—51单片机,只要在RST复位端接一个电容至VCC和一个电阻至VSS即可.在加电瞬间,RST端出现一定时间的高电平,只要高电平保持时间足够长,就可以使MCS—51复位。图3—2复位电路3。3原理框图本系统有主控芯片AT89C52、扬声器、显示模块、按键模块和晶振复位电路组成。图3-3原理框图3。4显示部分设计为了让电子琴能够显示出音调,我们另外附加了一个LCD1602提供屏幕式音调显示,LCD1602属于字符型液晶,可以显示字母和数字等字符。LCD1602是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。图3-4显示电路3。5按键部分设计3.5.1键盘设计键盘可以分为2类:独立连接式键盘和矩阵式键盘.本设计采用独立式键盘。独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键电路配置灵活,软件结构简单。独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序.由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。下图为独立式键盘电路图:图3-5独立式键盘电路图3。5.2去抖动键盘编程中主要考虑去抖动的问题。当测试表明有键被按下之后,紧接着就进行去抖动处理.因为按键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。为此需进行去抖动处理。去抖动有硬件和软件两种方法。硬件方法就是加去抖动CPU便确认此按键己按下,消除了抖动。本实验采用软件消抖法,在按键按下后,执行一段延时程序。3.6发音部分设计如下图所示,发音电路是由扬声器、三极管、变位器构成.由三极管来驱动扬声器发音的,同时加上变位器实现电阻的可调来增强驱动电流,提高驱动能力,从而调节扬声器的音效。

图3-6扬声器电路图第四章软件系统设计4。1

系统分析

4。1.1系统软件的组成

(1)键盘扫描程序:检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。

(2)功能转移程序:对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有三种,即音色调节功能、自动播放乐曲和录音的功能.

(3)琴键处理程序:根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。

(4)自动播放歌曲程序:检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲或录音歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。(5)录音程序:检测到按键按下的是录音功能键后执行该程序,跳转到键盘扫描程序,检测是否有键按下,有按键按下则记录按下键值,根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音并跳转到功能转移程序。4.1.2

系统总体功能流程图开始开始初始化T0初始化T0键盘扫描键盘扫描程序演奏功能键按下自动播放键按下录音功能键按下NN演奏功能键按下自动播放键按下录音功能键按下YYY记录音符记录音符播放内部存储的音乐查表得到按键音符频率播放内部存储的音乐查表得到按键音符频率查表得到按键音符频率查表得到按键音符频率播放音符播放音符播放音符播放音符4。2

参数计算

4.2.1发音原理

若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1。0引脚上得到此频率的脉冲。利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶.音调的确定音调是唱曲时乐音的发音,一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西"的读音。例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式是:N=fi÷2÷fr,式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率.其计数初值T的求法如下:T=65536-N=65536-fi÷2÷fr例如:设K=65536,fi=1MHz,求中音DO(261Hz)。T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=64580。由音符的频率值可以计算得出各个音调的计数值,如表4-1所示:(﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。)表4—1音调频率与计数初值对照音符频率(Hz)计数值(T值)音符频率(Hz)计数值(T值)低1DO26263628#4FA#74064860#1DO#27763737中5SO78464898低2RE29463835#5SO#83194934#2RE#31163928中6LA88064968低3MI33064021#6LA#93264994低4FA34964103中7SI96865030#4FA#37064185低1DO104665058低SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#6LA#46664463高3MI131865157低7SI49464524高4FA139765178中1DO52364580#4FA#149065198#1DO#55464633高5SO156865217中2RE58764633#5SO#166165235#2RE#62264884高6LA176065252中3MI65964732#6LA#186565268中4FA69864820高7SI196765283采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据.4.2.3节拍的确定若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0。5s,则1/4拍为0。125s,只要设定延迟时间就可以求得节拍的时间,假设1拍为4DELAY,则1/4应为1DELAY,以此类推,得到如表4-2所示的节拍与延迟时间对照表。休止符表示暂停发音。表4—21/4和1/8节拍的时间设定曲调值DELAY曲调值DELAY调4/4125毫秒调4/462毫秒调3/4187毫秒调3/494毫秒调2/4250毫秒调2/4125毫秒4.3程序设计4.3.1播放子程序(包括自动播放存储音乐和按键发音)

本设计共两种播放模式,包括自动播放存储音乐和按键发音。上电后,首先开中断并设定定时器0为工作方式1,当自动播放键按下时,进入中断,根据乐谱在定义的音频数组中查找相应音律,然后给定时器赋初值,即开始播放音乐。当DO、RE、MI、FA、SO、LA、SI七种音符键按下时,根据音符值在定义的音频数组中查找相应音律,然后给定时器赋初值,即按键发音.开始开始开中断并设定工作寄存器开中断并设定工作寄存器有键按下有键按下自动播放键按下自动播放键按下进入中断N进入中断YY根据yinfu和工作方式取值,并在数组中查找相应音律进入中断根据yinfu和工作方式取值,并在数组中查找相应音律进入中断给定时器T0赋值根据乐谱在数组中查找相应音律给定时器T0赋值根据乐谱在数组中查找相应音律播放键值对应的音符播放键值对应的音符给定时器T0赋值给定时器T0赋值播放音乐播放音乐

第五章

实验结果5.1硬件调试

硬件调试主要是针对单片机部分进行的调试.

在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、和音频转换电路硬件调试.

1、数码管LED电路调试:接通电源,随机按下按钮可以看到数码管显示数字。

2、键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确.

5.2

软件调试

调试主要方法和技巧:通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数值。整个程序是一个主程序调用各个子程序实现功能的过程,要使主程序和整个程序都能平稳运行,各个模块的子程序的正确与平稳运行必不可少,所以在软件调试的最初阶段就是把各个子程序模块进行分别调试.5.3仿真结果第六章总结本次51单片机课程设计我们组做的是《基于AT89C51单片机的屏幕式声光电子琴的设计》,通过这次的DIY制作的学习,我学到了不少知识,真正体会到了学以致用的快感,通过自己动手制作小作品不仅加深了我们对51单片机的理解,而且也增强了我们对音乐的兴趣,也因此喜欢上了各种基于51单片机的小制作,从而更好地将课本知识与实践过程相结合。在这次课程设计中,主要涉及了软件和硬件两个方面的内容。在软件方面,我们掌握了仿真软件proteus的仿真方法,实现了7音符的发声、录音以及音乐的自动播放功能,同时也提高了我们用汇编语言编程的能力;在硬件方面,我们对电子产品的开发流程和功能应用有了一定的了解,进一步熟悉和掌握了单片机的内部结构和工作原理,了解了单片机应用系统设计的基本方法和步骤。并且提高了我们运用所学的专业基础知识来解决实际问题的能力,加深了对所学理论知识的理解和运用,动手能力也得到了相应的提高,创新意识得到了锻炼。在本次的实验设计中,我们在借鉴前人的基础上也对自己的作品进行了一部分创新,①在设置录音功能方面,根据随机弹奏的音调,将其偏移地址存入36H单元中,然后通过查询音调表,使其发出相应频率的声音,从而弹奏出事先录好的一段音乐.②在控制节奏方面,我们设置了休止符,来控制节奏的停顿,这样就能产生有停顿感的音乐,而不是连续的,使音乐听起来更加悦耳。而这些创新均基于汇编语言的学习.总体来说,此次单片机课程设计使我们收获良多,虽然课程设计的过程中遇到了很多困难与问题,但我们最终还是完成了设计的任务及要求.也让我认识到,无论做什么事情,只要你足够坚强,有足够的毅力和决心,有足够的挑战困难的勇气,就没有什么办不到的.最后,衷心感谢老师给我们提供了这样一次难得的机会来展示自己的作品,激发了我们对单片机DIY小制作的兴趣,也感谢老师在这个学期孜孜不倦的教悔,让我们在学习单片机的基础知识的同时,真正体会到学以致用带来的快感。由此我觉得,我们的学习不仅要在教师引导和帮助下顺利入门,还要掌握自动控制原理课程的精髓和要点,并且能够“由厚及薄",达到对课程整体的把握,具有一定的工程概念和实践能力。附录一:源程序RSEQUP3.5RWEQUP3.6EEQUP3。7ORG00HSJMPMAINORG00BHMOVTH0,33HMOVTL0,34HCPLP3.4RETI;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ORG001BHINC3CH;中断服务,中断计数器加1MOVTH1,#0D8HMOVTL1,#0EFH;12M晶振,形成10毫秒中断RETI;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ORG30HMAIN:SETBP3.4;关闭扬声器LCALLCSH1602;初始化1602MOVTMOD,#11H;设置定时器0为工作模式1SETBEA;开总中断SETBET0;开定时器0中断HUANYING:MOVP1,#80H;欢迎语显示地址LCALLENABLEMOVDPTR,#TAB_HYMOV30H,#00LP:MOVA,30HMOVCA,@A+DPTRJZKEYLCALLDELAY_100MSLCALLWRITE_1602INC30HSJMPLPKEY:MOVP1,#01H;清屏ACALLENABLEMOVP1,#80HLCALLENABLEMOVDPTR,#TAB_YANZHOUMOV30H,#00LP7:MOVA,30HMOVCA,@A+DPTRJZKEY_0LCALLWRITE_1602INC30HSJMPLP7KEY_0:MOVP1,#0C0H;音符的显示地址LCALLENABLEMOV38H,#16;写入1602的显示地址指针MOV35H,#2;控制节拍KEY_1:MOVP2,#0FFH;置P2为输入JBP2.0,KEY_2;K1键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.0,$MOV36H,#0;装入1的音符码相对地址LCALLBOFANG_YFKEY_2:JBP2。1,KEY_3;K2键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.1,$MOV36H,#2LCALLBOFANG_YFKEY_3:JBP2。2,KEY_4;K3键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。2,$MOV36H,#4LCALLBOFANG_YFKEY_4:JBP2。3,KEY_5;K4键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。3,$MOV36H,#6LCALLBOFANG_YFKEY_5:JBP2.4,KEY_6;K5键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。4,$MOV36H,#8LCALLBOFANG_YFKEY_6:JBP2.5,KEY_7;K6键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.5,$MOV36H,#10LCALLBOFANG_YFKEY_7:JBP2。6,KEY_9;K7键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.6,$MOV36H,#12LCALLBOFANG_YFKEY_9:JBP3.2,KEY_1;K9键没按下,重新扫描LCALLDELAY_10MS;延时消抖JNBP3。2,$LCALLDELAY_10MS;—-—---—----播放音乐程序段-—-——--———-MOVP1,#01H;清屏ACALLENABLEMOVP1,#80HLCALLENABLEMOVDPTR,#TAB_PLAYMOV30H,#00LP8:MOVA,30HMOVCA,@A+DPTRJZPLAYLCALLWRITE_1602INC30HSJMPLP8PLAY:MOVP2,#0FFH;置P2为输入JBP2。0,PLAY_2;K1键没按下,转移MOVDPTR,#TAB_GEQU1;存曲目标志LCALLBOFANG_GEQUPLAY_2:JBP2.1,PLAY_3;K2键没按下,转移SETBET1MOV3BH,TMODMOVTMOD,#11Hmovdptr,#tab2movp1,#0c0hlcallenablelcallwrite1MOVDPTR,#DAT2LCALLMUSIc0CLRTR1CLRET1MOVTMOD,3BHPLAY_3:JBP2.2,PLAY_4;K3键没按下,转移SETBET1MOV3BH,TMODMOVTMOD,#11Hmovdptr,#tab1movp1,#0c0hlcallenablelcallwrite1MOVDPTR,#DAT1LCALLMUSIc0CLRTR1CLRET1MOVTMOD,3BHPLAY_4:JBP2。3,PLAY_9MOVR1,#50HLCALLBOFANG_LUYINPLAY_9:JBP3.2,PLAY;K8键没按下,重新扫描LCALLDELAY_10MS;延时消抖JNBP3.2,$LCALLDELAY_10MS;—--—-—-----—录音程序段—-——--————-MOVP1,#01H;清屏ACALLENABLEMOVP1,#80HLCALLENABLEMOVDPTR,#TAB_RECORDMOV30H,#00LP9:MOVA,30HMOVCA,@A+DPTRJZRECORD_0LCALLWRITE_1602INC30HSJMPLP9RECORD_0:MOVR1,#50H;录取音符存放地址MOV35H,#3;控制节拍MOVP1,#0C0H;音符的显示地址LCALLENABLEMOV38H,#16;写入1602的显示地址指针;—----—-——写入录音的名字----——---MOV30H,#00C5:MOVA,30HLCALLTAB_RECORDINGMOV@R1,A INCR1ﻩINC30HﻩCJNEA,#0FEH,C5RECORD_1:MOVP2,#0FFH;置P2为输入JBP2.0,RECORD_2;K1键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.0,$MOV36H,#0;装入1的音符码相对地址LCALLBOFANG_YFLCALLCUNCU;调存音符子程序RECORD_2:JBP2.1,RECORD_3;K2键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。1,$MOV36H,#2LCALLBOFANG_YFLCALLCUNCURECORD_3:JBP2.2,RECORD_4;K3键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.2,$MOV36H,#4LCALLBOFANG_YFLCALLCUNCURECORD_4:JBP2。3,RECORD_5;K4键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.3,$MOV36H,#6LCALLBOFANG_YFLCALLCUNCURECORD_5:JBP2.4,RECORD_6;K5键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。4,$MOV36H,#8LCALLBOFANG_YFLCALLCUNCURECORD_6:JBP2.5,RECORD_7;K6键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.5,$MOV36H,#10LCALLBOFANG_YFLCALLCUNCURECORD_7:JBP2。6,RECORD_8;K7键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2.6,$MOV36H,#12LCALLBOFANG_YFLCALLCUNCURECORD_8:JBP2.7,RECORD_9;K8键没按下,转移LCALLDELAY_10MS;延时消抖JNBP2。7,$MOV36H,#42;休止符标志存36HLCALLDELAY_100MSLCALLCUNCURECORD_9:JNBP3.2,J0;K8键没按下,重新扫描ﻩLJMPRECORD_1J0:LCALLDELAY_10MS;延时消抖JNBP3.2,$LCALLDELAY_10MSﻩMOV@R1,#255;写入歌曲结束标志ﻩLJMPKEY;回演奏模式;***********子程序区***************;=======初始化1602显示器========CSH1602:MOVP3,#0FFHMOVP1,#01HACALLENABLEMOVP1,#38HACALLENABLEMOVP1,#0CHACALLENABLEMOVP1,#06HACALLENABLERET;====1602发命令子程序====ENABLE:CLRRSCLRRWCLREACALLDELAY_2MSSETBERET;=====读1602IR中命令子程序======ENABLE_1:CLRRSSETBRWCLREACALLDELAY_2MSSETBERET;====写数据子程序(1602)====WRITE_1602:MOVP1,ASETBRSCLRRWCLREMOVR5,#50;延时100us(12M晶振)DJNZR5,$SETBERET;===========播放一个音符并显示音符和频谱=========BOFANG_YF:MOVA,36HLCALLTAB_YFMOV33H,AMOVA,36HINCALCALLTAB_YFMOV34H,AMOVTH0,33HMOVTL0,34HSETBTR0;启动定时器0MOVA,36H;取音符的显示码LCALLTAB_YF1LCALLWRITE_1602DEC38HMOVA,36HINCALCALLTAB_YF1LCALLWRITE_1602DJNZ38H,D2;1602一行没写满,转移MOV30H,#16;1602满行清行并从头开始写MOVP1,#0C0HLCALLENABLEMOVA,#’'LP10:LCALLWRITE_1602DJNZ30H,LP10MOV38H,#16MOVP1,#0C0HLCALLENABLE;——-—--—-—-显示频谱分析条程序段—-—---—-—-D2:MOVA,36H;音符码转换为相应键值MOVB,#2DIVABADDA,#1MOV39H,AMOV3AH,39H;保护音符码对应的键值MOVP1,#85H;设定频谱分析条显示初地址LCALLENABLEMOVA,#’〉’D5:LCALLWRITE_1602DJNZ39H,D5;————控制节拍时长程序段--—-—---—MOV37H,35H;保护循环次数控制(节拍)LP1:ACALLDELAY_100MSDJNZ35H,LP1;延时次数控制MOV35H,37H;--———---—发音结束,清除频谱分析条---—-—--———-MOVP1,#85H;频谱分析条显示的初地址LCALLENABLEMOVA,#'’MOV39H,3AHD6:LCALLWRITE_1602DJNZ39H,D6MOVA,#10H;释放音符码显示地址CLRCSUBBA,38HADDA,#0C0HMOVP1,ALCALLENABLECLRTR0;关定时器0RET;===========播放一个音符并显示频谱=========BOFANG_YF_1:MOVA,36HLCALLTAB_YFMOV33H,AMOVA,36HINCALCALLTAB_YFMOV34H,AMOVTH0,33HMOVTL0,34HSETBTR0;启动定时器0;—-——-—---—显示频谱分析条程序段——-—--—MOVA,36H;音符码转换为相应键值MOVB,#2DIVABADDA,#1MOV39H,AMOV3AH,39H;保护音符码对应的键值MOVP1,#85H;设定频谱分析条显示初地址LCALLENABLEMOVA,#'>'D7:LCALLWRITE_1602DJNZ39H,D7;——------控制节拍时长程序段——--—--——MOV37H,35H;保护循环次数控制(节拍)LP11:ACALLDELAY_100MSDJNZ35H,LP11;延时次数控制MOV35H,37H;--—--——--发音结束,清除频谱分析条--——----—-—-MOVP1,#85H;频谱分析条显示的初地址LCALLENABLEMOVA,#''MOV39H,3AHD8:LCALLWRITE_1602DJNZ39H,D8CLRTR0;关定时器0RET;============播放一首歌并显示歌名=============;—---—-(一个音符2字节存储,音符码存低字节,节拍存高字节;254为歌曲名结束标志,255为歌曲结束标志)---——-—BOFANG_GEQU:MOVP1,#0C0H;歌名显示地址LCALLENABLEMOV30H,#00LP2: MOVA,30HﻩMOVCA,@A+DPTRﻩINC30H CJNEA,#254,XIANSHI_GEMING SJMPC1XIANSHI_GEMING:MOVP1,ALCALLWRITE_1602ﻩ SJMPLP2C1:ﻩ MOVP1,#0C0H;歌词显示地址ﻩ LCALLENABLELP3: ﻩMOVA,30HMOVCA,@A+DPTR;取音符码ﻩﻩCJNEA,#0FFH,C6ﻩ SJMPS0C6:ﻩﻩCJNEA,#42,C0;音符码为休止符不开定时器,直接调用延时INC30H MOVA,30Hﻩ MOVCA,@A+DPTR INC30HﻩﻩMOV35H,ALP12:LCALLDELAY_100MSDJNZ35H,LP12 ﻩSJMPLP3C0: ﻩMOV36H,Aﻩ INC30HﻩﻩMOVA,30H MOVCA,@A+DPTRﻩ MOV35H,A ﻩINC30HﻩﻩLCALLBOFANG_YF_1ﻩﻩSJMPLP3S0:ﻩﻩRET;============播放一录音并显示歌名和歌词=============;-———--(一个音符2字节存储,音符码存低字节,节拍存高字节;254为歌曲名结束标志,255为歌曲结束标志)—-—---—---BOFANG_LUYIN:MOVP1,#0C0H;歌名显示地址LCALLENABLELP4:ﻩMOVA,@R1ﻩINCR1ﻩCJNEA,#254,XIANSHI_LUYINﻩSJMPC2XIANSHI_LUYIN:MOVP1,ALCALLWRITE_1602ﻩ SJMPLP4C2: MOVP1,#0C0H;歌词显示地址ﻩﻩLCALLENABLELP5:ﻩMOVA,@R1;取音符码ﻩ CJNEA,#255,C3 ﻩSJMPS2C3: CJNEA,#42,C4;音符码为休止符不开定时器,直接调用延时INCR1ﻩ MOVA,@R1 ﻩMOV35H,A ﻩINCR1LP6:LCALLDELAY_100MSDJNZ35H,LP6ﻩ SJMPLP5C4:MOV36H,A ﻩINCR1 ﻩMOVA,@R1ﻩﻩMOV35H,A INCR1ﻩﻩLCALLBOFANG_YF_1ﻩ SJMPLP5S2: ﻩRET;============存音符子程序==============CUNCU:CJNER1,#0F0H,CUNCU_1MOV@R1,#255SJMPS1;满160字节不存储CUNCU_1:MOV@R1,36HINCR1MOV@R1,35HINCR1S1:RET;=========延时100ms(12M晶振)========DELAY_100MS:MOV31H,R6MOV32H,R7MOVR7,#200D1:MOVR6,#250DJNZR6,$DJNZR7,D1MOVR7,32HMOVR6,31HRET;====延时10MS(12MHz晶振)====DELAY_10MS:MOV31H,R6MOV32H,R7MOVR6,#20D0:MOVR7,#248DJNZR7,$DJNZR6,D0MOVR7,32HMOVR6,31HRET;======延时2MS(12M晶振)========DELAY_2MS:MOV31H,R6MOV32H,R7MOVR7,#4D3:MOVR6,#255D4:DJNZR6,D4DJNZR7,D3MOVR7,32HMOVR6,31HRET;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!MUSIc0:MOV3DH,R2MOV3EH,R3MOVTH1,#0FFHMOVTL1,#0FFH;表头地址送DPTRMOV3CH,#00H;中断计数器清0MOVB,#00H;表序号清0MUSIC1:NOPCLRAM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论