基于单片机的电子琴设计.docx
- 文档编号:10323626
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:22
- 大小:23.42KB
基于单片机的电子琴设计.docx
《基于单片机的电子琴设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子琴设计.docx(22页珍藏版)》请在冰点文库上搜索。
基于单片机的电子琴设计
郑州航空工业管理学院
单片机课程设计说明书
14届电子信息工程专业82班级
题目
学号
姓名
指导教师
二О一六年十二月日二十三录目
3摘要………………………………………4一、电子琴的基本原理…………………1.设计的内容
2.整体的工作原理3.发音原理5二、电子时钟的硬件设计………………1.硬件原理图2.键盘设计
时钟电路3.复位电路4.5.元件清单数码管显示部分6.发音部分设计7.
8.硬件调试
三、电子时钟的软件设计………………9
1.键盘扫描程序
2.功能转移程序
3.琴键处理程序
4.自动播放歌曲程序
5.程序流程图
设计源程序6.四、课程设计总结与指导教师评语…18
摘要
随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
我们对于电子琴如何实现其功能,如音色选择、声音强弱控制、节拍器、自动放音功能等等也很好奇。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
AT89S51单片机音色节拍器自动放音
一、电子琴的基本原理.
1、本次设计的内容是:
个不同的音能够发出7利用所给键盘的16,15,14,13,12,11,10,9七个键,按键可以自动播放歌曲,要求按键按下时发声,当系统扫描到调,而且8,7,6键盘按下,则快速检测出是哪一个按键被按下,然后单片机的定时器启动,发出一定频率的脉冲,该频率的脉冲经喇叭驱动电路放大滤波后,就会发出相应控制着蜂鸣器发出声音,在此基础上我们组又增加了数码管显示的音调,p1.7口控制数码管是分别显示音调时通过p2部分,当发出1,2,3,4,5,6,7。
当播放音乐时数码管分别显示1,2,31,2,3,4,5,6,72、整体工作原理:
采用AT89C52单片机作为主控芯片,设置键盘、蜂鸣器等外围器件,另外还用到一些简单器件如:
两位数码管,和NPN型三极管及电阻等。
利用按键实现音符和音调的输入;两位的数码管进行被操作的按键显示;用NPN型三极管8550实现低音频功率放大;最后用蜂鸣器发音。
AT89C52单片机是大规模集成电路技术发展的产物,具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
同时具有强大的控制功能和灵活的编程实现特性,由于本设计主要用于人们娱乐方面,因此在设计上尽量使其安全以及简单易操作。
具有经济可行性、技术可行性、实物应用性。
3、发音原理:
若要产生音频脉冲,只要算出某一音频的周期(频率),再将此周期除以2,即为半周期的时间。
利用定时器计时半周期时间,每当计时终止后就将P1.7反相,然后重复计时再反相。
就可在P1.7引脚上得到此频率的脉冲。
利用STC89C52的内部定时器使其工作计数器模式(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)。
T=65536-N=65536-fi÷2÷fr=65536-1000000÷2÷fr=65536-500000/fr,中音DO的T=65536-500000/523=64580?
STC89C52单片机为12MHZ晶振,中音符与计数T0相关的计数值如表所示:
音符频率(HZ)计数值(T值)音符频率(HZ)计数值(T值)
740636281DO低262#4FA#64860?
64898
7845SO
中63737277#1DO#
低2RE29463835#5SO#83194934
6494831188063928中6LA#2RE#
6449433093264021中低3MI6LA##65030641037SI中低FA349968
65058641851046#4FA#370?
低1DO
65085SO?
低642601109392#1DO#?
65110#5SO#117564331415高2RE
65134低6LA64400440#2RE#1245
65157高466644633MI#6LA#1318
6517849464524高低7SI4FA1397
65198645801DO?
中5231490#4FA#
6521764633#1DO#5SO1568554高6523564633#5SO#1661587中2RE
65252648846LA?
622#2RE#高1760
652683MI中647321865659#6LA#
65283?
中648206981967高4FA7SI
用单片机播放音乐,或者弹奏电子琴,实际上是按照特定的频
率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
二、电子时钟的硬件设计
1、硬件原理图:
本系统有主控芯片STC89C52、发音单元、显示模块、按键模块组成。
硬件电路要以单片机作为主控芯片,实现按键输入音符和音调,四位数码管的显示以及低音频功率放大和蜂鸣器发音。
2、键盘设计
单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。
显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。
这是识别按键是否按下的关键。
图-矩阵键盘
3、时钟电路?
?
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚Xl和X2跨接石英晶体和两个补偿电容构成自激振荡器,选择12MHz频率的石英晶体,补偿电容通常选择20pF左右的瓷片电容。
、复位电路4.
单片机小系统常采用上电自动复位和手动按键复位两种方式实现系统的复位操作。
上电复位要求接通电源后,自动实现复位操作。
手动复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
上电自动复位通过电容C3充电来实现。
手动按键复位是通过按键将电阻R1与VCC接通来实现。
5、元件清单
6、数码管显示部分
当发出1,2,3,4,5,6,7音调时通过p2口控制数码管是分别显示1,2,3,4,5,6,7。
当播放音乐时数码管分别显示1,2,3
7、发音部分设计
如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。
由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。
?
图4发音电路
8、硬件调试
硬件调试主要是针对单片机部分进行的调试。
在上电之前,先确保电路中不存在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。
在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况的任务。
注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。
在确保硬件电路正常且无异常情况(断路或短路)的情况下方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要是检测单片机控制部分、数码管点亮部分、和音频转换电路硬件调试,
电子时钟的软件设计三、?
1、键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。
?
2、功能转移程序:
对检测到的按键值进行判断,是琴键则跳转至琴键处理程序,是功能键则跳转至相应的功能程序,我们设计的功能程序有两种,即音色调节功能和自动播放乐曲的功能。
?
3、琴键处理程序:
根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声?
音。
.
4、自动播放歌曲程序:
检测到按键按下的是自动播放歌曲功能键后执行该程序,电子琴会自动播放事先已经存放的歌曲,歌曲播放完毕之后自动返回至键盘扫描程序,继续等待是否有按键按下。
5、程序流程图
图5流程图
6、设计源程序:
/*说明*************************************************************************
曲谱存贮格式unsignedcharcodeMusicName{音高,音长,音高,音长....,0,0};末尾:
0,0表示结束(Important)
音高由三位数字组成:
个位是表示1~7这七个音符;十位是表示音符所在的音区:
1-低音,2-中音,3-高音;百位表示这个音符是否要升半音:
0-不升,1-升半音。
音长最多由三位数字组成:
个位表示音符的时值,其对应关系是:
|数值(n):
|0|1|2|3|4|5|6
|几分音符:
|1|2|4|8|16|32|64音符=2^n
十位表示音符的演奏效果(0-2):
0-普通,1-连音,2-顿音
百位是符点位:
0-无符点,1-有符点
调用演奏子程序的格式
Play(乐曲名,调号,升降八度,演奏速度);
|乐曲名:
要播放的乐曲指针,结尾以(0,0)结束;
|调号(0-11):
是指乐曲升多少个半音演奏;
|升降八度(1-3):
1:
降八度,2:
不升不降,3:
升八度;
|演奏速度(1-12000):
值越大速度越快;
#define__SOUNDPLAY_H_REVISION_FIRST__
#include
//**************************************************************************
#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔
#defineucharunsignedchar
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
sbitP2_4=P2^4;
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
//定义输出管脚sbitBeepIO=P1^7;
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表在频率表中的位置unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};
音符定时器初值暂存//unsignedcharSound_Temp_TH0,Sound_Temp_TL0;
unsignedcharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存
//**************************************************************************
voiddelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voidInitialSound(void)
{
BeepIO=1;
Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;//计算TL1应装入的初值)
的初装值(10ms计算Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%6;//TH1应装入的初值TH1=Sound_Temp_TH1;
TL1=Sound_Temp_TL1;
TMOD|=0x11;
ET0=1;
=0;ET1
=0;TR0
TR1=0;
EA=1;
}
音符发生中断voidBeepTimer0(void)interrupt1//{
BeepIO=!
BeepIO;
TH0=Sound_Temp_TH0;
TL0=Sound_Temp_TL0;
}
//**************************************************************************
voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed)
{
unsignedintNewFreTab[12];新的频率表//unsignedchari,j;
unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD;
根据调号及升降八度来生成新的频率表//for(i=0;i<12;i++)
{
j=i+Signature;
if(j>11)
{
j=j-12;
NewFreTab[i]=FreTab[j]*2;
}
else
NewFreTab[i]=FreTab[j];
if(Octachord==1)
NewFreTab[i]>>=2;
elseif(Octachord==3)
NewFreTab[i]<<=2;
}
SoundLength=0;
while(Sound[SoundLength]!
=0x00)//计算歌曲长度
{
SoundLength+=2;
}
Point=0;
Tone=Sound[Point];
//Length=Sound[Point+1];读出第一个音符和它时时值分音符的长度//算出LDiv0=12000/Speed;1(几个10ms)
4分音符的长度算出//LDiv4=LDiv0/4;
LDiv4=LDiv4-LDiv4*SOUND_SPACE;
//普通音最长间隔标准
=0;TR0
TR1=1;
while(Point { //计算出音符SL=Tone_x0010_; //计算出高低音SM=Tone/10_x0010_; //计算出是否升半SH=Tone/100; CurrentFre=NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 if(SL! =0) { 低音if(SM==1)CurrentFre>>=2;////if(SM==3)CurrentFre<<=2;高音 Sound_Temp_TH0=Temp_T/256; Sound_Temp_TL0=Temp_T%6; TH0=Sound_Temp_TH0; TL0=Sound_Temp_TL0+12;//12加是对中断延时的补偿} SLen=LengthTab[Length_x0010_];//算出是几分音符) 普通(0算出音符类型XG=Length/10_x0010_;//2连音1顿音FD=Length/100; 10ms)LDiv=LDiv0/SLen;(//算出连音音符演奏的长度多少个 if(FD==1) LDiv=LDiv+LDiv/2; if(XG! =1) 算出普通音符的演奏长度if(XG==0)//if(SLen<=4) LDiv1=LDiv-LDiv4; else LDiv1=LDiv*SOUND_SPACE; else LDiv1=LDiv/2; 算出顿音的演奏长度// else LDiv1=LDiv; if(SL==0)LDiv1=0; 算出不发音的长度LDiv2=LDiv-LDiv1;//if(SL! =0) { TR0=1; for(i=LDiv1;i>0;i--)//发规定长度的音 { while(TF1==0); TH1=Sound_Temp_TH1; TL1=Sound_Temp_TL1; TF1=0; } } if(LDiv2! =0) { TR0=0;BeepIO=1; //音符间的间隔for(i=LDiv2;i>0;i--) { while(TF1==0); TH1=Sound_Temp_TH1; TL1=Sound_Temp_TL1; TF1=0; } } Point+=2; Tone=Sound[Point]; Length=Sound[Point+1]; } BeepIO=1; } //************************************************************************** #endif #include #includeSoundPlay.h //*****************************Music**************************************** unsignedcharcodesound1[]={0x15,0x02,0x00,0x00};//1 unsignedcharcodesound2[]={0x16,0x02,0x00,0x00};//2 unsignedcharcodesound3[]={0x17,0x02,0x00,0x00};//3 unsignedcharcodesound4[]={0x18,0x02,0x00,0x00};//4 unsignedcharcodesound5[]={0x19,0x02,0x00,0x00};//5 unsignedcharcodesound6[]={0x1A,0x02,0x00,0x00};//6 unsignedcharcodesound7[]={0x1B,0x02,0x00,0x00};//7 unsignedcharkey; 小毛驴// unsignedcharcodeMusic_Xiao[]={0x15,0x03,0x15,0x03,0x15,0x03,0x17,0x03, 0x19,0x03,0x19,0x03,0x19,0x03,0x19,0x03, 0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1F,0x03,0x19,0x02, 0x18,0x03,0x18,0x03,0x1A,0x03,0x1A,0x03, 0x17,0x03,0x17,0x03,0x17,0x03,0x17,0x03, 0x16,0x03,0x16,0x03,0x16,0x03,0x16,0x03,0x6A,0x02,0x19,0x02, 0x15,0x03,0x15,0x03,0x15,0x03,0x17,0x03, 0x19,0x03,0x19,0x03,0x19,0x03,0x19,0x03, 0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1F,0x03,0x19,0x02,0x19,0x02, 0x18,0x03,0x18,0x03,0x1A,0x03,0x1A,0x03, 0x17,0x03,0x17,0x03,0x17,0x03,0x17,0x03, 0x16,0x03,0x16,0x03,0x16,0x03,0x16,0x03,0x15,0x02,0x00,0x00,0x00, }; 找朋友//unsignedcharcodeMusic_Zhao[]={0x19,0x03,0x1A,0x03,0x19,0x03,0x1A,0x03,0x19,0x03,0x1A,0x03, 0x19,0x02,0x19,0x03,0x1F,0x03,0x1B,0x03,0x1A,0x03,0x19,0x02,0x17,0x02, 0x19,0x03,0x19,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x19,0x03,0x17,0x02, 0x19,0x03,0x19,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x19,0x03,0x17,0x02, 0x16,0x03,0x15,0x03,0x16,0x03,0x15,0x02,0x00, 0x15,0x03,0x18,0x03,0x17,0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子琴 设计