资源描述:
《基于单片机设计电子琴DIY小制作.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、电子设计任务书摘要:电子琴又称作电子键盘,属于电子乐器。我们根据电子琴发音的基本原理,用8个按键代表8个基本音符,从左到右分别代表“DoReMiFaSolLaSiDo”。为了更直观的让弹奏着感觉音调的变化,采用了若干个发光二极管,将其与按键相连接,当我们弹奏时,发光二极管也会根据音符的不同而表现出不同二极管的闪亮。可谓是比一般常见的电子琴多了视觉的冲击,也因此,我们取名为屏幕式声光电子琴。关键词:电子琴,直观,按键,发光二极管一、设计任务与要求1.设计目的运用<<单片机原理及应用>>课程等相关知识,根据题目要求进行控制电路原理设计、电路板设计与制作、控制软件设计、系统调试,从而加深对本课程知识
2、点的理解,使学生综合应用知识能力、设计能力、调试能力及报告撰写能力等得到显著提高。2.设计要求利用51系列单片机、按键、扬声器等器件,设计一个电子琴。具体功能要求如下:设计键盘电路,使其具有数字键1、2、3、4、5、6、7、8、作为电子琴按键,用8个按键代表8个基本音符,从左到右分别代表“DoReMiFaSolLaSiDo”。再使用一个键控制发光二极管的闪亮。用单片机某一接口发出音频脉冲,驱动扬声器发音。一、方案设计与论证要想实现电子琴的功能,大致分为最小系统、键盘电路、发声部分等几个单元电路;(1)最小系统电路图工作原理:采用的是STC89C52单片机,18、19脚分别为时钟电路引脚XTAL
3、1和XTAL2;XTAL1:接外部晶体的一端,是片内振荡器反向放大器的输入端;XTAL2:接外部晶体的另一端,是片内振荡器反向放大器的输出端。振荡电路的频率是晶体振荡频率,我们采用的振荡频率为12MHz。单片机最小系统晶振的振荡频率直接影响单片机的处理速度,频率越大处理速度越快。这次最小系统起振电容C2、C3采用的是30Pf。(2)键盘电路图工作原理:单片机的输入输出引脚(P0、P1、P2和P3端口引脚)我们这次实验采用了p3.0—p3.7八个引脚来控制八个开关。(3)发声部分电路图工作原理:蜂鸣器是电子电路中最基本的发生装置。无缘蜂鸣器通过一定频率的震荡波产生不同的声音。本次试验,我们选用的
4、是2W、0.5欧的蜂鸣器。一、软件程序设计具体程序:sfrP4=0xe8;//定义P4组I0口#include#defineuintunsignedint#defineucharunsignedcharsbitspeaker=P1^4;//喇叭接30脚sbitkey1=P1^0;//流水灯按键(暂时)sbitkey2=P1^1;//播放音乐按键(暂定)uchara,b,num1,s1num,n1,n2;charnum;//定义num为可以负数ucharcodeyinfu[]={0xfb,0xe9,//Do0xfc,0x5c,//Re0xfc,0xc1,//Mi0xfc,0xe
5、f,//Fa0xfd,0x45,//So0xfd,0x92,//La0xfd,0xd0,//Si0xfd,0xee,//Do#0x00,0x00,//间隔};ucharcodeshengri_tone[]={1,0,1,2,1,4,3,0,//生日快乐音调1,0,1,2,1,5,4,0,1,0,1,8,6,4,3,2,0,7,0,7,6,4,5,4,0//0代表不发声,即停顿;数字即为音调};ucharcodeshengri_beat[]={24,1,24,48,48,48,72,5,//节拍24,1,24,48,48,48,72,5,24,1,24,48,48,48,48,72,5,24,1
6、,24,48,48,48,72,5//节拍,即tone表各音调的延时};ucharcodeledtable[]={0x7f,0xbf,0xdf,0xef,//取反0xf7,0xfb,0xfd,0xfe};//P0组口的发光二极管代码(焊接过程可能会相反,具体更改)ucharcodeledtable2[]={0x7f,0xbf,0xdf,0xef,//取反0xf7,0xfb,0xfd,0xfe};//P2组口发光二极管代码,相反!voidcheck_key();//改为P3组为按键voidkeyscan();voidturn();//顺时针流动voidback();voidqianhou();v
7、oiddangshuang();voiddelay(uintz);//延时函数声明voiddelay1(void);//声明第二个延时函数voidplay1(void);//播放生日快乐voidmain(){s1num=0;//流水灯种类标志key1=1;key2=1;TMOD=0x01;TH0=a;TL0=b;ET0=1;//打开定时器,但是未允许中断TR0=1;while(1){check_k