基于单片机的电子琴设计.docx
《基于单片机的电子琴设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子琴设计.docx(19页珍藏版)》请在冰豆网上搜索。
基于单片机的电子琴设计
基于单片机的电子琴设计
【摘要】电子琴是现代电子科技与音乐结合的产物。
电子琴是一种新型的键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响.由音色,自动伴奏,自动和弦三大部分组成.它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89C52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有9个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
单片机,键盘,扬声器,电子琴
【Abstract】:
Electronicorganisamodernelectronicmusictechnologyandtheproductisanewtypeofkeyboardinstruments.Itplayedanimportantroleinmodernmusic.SCMhaspowerfulcontrolfunctionsandflexibleprogrammingcharacteristics.Ithasconvergedwithmodernpeople'slives,becomeanirreplaceablepart.ThemaincontentisAT89C52controlofthecorecomponents,designofaelectronicorgan.SCMasahosttothecore,withthekeyboard,speakerandothercoremodules.Inthemaincontrolmodulehas9keysandaspeaker.Thesystemissteady,itssimplehardwarecircuits,softwarefunctions,reliabilityofcontrolsystemandhighcostperformanceisitsadvantages.Italsohascertainpracticalandreferencevalue.
Keywords:
SCMkeyboardspeakerelectronicorgan
第一章绪论
1.1电子琴的研究背景
在电子音乐领域,自从20世纪末期MIDI(乐器数字化接口)推出和逐步规范化后,各种乐器及众多数码音视频产品中采用MIDI技术已逐渐成为一种潮流。
但是当前各厂商的电子琴产品通常使用自己设计的专用音源,并且软硬件均不对外公开,阻碍了MIDI技术的交流。
作者在开发基于MIDI模块的音乐发生器的过程中,进行了用单片机控制通用MIDI音源模块的相关功能制作电子琴的实践,制作出具有8个按键的MIDI电子琴,该琴支持单音和复音弹奏,单片机以标准的MIDI波特率传送信息,通过串口连接蜂鸣器,从而获得优美的乐音。
1.2电子琴的现状及前景
键盘乐器,采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响。
发音音量可以自由调节。
音域较宽,和声丰富,甚至可以演奏出一个管弦乐队的效果,表现力极其丰富。
它还可模仿多种音色,甚至可以奏出常规乐器所无法发出的声音(如人声,风雨声等)。
另外,电子琴在独奏时,还可随意配上类似打击乐音响的节拍伴奏,适合于演奏节奏性较强的现代音乐。
另外,电子琴还安装有混响、回声、延长音、震音和颤音等多项功能装置,表达各种情绪时运用自如。
电子琴是电声乐队的中坚力量,常用于独奏主旋律并伴以丰富的和声。
还常作为独奏乐器出现,具有鲜明时代特色。
但电子琴的局限性也十分明显:
旋律与和声缺乏音量变化,过于协和、单一;在模仿各类管、弦乐器时,音色还不够逼真,模仿提琴类乐器的音色时,失真度更大,还需要不断改进。
电子琴的演奏有较大一部分是通过自动和弦伴奏来配合完成的,在音乐中和弦的连接推动了旋律地进行,不同的和声连接,形成了不同的音乐色彩。
第二章总设计方案
2.1系统框图
本次设计音乐电子琴主要以AT89C52为核心,同时包含了按键电路,晶振电路复位电路,及采用三极管放大,扬声器(喇叭)播放,下面是本次设计的主要框图如图2.1:
图2.1系统框图
2.2模拟电子琴音乐键的设计说明
音节是由不同的频率的方波产生,音节与频率的关系。
方波的频率由定时器控制,定时器溢出后,产生中断,将P1.0接口取反即得周期方波,每个音节相应的定时器初值X可按下法计算:
(1/2)*(1/f)=(12/fosc)*(216-X)
即X=216-(fosc/24f)
当晶振fosc=11.0592时,音节1相应的定时器初值为X,则可得X=63777D=F921H,其他的可同样求取。
音节的节拍由延时子程序来实现。
延时子程序实现基本延时时间,节拍值只能是它的整倍数。
2.3音乐控制方案
本系统主要完成世上只有妈妈好的播放功能,因此用定时器T1中断方式产生200ms基准时间,再根据音乐的音拍的时间的长短对基准时间用软件计时。
可以用查表方式取得计数参数,计时到后将播放子程序地址送DPTR,转入播放子程序。
(1)若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。
(2)利用AT89C52的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为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)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65059
C调各音符频率与计数初值T对照如表2.1所示。
表2.1简谱码对应的T值
简谱
发音
简谱码
T值
3
低音M
1
64021
4
低音FA
2
64103
5
低音SO
3
64260
6
低音LA
4
64400
7
低音TI
5
64524
1
中音DO
6
64580
2
中音RE
7
64684
3
中音MI
8
64777
4
中音FA
9
64820
5
中音SO
A
64898
6
中音LA
B
64968
7
中音TI
C
65030
i
高音DO
D
65059
2
高音RE
E
65110
3
高音MI
F
65157
不发音
0
65110
下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
TABLE1:
DB64260,64400,64524,64580
DB64684,64777,64820,64898
DB64968,65030,65058,65110
DB65157,65178,65217
(3)音乐的音拍,一个节拍为单位(C调)如表2.2所示。
表2.2各调1/4节拍的时间设定
曲调值
DELAY
曲调值
DELAY
调4/4
125ms
调4/4
62ms
调3/4
187ms
调3/4
94ms
调2/4
250ms
调2/4
125ms
第三章硬件设计
3.1电子琴的电路原理
此次设计的是一个9按键的音乐电子程序,我们由电路的框图而知,按键P1.0-P1.7分别模拟音乐电子琴的7个按键和P3.4为功能键,P2.1通过一个音频放大器接到一个喇叭上,P3.4键模拟音乐电子琴的控制键。
我们可以通过判别按下控制键P3.4的次数来判别是可以按电子琴的8个按键还是播放音乐,比如,当我们按下控制键的次数为奇次,这时我们可以分别按下P1.0-P1.7键,这样就可以清楚的听到从喇叭处发出的DO、RE、MI、FA、SO、LA、XI、DO(中)8个不同的音调,当按下P3.4键的次数为2次,这时单片机内部程序就会自动转到音乐程序处顺序播放出好听的世上只有妈妈好。
我们如果再按下模拟键盘时不会发出任何的声音,同理,当我们再次按下控制键P3.4,此时它为1次,音乐的程序就会关闭,转去执行模拟键盘的程序。
如此重复,就会达到设计所提出的要求。
3.2AT89C52单片机的简介
AT89C52是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89C52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89C52具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
3.3AT89C52单片机的附属电路
(1)振荡电路
石英晶体振荡器也称石英晶体谐振器,它用来稳定频率和选择频率,是一种可以取代LC谐振回路的晶体谐振元件。
本设计所用的晶体振荡电路如图3.0所示。
图3.1晶体振荡电路
此晶振电路所选用的石英晶振频率为12MHZ。
时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是(1/12us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。
对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。
由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。
显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。
但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。
设计中使用到的单片机的时钟范围是12MHz或11.0592MHz。
(2)复位电路
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位,所以必须弄清楚AT89C52型单片机复位的条件、复位电路和复位后状态。
单片机复位的条件是:
必须使RST/Vpd或RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。
例如,若时钟频率为12MHz,每机器周期为1us,则只需2us以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。
单片机常用的复位电路如图3.2所示。
图3.2上电复位电路
图3.1为上电复位电路也是本次设计所用的复位电路,其复位方法为只要单片机一上电REST为高电平单片机即复位。
除此之外我们所学的电路还有手动复位电路和自动复位电路。
3.4电原理图
3.4.1单片机电路
本课题设计的电子琴的单片机应用电路如图3-3所示:
图3.3STC89C52单片机电路
3.4.2显示电路
图3.4LCD1602液晶显示
1602引脚功能介绍:
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VCC接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端,高电平
(1)时读取信息,负跳变时执行指令。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
3.4.3按键电路
在单片机应用系统中,有时只需要几个简单的按键向系统输入信息。
这时,可将每个按键接在一根I/O接口线上,这种方式的连接称为独立式键盘。
每个独立式按键单独占有一根I/O接口线,每根I/O接口线的工作状态不会影响到其他I/O接口线。
这种按键接口电路配置灵活,硬件结构简单,但每个按键必须占用一根I/O接口线,I/O接口线浪费较大。
本次设计只需要8个独立式按键就可以实现。
因此,本次设计按键电路采用独立式键盘按键电路,如图3.4所示
图3.5按键电路
在此电路中,按键输入都采用低电平有效。
上拉电阻保证了按键断开时,I/O接口线有确定的高电平。
当I/O接口内部有上拉电阻时,外电路可以不配置上拉电阻。
独立式键盘的编程:
独立式键盘的编程常采用查询式结构。
先逐位查询每根I/O接口线的输入状态,如某一根I/O接口线输入为低电平,则可确定该I/O接口线所对应的按键以按下,然后,再转向按键的功能处理程序。
在本次设计中我使用P1.0~P1.7接按键,P1.0-P2.7按键分别接8个电子琴的键盘,P3.4为控制按键,判断按它的次数是奇次还是偶次来分别调用电子琴键盘或音乐。
3.4.4电源电路
本设计采用USB接口供电。
同时,USB接口通过转换电路对单片机进行程序编写。
其电路原理如图所示。
图3.6电源电路
第四章软件编程
4.1软件流程图
主程序主要包含对定时器T0、和T1的初始化,及重复调用其它的子程序来工作的。
其程序的流程图如图4.1:
图4.1主程序流程图图4.2T0中断程序流程图
中断程序是在判断完按键并且有键按下之后关闭T0,将P1.0取反,从而形成一个正脉冲驱动扬声器发音。
如图4.2所示。
4.2主程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineKeyPortP1
#definecomm0
#definedat1
ucharHigh,Low;//定时器预装值的高8位和低8位
sbitSPK=P2^1;//定义喇叭接口
sbittab=P3^4;//功能键
sbitRS=P2^5;//液晶数据命令选择
sbitRW=P2^6;//液晶读写选择
sbitEN=P2^7;//液晶使能端
ucharcodefreq[][2]={
0xD8,0xF7,//00440HZ1
0xBD,0xF8,//00494HZ2
0x87,0xF9,//00554HZ3
0xE4,0xF9,//00587HZ4
0x90,0xFA,//00659HZ5
0x29,0xFB,//00740HZ6
0xB1,0xFB,//00831HZ7
0xEF,0xFB,//00880HZ`1
};
ucharTime;
ucharcodeYINFU[9][1]={{''},{'1'},{'2'},{'3'},{'4'},{'5'},{'6'},{'7'},{'8'}};
//世上只有妈妈好数据表
ucharcodeMUSIC[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
//音阶频率表高八位
ucharcodeFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
//音阶频率表低八位
ucharcodeFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
ucharcodedis1[2][10]={"ELECTRONIC","ORGAN"};
voidInit_Timer0(void);//定时器初始化
voiddelay2xus(ucharz)
{
while(z--);
}
voiddelayms(ucharx)
{
while(x--)
{
delay2xus(245);
delay2xus(245);
}
}
voidlcd_wr(ucharcomm_dat,ucharxdat)
{
RS=comm_dat;
RW=0;
delay2xus(10);
P0=xdat;
EN=1;
delayms
(1);
EN=0;
}
voidlcd_string(ucharadd,ucharmun,uchar*pstring)
{
lcd_wr(comm,0x80+add);
while(mun--)
lcd_wr(dat,*(pstring++));
}
voidlcd_init()
{
P0=0x00;
EN=0;
lcd_wr(comm,0x38);
delayms
(2);
lcd_wr(comm,0x0c);
delayms
(1);
lcd_wr(comm,0x06);
delayms
(1);
lcd_wr(comm,0x01);
}
voiddelayjie(uchart)
{
uchari;
for(i=0;idelayms(250);
TR0=0;
}
voidSong()
{
TH0=High;//赋值定时器时间,决定频率
TL0=Low;
TR0=1;//打开定时器
delayjie(Time);//延时所需要的节拍
}
voidmain(void)
{
ucharnum,k,i;
lcd_init();
lcd_string(0,10,dis1[0]);//开机画面
lcd_string(11,5,dis1[1]);//开机画面
Init_Timer0();//初始化定时器0,主要用于数码管动态扫描
SPK=0;//在未按键时,喇叭低电平,防止长期高电平损坏喇叭
lcd_string(0x40+0,5,"NOTE:
");
while
(1)
{
switch(KeyPort)
{
case0xfe:
num=1;break;
case0xfd:
num=2;break;
case0xfb:
num=3;break;
case0xf7:
num=4;break;
case0xef:
num=5;break;
case0xdf:
num=6;break;
case0xbf:
num=7;break;
case0x7f:
num=8;break;
default:
num=0;break;
}
lcd_string(0x40+7,1,YINFU[num]);
if(num==0)
{
TR0=0;
SPK=0;//在未按键时,喇叭低电平,防止长期高电平损坏喇叭
}
else
{
High=freq[num-1][1];
Low=freq[num-1][0];
TR0=1;
}
if(tab==0)
{
delayms(10);
if(tab==0)
{
i=0;
while(i<100)
{
k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振荡频率所需数据
High=FREQH[k];
Low=FREQL[k];
Time=MUSIC[i+2];//节拍时长
i=i+3;
if(P1!
=0xff)//长按任意8音键退出播放
{
delayms(10);
if(P1!
=0xff)
i=101;
}
Song();
}
TR0=0;
}
}
}
}
voidInit_Timer0(void)
{
TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1;//总中断打开
ET0=1;//定时器中断打开
}
voidTimer0_isr(void)interrupt1
{
TH0=High;
TL0=Low;
SPK=!
SPK;
}
第五章PCB印制板
5.1PCB板的设计
PCB板如下图所示:
图5.1PCB板
首先在设计电路板之前,要对电路板有个初步的