单片机的电子琴设计.docx
- 文档编号:6030412
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:18
- 大小:241.93KB
单片机的电子琴设计.docx
《单片机的电子琴设计.docx》由会员分享,可在线阅读,更多相关《单片机的电子琴设计.docx(18页珍藏版)》请在冰豆网上搜索。
单片机的电子琴设计
1概述4
1.1选择电子琴设计的原因4
1.2AT89S52的强大功能4
1.3电子琴所能完成的功能5
2系统总体方案及硬件设计6
2.1本系统设计内容6
2.2电子琴的发生原理以及如何改变音色的基本原理6
2.3系统组成7
2.4系统总体方案8
2.5系统硬件设计9
3软件设计11
3.1本系统的软件流程图11
3.2键盘扫描程序11
3.3功能转移程序11
3.4琴键处理程序12
3.5自动播放歌曲程序:
12
4实验仿真13
5课程设计体会14
参考文献15
附1:
源程序代码16
附2:
系统原理图23
1概述
1.1选择电子琴设计的原因
首先是始于对电子琴的好奇,用自己所学的单片机知识来完成自己喜欢的东西,能够给自己很大的制作与学习动力。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器,它在现代音乐扮演着重要的角色。
同时又由于自己对音乐的喜欢,利用所学知识让单片机能够播放自己喜欢的音乐。
音乐是用艺术家用音符记录世界,传达情感的一种艺术形式,音乐里有一种和谐之美,听音乐可以让人心情舒畅,与外界和谐统一。
音乐现在已经成为我生活中很重要的一部分。
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
本系统是简易电子琴的设计,按下键盘中的按键会使数码管显示当前按键,扬声器播放对应的音符。
通过设计本系统可了解单片机的基本功能,同时对单片机有更深的认识。
1.2AT89S52的强大功能
(1)与MCS-51单片机产品兼容;
(2)8K字节在系统可编程Flash存储器;
(3)1000次擦写周期;
(4)全静态操作:
0Hz-33MHz;
(5)三级加密程序存储器;
(6)32个可编程I/O口线;
(7)三个16位定时器/计数器;
(8)六个中断源;
(9)全双工UART串行通道;
(10)低功耗空闲和掉电模式;
(11)掉电后中断可唤醒;
(12)看门狗定时器;
(13)双数据指针;
(14)掉电标识符
1.3电子琴所能完成的功能
(1)能够实现基本的琴键功能
即每按下一个琴键,单片机能够检测到键盘的按键,并根据按键的位置,通过程序来控制,使蜂鸣器发出不同频率(音调)的声音,声音延迟一段时间后停止。
然后再继续扫描,看是否有键按下,如此循环下去,即可实现基本的琴键功能。
(2)能够实现数码管显示按键
每按下一个按键时,单片机能够检测到所按下地按键,然后根据按键的位置通过程序控制来实现在数码管中显示相应按键。
同时可根据高、中、低音控制键的按下位置,通过程序控制在4位数码管中显示出相应的0、1、2。
以此来标明是高、中、低音。
(3)能够实现连续播放一首音乐
在键盘上设置一个功能键,按下之后会根据功能键跳转到自动播放歌曲的程序,来连续播放相应的歌曲。
2系统总体方案及硬件设计
2.1本系统设计内容
(1)独立式键盘识别。
即独立式按键扫描,显示当前按键。
(2)不同频率音符播放。
可以通过按键控制21种发音。
(3)可在按下特殊按键时连续播放一首音乐。
2.2电子琴的发生原理以及如何改变音色的基本原理
声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断输出高、低电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制高、低电平的持续时间,就能改变输出波形的频率从而改变音调。
乐曲中,每一音符对应着确定的频率,下表给出各音符频率。
如果单片机某个口线输出高、低电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。
本系统就是根据此原理设计,对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率。
单片机内部有两个位的定时计数器T1和T0,单片机的定时计数器实际上是个计数装置它既可以对单片机的内部晶振驱动时钟计数也可以对外部输入的脉冲计数,对内部晶振计数时称为定时器,对外部时钟计数时称为计数器。
当对单片机的内部晶振驱动时钟计数时,每个机器周期定时计数器的计数值就加,当计数值达到计数最大值时计数完毕并通知单片机的尸比对外部输入的时钟信号计数时,外部时钟的每个时钟上升沿定时计数器的计数值就加,当计数值达到计数最大值时计数完毕并通知单片机。
因此,如果知道单片机的机器周期或者外部输入时钟信号的周期单片机就可以根据定时器的计数值计算出定时的时间。
用此方法定时十分准确,想得到多大的延时时间就可以给定时器赋一定的计数初值,定时器从预先设置的计数初值开始不断增当增加到计数最大值时计数完毕,调整计数初值的大小就可以调整定时器定时的时间,从而达到准确的延时。
计数脉冲值与频率的关系式是:
N=fi÷2÷fr
式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。
组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。
目前微机系统中使用的键盘按其功能不同,通常可分为编码键盘和非编码键盘两种基本类型。
编码键盘:
键盘本身带有实现接口主要功能所需的硬件电路。
不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII码)送往CPU。
所以,编码键盘接口简单、使用方便。
但由于硬件电路较复杂,因而价格较贵。
非编码键盘:
键盘只简单地提供按键开关的行列矩阵。
有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。
目前微机系统中,一般为了降低成本大多数采用非编码键盘。
键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。
2.3系统组成
本系统主要以AT89S52单片机为主控核心,与键盘、扬声器、LED显示管模块一起组合而成。
具体如下:
2.4系统总体方案
2.5系统硬件设计
(1)LED显示模块
LED显示模块如下图所示,利用AT89S52单片机的P2端口的P2.0-P2.7连接到一个4位数码管5461AS的A-G及DP的笔段上,数码管的公共端1-4接地。
按键扫描显示当前按键模块如下:
(2)扬声器发声模块及音乐播放模块
(3)独立式键盘模块
(4)高中低音调节模块
3软件设计
3.1本系统的软件流程图
3.2键盘扫描程序
检测是否有键按下,有键按下则记录按下键的键值,并跳转至功能转移程序;无键按下,则返回键盘扫描程序继续检测
3.3功能转移程序
对检测到得按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即按键发音功能和自动播放音乐功能
3.4琴键处理程序
根据检测到得按键值,查询音律表,给计时器赋值,使发出相应频率的声音
3.5自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放好的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有键按下。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。
利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
4实验仿真
本次课程设计使用的仿真软件是PROTEUS,其功能强大,实用性强,容易使用。
以下为PROTEUS的仿真电路总图:
5课程设计体会
通过这次课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
经过长时间的设计及调试,本系统基本能实现按下键盘中相应的按键时会使数码管显示当前按键,扬声器播放对应的音符。
当按下音乐播放按键时,可以通过扬声器循环播放出已经存储的音乐但由于发声器是原因,本设计音频效果不是很好。
另外一个未能解决的问题是,当按下相应按键时部分按键的按键指示灯不能正常熄灭,而且播放音符时伴有一定的杂音。
我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。
基本了解了电子产品的开发流程和所要做的工作。
基本掌握了proteus仿真的方法。
通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。
并且我学会了分析问题解决问题的能力,加深了对所学理论知识的理解和运用。
我的动手能力得到了很大的提高,创新意识得到了锻炼。
总的来说这次的课程设计收获还是很大的,刚拿到课程设计要求时感觉自己什么也不会,真得用心去做时才发现自己的单片机知识也并不是零,还是有一定基础的。
经过课程设计使自己对单片机知识有了进一步的掌握,对模电知识也有了很好的回顾。
当然也反应出了自己很多地方的不足,单片机基础知识还有待进一步提高,C语言编程也应该再去用心回顾下,模电学习的也不是很牢靠,总之自己还有很多的不足之处,还就再接再励提高自己的综合能力。
参考文献
[1]郭天祥.单片机学习资料.机械电子工业出版社,2007
[2]马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2006
[3]余发山等.单片机原理及应用技术.中国矿业大学出版社,2008
[4]谭浩强.C语言程序设计(第三版).清华大学出版社,2005
[5]艾永乐等.模拟电子技术基础.中国电力出版社,2008
[6]尹文庆等.数字电子技术基础.中国电力出版社,2008
[7]喻杨杨.安徽财经大学信息工程学院本科毕业设计,2010.10
附1:
源程序代码
#include
#defineucharunsignedchar
voidRun(void);
voidKeyScan(void);
voidPlayKey(void);
voiddelay_1ms(uchari);
voidPlayMusic(void);
voidDisPlay(void);
sbitBeep=P3^7;
ucharTh0,Tl0;//TH0,TL0
ucharflag=0xff;//模式,0表示音乐,ff表示按键
ucharkey=0;//按键代号
uchara;
uchargaodi=0;
//音乐音符
ucharcodeMusicCode[]={0XFc,0X44,0XFc,0Xac,0XFd,0X09,0XFd,0X34,
0XFD,0X82,0XFD,0Xc8,0XFD,0X06,0XFb,0X04,
0Xfb,0X90,0Xfc,0X0c,0Xfe,0X22,0Xf9,0X5b,0Xfa,0x15
};
//月亮代表我的心
ucharcodeMusic[]={
0X02,0X82,
0X16,0X32,0X54,0X02,0X52,
0XA6,0X32,0X54,0X02,0X52,
0X64,0X74,0XB6,0X64,
0X52,0X5C,0X32,0X22,
0X16,0X12,0X14,0X32,0X22,
0X16,0X12,0X14,0X22,0X32,
0X26,0X12,0X94,0X22,0X32,
0X2C,
0X32,0X52,
0X36,0X22,0X14,0X54,
0XAC,0X92,0XA2,
0X96,0X0A2,0X96,0X82,
0X3C,0X54,
0X36,0X22,0X14,0X54,
0XAC,0X92,0XA2,
0X16,0X12,0X14,0X22,0X32,
0X2C,0X02,0X82,
0X16,0X32,0X56,0X12,
0XA6,0X32,0X56,0X52,
0X66,0X72,0XB6,0X62,
0X62,0X52,0X58,0X32,0X22,
0X16,0X12,0X14,0X32,0X22,
0X16,0X12,0X14,0X22,0X32,
0X26,0X92,0XA4,0X12,0X22,
0X1C,
0XFF};
//按键音符
ucharcodeKeyCode[]={0XFF,0XFF,
0xF8,0x8B,0xF9,0x5B,0xFA,0x14,0xFA,0x66,0xFB,0x03,0xFB,0x8F,0xFC,0x0B,//低音
0xFC,0x43,0xFC,0xAB,0xFD,0x08,0xFD,0x33,0xFD,0x81,0xFD,0xC7,0xFE,0x05,//中音
0xFE,0x21,0xFE,0x55,0xFE,0x84,0xFE,0X99,0XFE,0xC0,0xFE,0xE3,0xFF,0x02,//高音};
voidmain(void)
{
P1=0XFF;//初始化
P0=0XFF;
P2=0;
TMOD=0X01;
IT0=1;
TR0=0;
EX0=1;
ET0=1;
EA=1;
while
(1)
{
KeyScan();//按键扫描
Run();//运行
DisPlay();//显示
}
}
voidRun(void)//运行
{
if(flag==0)
PlayMusic();
else
PlayKey();
}
voidKeyScan(void)//按键扫描
{
if(P1==0XFE)//第一按键按下
{
delay_1ms(12);//延时12MS
if(P1==0XFE)//确定按下
{key=1;
a=key;}
}
elseif(P1==0XFD)
{
delay_1ms(12);
if(P1==0XFD)
{key=2;
a=key;}
}
elseif(P1==0XFB)
{
delay_1ms(12);
if(P1==0XFB)
{key=3;
a=key;}
}
elseif(P1==0XF7)
{
delay_1ms(12);
if(P1==0XF7)
{key=4;
a=key;}
}
elseif(P1==0XEF)
{
delay_1ms(12);
if(P1==0XEF)
{key=5;
a=key;}
}
elseif(P1==0XDF)
{
delay_1ms(12);
if(P1==0XDF)
{key=6;
a=key;}
}
elseif(P1==0XBF)
{
delay_1ms(12);
if(P1==0XBF)
{key=7;
a=key;}
}
elseif(P0==0XFE)//低音模式键按下
{
delay_1ms(12);
if(P0==0XFE)
{gaodi=0;
a=gaodi;}
}
elseif(P0==0XFD)//中音模式键按下
{
delay_1ms(12);
if(P0==0XFD)
{gaodi=1;
a=gaodi;}
}
elseif(P0==0XFB)//高音模式键按下
{
delay_1ms(12);
if(P0==0XFB)
{gaodi=2;
a=gaodi;}
}
else
return;
}
voidPlayKey(void)//响应按键
{
if(key==0)
return;
else
{
Th0=KeyCode[gaodi*14+key*2];
Tl0=KeyCode[gaodi*14+key*2+1];
TR0=1;
delay_1ms(187);
TR0=0;
key=0;
}
}
time0()interrupt1//定时器0中断
{
TH0=Th0;
TL0=Tl0;
Beep=~Beep;
}
voidinterrupt0()interrupt0//外部中断0
{
flag=~flag;
if(flag==0)
{
a=8;
P2=0;
}
}
voiddelay_1ms(uchari)//延时
{
ucharj,k;
for(j=0;j
for(k=0;k<148;k++)
;
}
voidPlayMusic(void)//播放音乐
{
ucharyinfu,jiepai;
uchari,j;
for(i=0;Music[i]!
=0XFF;i++)
{
yinfu=(Music[i]>>4);
jiepai=(Music[i]&0X0F);
if(yinfu==0)
continue;
Th0=MusicCode[(yinfu-1)*2];
Tl0=MusicCode[(yinfu-1)*2+1];
TR0=1;
for(j=jiepai;j>0;--j)
{
delay_1ms(250);
}
TR0=0;
if(flag!
=0)
break;
}
}
voidDisPlay(void)//显示
{
switch(a)
{
case0:
P2=0X3F;break;
case1:
P2=0X06;break;
case2:
P2=0X5B;break;
case3:
P2=0X4F;break;
case4:
P2=0X66;break;
case5:
P2=0X6D;break;
case6:
P2=0X7D;break;
case7:
P2=0X07;break;
default:
P2=0X00;break;
}
}
附2:
系统原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子琴 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)