点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87848430?spm=1001.2014.3001.5503
基于AT89C51单片机的电子琴设计与仿真-LMLPHP

源码获取
主要内容:
设计一个简易的电子琴,至少具有可以弹奏并发出不同的音调。电子琴方案主要分为实验的系统分析,具体的实施方案,以及最终的实验检验,最终完成实验设计。
基本要求:
1、认真完成系统需求分析,明确数据要求和处理要求;
2、设计出系统的概念模型,画出系统流程图;
3、系统的分析实验的步骤与流程;
4、序中字符和权值是可变的,实现程序的灵活性,检查小程序可行性

主要参考资料:
[1]谢维成 、杨加国.单片机原理与应用及 C51 程序设计实例. 电子工业出版社 , 2006年3月 .
[2]李广弟. 单片机基础.北京航空航天大学出版社,2007年5月 .
[3]魏立峰.单片机原理及应用技术.北京大学出版社,2005年
[4]局润景.Proteus 在MCS-51& ARM7系统中的应用百例 .第一版.北京,电子工业版社,2006年 .

一、系统概述
1.1背景与意义
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用AT89C51单片机为核心控制元件,设计一个电子琴和音乐发生器双功能。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。

1.2设计内容
本设计主要是用单片机为核心控制元件,设计一台电子琴。以单片机作为主控核心,与键盘、蜂鸣器、数码管等模块组成核心主控制模块,在主控模块上设有16个按键和1个复位按键。本系统主要是完成的功能:电子琴弹奏并显示所按的按键对应音的唱名。关于声音的处理,使用单片机C语言,利用定时器来控制频率,而每个音符的符号只是存在自定义的表中。总之,本设计 的电子琴有以下要求:
(1)用键盘作出电子琴的按键,共16个,每键代表1个音符。各音符按照符合电. 子琴的按键顺序排列;
(2)达到电子琴的基本功能,可以用弹奏出简单的乐曲;
(3)在按下按键发出音符的同时显示出音符所对应的唱名即1(dao)、2(ruai)、3(mi)、4(fa)。

二、系统概述
2.1问题分析及解决思路
本系统采用AT89C51为主控芯片,因其精度较高,操作比较灵活,输入电路和输出电路由芯片来进行处理,电路的系统的稳定性高,功耗小。其中,输入电路有16个独立按键,通过按键随意按下所要表达的音符,作为电平送给主体电路,中央处理器通过识别,解码输出音符,在蜂鸣器中发出有效的声音。由于需要显示的信息不多,显示电路未采用液晶屏显示,而是使用数码管显示电路负责显示按下的琴键所对应音符的唱名,这样既节省了成本,又降低了编程难度。

                 图2-1  基础电路图

如图所示基于单片机AT89C51的电子琴电路,它主要由琴键控制电路、数码管显示电路、音频功放电路和时钟-复位电路四部分所构成。
2.2 硬件设计
2.2.1 琴键控制电路
琴键控制电路作为人机联系的输入部分,也是间接控制数码显示和音频功放的重要组成部分。本设计采用独立式键盘的思路。
独立式键盘的特点是一键一线,各键相互独立,每个键各接一条I/0口线,通过检测I/0输入线的电平状态,可判断出被按下的按键。显而易见,这样电路简单,各条检测线独立,识别按下按键的软件编写简单。适用于键盘按键数目较少的场合,不适用于键盘按键数目较多的场合,因为将占用较多的I/0口线。
独立式键盘的16个独立按键分别对应一个 I/0口线,当某一按键按下时,对应的检测线就变成了低电平,与其它按键相连的检测线仍为高电平,只需读入I/0输入线的状态,判别哪一条I/0输入线为低电平,很容易识别哪个键被按下。

2.2.2 数码管显示电路
LED (Light Emitting Diode)为发光二极管缩写。LED 数码管是由发光二极管构成的。常见的LED数码管为“8”字型的,共计8段。它由七个条形发光二极管和一-个小圆点发光二极管组成,每一段对应-一个发光二极管。一般来说分共阳极和共阴极两种接法,如图二所示为八段LED数码管结构及外形。

共阳极LED数码管的发光二极管的阳极连接在一-起,公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。反之,共阴极发光二极管的阴极连在一-起,通常公共阴极接地。当阳极为高电平时,发光二极管点亮。如图2-2所示的为数码管。

图2-2 数码管
LED数码管的a至g七个发光二极管因接得电压不同而导致不同亮暗的组合就能形成不同的字形,这种组合称之为字形码。如表2-3所示为八段LED数码管的字形码表。
显示字符 共阴极 共阳极 显示字符 共阴极 共阳极
0 3FH C0H b 7CH 83H
1 06H F9H c 39H C6H
2 58H A4H d 5EH A1H
3 4FH B0H E 79H 86H
4 66H 99H F 71H 8EH
5 6DH 92H H 76H 89H
6 7DH 82H L 348H C7H
7 07H F8H P 73H 8CH
8 7FH 80H U 3EH C1H
9 67H 90H
表2-1八段LED数码管的字形码表
2.2.3 音频功放电路
本设计采用蜂鸣器作为音频发生的设备,而若将蜂鸣器的正极直接与单片机端口相连,由于单片机端口的电流值太小而无法驱动蜂鸣器发声,所以本设计采用三极管放大电流的方法来完成目的的,
2.2.4 时钟
时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式,一种是内部时钟方式,另- -种 是外部时钟方式。
AT89C51内部有一个用于构成振荡器的高增益反相放大器,输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容, 构成一个稳定的自激振荡器,图2-3是AT89C51内部时钟方式的电路,C1和C2构成一个稳定的自激振荡器,图2-3是AT89C51内部时钟方式的电路,C1和C2时钟方式做时钟电路

图2-3AT89C51内部时钟方式的电路

2.2.5复位电路
初始化操作,给复位脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就使AT89C51复位。这些操作都是由复位电路来实现。在单片机的实用系统中,一般有两种复位操作形式:上电 复位和手动复位。上电复位在单片机系统每次通电时执行。上电时,电容C充电加给RST引脚-一个短的高电平信号,此信号随着VCC对电容C的充电过程而逐渐回落,即RST引短的高电平信号,此信号随着VCC对电容C的充电过程而逐渐回落,即RST引脚上的高电平必须维持足够长的时间。手动复位在系统出现操作错误或程序运行出错时使用。在单片机系统运行过程中,按下复位键,高电平输入RST引脚,单片机被强制执行复位操作,系统可以退出错误运行状态,恢复正常工作。

2.3 软件设计
2.3.1硬件接口定义
引脚名 接口说明
P0.0-P0.7 数码管与单片机通信口
P1.0-P1.7 独立按钮接口
P3.3 控制蜂鸣箱
2.3.2发声原理
若要产生音频脉冲,只要算出某- - 音频的周期(1/频率),再将此周期除以若要产生音频脉冲,只要算出某- - 音频的周期(1/频率),再将此周期除以相,然后重复计时再反相。就可在P1. 0引脚上得到此频率的脉冲。利用AT89C51的内部定时器使其工作计数器模式(MODE1) 下,改变计数值THO及TLO以产生不同频率的方法产生不同音阶。
例如,频率为523Hz,其周期T= 1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将1/0反相,就可得到中音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+2+fr= 65536-/fr,中音DO的T= 65536 /523= 64580。

三、系统流程
3.1主函数运用模块化
流程如图所示:

3.2初始函数
流程图如下图所示,该函数对所需的I/0口、定时器0以及数码管蜂鸣器进行初始化配置。

3.3音频处理及数码管显示

四、Keil代码

#include<reg51.h>
sbit p26=P2^6;
char num;
unsigned int yin[16]={
64103,64260,64400,64528,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};
void t0zd() interrupt 1
{	TH0=yin[num]/256;
	TL0=yin[num]%256;
	p26=!p26;
}
char anjian()
{	char lie,hang,hao;
	P1=0xf0;
	lie=P1;
	P1=0x0f;
	hang=P1;
	hao=lie|hang;
	switch(hao)
		{	case 0xee:num = 0;break;
  			case 0xde:num = 1;break; 
  			case 0xbe:num = 2;break;
  			case 0x7e:num = 3;break;
 			case 0xed:num = 4;break;
  			case 0xdd:num = 5;break;
  			case 0xbd:num = 6;break;
  			case 0x7d:num = 7;break;
 			case 0xeb:num = 8;break;
 			case 0xdb:num = 9;break;
  			case 0xbb:num = 10;break;
  			case 0x7b:num = 11;break;
  			case 0xe7:num = 12;break;
  			case 0xd7:num = 13;break;
  			case 0xb7:num = 14;break;
  			case 0x77:num = 15;break;
  			default:num=0xff;break;
		}
    return num;
}
void main()
{	char i;
	EA=1;
	ET0=1;
	TMOD=0x01;
	while(1)
	{	num=anjian();
		P3=num;
		if(P3==0xff)TR0=0;
		else TR0=1;
	}
}

五、实验设计图
基于AT89C51单片机的电子琴设计与仿真-LMLPHP

六、总结
经过一段时间的努力,课程设计——以单片机为核心的电子琴基本完成。但设计中的不足之处仍然存在,这次设计是我第一次设计电路,并用Proteus 实现了仿真。在这过程中,我对电路设计、单片机的使用等都有了新的认识,通过这次设计学会了Proteus和Keil软件的使用方法,掌握了从系统的需要、方案的设计、功能模块的划分、原理图的设计和电路图仿真的设计积累了不少经验。
通过本次设计,我对单片机这门课有了进一步的了解,无论是在硬件连接方面还是在软件编程方面,本次设计采用了AT 89C 51单片机芯片,与以往的单片机相比增加了许多新的功能,使其功能更为完善,应用领域也更为广泛,通过这次设计,对它的工作原理有了更深的理解。在调试过程中遇到很多问题,硬件上的理论知识学得不够扎实,对电路的仿真方面也不够熟练。
总之这次电路的设计和仿真,基本上达到了设计的功能要求,在以后的实践中,我将继续努力学习相关方面方面的理论知识,并理论联系实际,对我有很大的提升。

七、参考文献
[1]谢维成 、杨加国.单片机原理与应用及 C51 程序设计实例. 电子工业出版社 , 2006年3月 .
[2]李广弟. 单片机基础.北京航空航天大学出版社,2007年5月 .
[3]魏立峰.单片机原理及应用技术.北京大学出版社,2005年
[4]局润景.Proteus 在MCS-51& ARM7系统中的应用百例 .第一版.北京,电子工业版社,2006年 .

课程设计评定表
评定项目 内 容 满分 评分 总分
学习态度 学习认真,态度端正,遵守纪律。 10
设计情况 认真查阅资料,勤学好问,提出的问题有一定的深度,分析解决问题的能力较强。 40
说明书质量 设计方案正确、表达清楚;设计思路、实验(论证)方法科学合理;达到课程设计任务书规定的要求;图、表、文字表达准确规范,上交及时。 40
回答问题情况 回答问题准确,基本概念清楚,有理有据,有一定深度。 10
总成绩 采用五级分制:优、良、中、及格、不及
指导教师评语:

签名:
年 月 日

06-01 04:42