基于单片机的电子琴设计毕业设计.docx
- 文档编号:11562095
- 上传时间:2023-03-19
- 格式:DOCX
- 页数:15
- 大小:54.11KB
基于单片机的电子琴设计毕业设计.docx
《基于单片机的电子琴设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子琴设计毕业设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于单片机的电子琴设计毕业设计
湄洲湾职业技术学院
基于单片机的电子琴设计
系别:
自动化工程系
年级:
10级专业:
电气自动化
姓名:
林家家学号:
1001010111
导师姓名:
许振龙职称:
讲师
2013年5月29日
1.前言
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用STC89C52单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。
通过设计本系统可了解单片机的基本功能。
对单片机的了解有一个小的飞跃。
2.系统设计技术参数要求
2.1设计要求
(1)键盘矩阵识别。
即矩阵扫描,显示当前按键。
(2)不同频率音符播放。
可以通过按键控制15种发音。
(3)设有一个按键,按下后可以播放预设的歌曲。
3.系统设计
3.1系统设计总体框图
3.2各模块原理说明
主控模块:
STC89C52单片机最初是由Intel公司开发设计的,但后来Intel公司把51核的设计方案卖给了几家大的电子设计生产商,譬如SST、Philip、Atmel等大公司。
如是市面上出现了各式各样的但均以51为内核的单片机,倒是Intel公司自己的单片机却显得逊色了。
这些各大电子生产商推出的单片机都兼容51指令、并在51的基础上扩展一些功能而内部结构是与51一致的。
STC89C52有40个引脚,4个8位并行I/O口,1个全双工异步串行口,同时内含5个中断源,2个优先级,2个16位定时/计数器。
STC89C52的存储器系统由4K的程序存储器(掩膜ROM),和128B的数据存储器(RAM)组成。
键盘模块:
矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键。
矩阵式键盘简介:
矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
最常见的键盘布局如图1所示。
一般由16个按键组成,在单片机中正好可以用一个P口实现16个按键功能,这也是在单片机系统中最常用的形式,本设计就采用这个键盘模式。
功率放大模块:
功率放大模块我们选用了LM386作为功率放大模块的主要芯片,LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。
为使外围元件最少,电压增益内置为20。
但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至200。
输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。
3.3系统总原理图说明
主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。
通过设计本系统可了解单片机的基本功能。
3.4系统印刷电路板的制作图
3.5系统的操作说明
(1)键盘矩阵识别。
即矩阵扫描,显示当前按键。
(2)不同频率音符播放。
可以通过按键控制15种发音。
(3)设有一个按键,按下后可以播放预设的歌曲。
3.6系统操作注意事项
1.通电使用前先对照电路板与电路图是否有错焊、漏焊、短路、开路、元器件相碰等现象,有要处理好后再使用。
2.通电使用前先检查好电路板是否与电源供电线、驱动电路开关与负载供电线、负载供电线之间相互接反,不得在接错的情况下通电,要处理好后再使用。
3.通电使用时人体不得与电路板线路任何一个部位相碰,防止触电,注意安全。
4.应把电极片与电路板隔离,避免电极片与电路板上元器件相碰触发生短路现象。
5.通电时应把电路板放在绝缘物体上,避开其他导电物体避免发生短路现象。
6.使用时闻到烧焦味、发现元器件或集成块冒烟烧毁应立即断开电源,待电路板查明原因处理好后才可以继续通电使用。
系统设计参考文献
[1]彭伟.单片机C语言程序设计实训100例[M].北京:
电子工业出版社,2009
[2]吴运昌.模拟电子线路基础[M].广州:
华南理工大学出版社,2004
[3]阎石.数字电子技术基础[M].北京:
高等教育出版社,1997
[4]罗亚非,凌阳单片机原理及毕业设计精选[M].北京:
科学出版社,2006
[5]华东,protel电路设计[M].北京:
清华大学出版社,2007
[6]黄健,单片机原理与应用[M].西安:
西北工业大学出版社,2008
[7]周明德,单片机原理与技术[M].北京:
人民邮电出版社,2008
[8]李建忠,单片机原理及应用[M].西安:
电子科技大学出版社,2008
[9]王正谋,Protel99se电路设计与仿真技术[M].福建:
科学技术出版社,2004
[10]郝万新,电路基础[M].大连:
理工大学出版社,2005
致谢词
谢谢各位老师,通过这次毕业设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。
经过我长时间的设计及调试,本系统基本能实现按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符。
但由于仿真系统原因,本设计音频效果不是很好。
不足之处有:
1.可弹奏的音符数较少,只能在一定范围内满足用户需要。
可通过改进键盘识别模块和发生模块来增加其复杂度2.音量不可调。
我的综合设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。
首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。
基本掌握了Protel99SE原理图的方法,并设计了一个单片机最小系统。
通过开发板的设计和硬件搭建的过程,使我对51系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等。
并且我学会了分析问题解决问题的能力,加深了对所学理论知识和大的提高,创新意识得到了锻炼。
附录
附录1.电路总原理图
附录2.电路元件清单
序号
元件名称
阻值
数量
位号
1
电容
30PF
2
2
电阻
10K
3个
3
电阻
1K
1
4
电容
10UF
2个
5
排阻
10K
1个
6
电位器
10K
1个
7
插座
DIP40
1个
8
轻触按键
17个
9
LM386
1个
10
晶振
12M
1个
11
扬声器
1个
附录3.程序
#include
//本程序是电子琴的程序,能够实现单独演奏和放一首歌曲的功能。
其中,按键1~15是用
于单独演奏的,按键16是用于播放歌曲的
//播放歌曲的时候需要按复位键才能够停止。
//共阴极数码管段码表,最后一字节为黑屏
unsignedcharcodeDSY_CODE[]={0x28,0xee,0x34,0xa4,0xe2,0xa1,0x21,0xec,0x20,0xa0,0x60,0x23,0x39,0x26,0x31,0x71,0xbf};
//各音符对应的延时表
unsignedintcodetone_delay_table[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178};
//蜂鸣器的位定义
sbitbeep=P3^0;
#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔
//同一首歌的谱子
unsignedcharcodeMusic[]={0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x66,0x18,0x03,
0x17,0x02,0x15,0x02,0x16,0x01,0x15,0x02,0x10,0x02,
0x15,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x02,
0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x02,0x18,0x66,
0x17,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x16,0x00,
0x17,0x01,0x19,0x02,0x1B,0x02,0x1B,0x70,0x1A,0x03,
0x1A,0x01,0x19,0x02,0x19,0x03,0x1A,0x03,0x1B,0x02,
0x1A,0x0D,0x19,0x03,0x17,0x00,0x18,0x66,0x18,0x03,
0x19,0x02,0x1A,0x02,0x19,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x01,0x11,0x02,0x11,0x03,0x10,0x03,0x0F,0x0C,
0x10,0x02,0x15,0x00,0x1F,0x01,0x1A,0x01,0x18,0x66,
0x19,0x03,0x1A,0x01,0x1B,0x02,0x1B,0x03,0x1B,0x03,
0x1B,0x0C,0x1A,0x0D,0x19,0x03,0x17,0x00,0x1F,0x01,
0x1A,0x01,0x18,0x66,0x19,0x03,0x1A,0x01,0x10,0x02,
0x10,0x03,0x10,0x03,0x1A,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x70,
0x18,0x03,0x17,0x02,0x15,0x03,0x15,0x03,0x16,0x66,
0x16,0x03,0x16,0x02,0x16,0x03,0x15,0x03,0x10,0x02,
0x10,0x01,0x11,0x01,0x11,0x66,0x10,0x03,0x0F,0x0C,
0x1A,0x02,0x19,0x02,0x16,0x03,0x16,0x03,0x18,0x66,
0x18,0x03,0x18,0x02,0x17,0x03,0x16,0x03,0x19,0x00,
0x00,0x00};
unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表
unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7在频率表中的位置
unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};
unsignedcharSound_Temp_TH0,Sound_Temp_TL0;//音符定时器初值暂存
unsignedcharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存
voiddelay_1ms(unsignedintms){unsignedchari;while(ms--)for(i=0;i<120;i++);}//延时1ms
//播放音乐的子函数
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)
LDiv4=LDiv0/4;//算出4分音符的长度
LDiv4=LDiv4-LDiv4*SOUND_SPACE;//普通音最长间隔标准
TR0=0;
TR1=1;
while(Point { SL=Tone%10;//计算出音符 SM=Tone/10%10;//计算出高低音 SH=Tone/100;//计算出是否升半 CurrentFre=NewFreTab[SignTab[SL-1]+SH];//查出对应音符的频率 if(SL! =0) { if(SM==1)CurrentFre>>=2;//低音 if(SM==3)CurrentFre<<=2;//高音 Temp_T=65536-(50000/CurrentFre)*10;//计算计数器初值 Sound_Temp_TH0=Temp_T/256; Sound_Temp_TL0=Temp_T%256; TH0=Sound_Temp_TH0; TL0=Sound_Temp_TL0+12;//加12是对中断延时的补偿 } SLen=LengthTab[Length%10];//算出是几分音符 XG=Length/10%10;//算出音符类型(0普通1连音2顿音) FD=Length/100; LDiv=LDiv0/SLen;//算出连音音符演奏的长度(多少个10ms) 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;beep=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]; } beep=0; TR0=0;//关闭定时器 } //键盘矩阵扫描 //返回按下的键的值 unsignedcharkeys_scan(void) { unsignedcharTmp,k=16; P2=0x0F;delay_1ms (2); Tmp=P2^0x0F; switch(Tmp)//确定扫描的是哪一行 { case1: k=0;break; case2: k=1;break; case4: k=2;break; case8: k=3;break; default: return16;//无键按下,返回 } P2=0xF0;delay_1ms (2); Tmp=(P2>>4)^0x0F; switch(Tmp)//确定扫描的是那一列 { case1: k+=0;break; case2: k+=4;break; case4: k+=8;break; case8: k+=12;break; default: return16;//无键按下,返回 } returnk; } voidmain()//主程序 { unsignedcharkey_NO=0; P1=0xFF;//数码管显示关闭 //设置定时器工作方式1,以及相关开启寄存器 TMOD|=0x11; ET0=1; ET1=0; TR0=0; TR1=0; EA=1; //设置定时器初值 TH0=tone_delay_table[key_NO]/256; TL0=tone_delay_table[key_NO]%256; TH1=(65535-50000)/256;//计算TL1应装入的初值(10ms的初装值) TL1=(65535-50000)%256; while (1) { P2=0xF0; if(P2! =0xF0)//当有按键按下时,需要显示数码管及设置定时器的开启 { key_NO=keys_scan();//调用键盘扫描 P1=DSY_CODE[key_NO];//在数码管上显示按下的键 if(key_NO<15)//按下那个键,发出对应的音调 { Sound_Temp_TH0=tone_delay_table[key_NO]/256; Sound_Temp_TL0=tone_delay_table[key_NO]%256; } elseif(key_NO==15)//按下最后一个键时,要播放音乐 { Play(Music,0,3,300); //TR1=0;//音长中断 } TR0=1;//开启定时器0,音符中断 } else//当没有键按下时,数码管不显示,也无声音发出;如果是播放音乐,则一直显示 { TR0=0;//关闭定时器 P1=0xFF;//数码管显示关闭 } delay_1ms (2);//稍做延时,可以避免误判断 } } //音符发生的中断 voidplay_tone()interrupt1 { TH0=Sound_Temp_TH0; TL0=Sound_Temp_TL0; beep=~beep; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子琴 设计 毕业设计