单片机课程设计-数字音乐盒设计_第1页
单片机课程设计-数字音乐盒设计_第2页
单片机课程设计-数字音乐盒设计_第3页
单片机课程设计-数字音乐盒设计_第4页
单片机课程设计-数字音乐盒设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1-机电工程系课程设计报告题目: 单片机课程设计-数字音乐盒设计 专业:应用电子技术班级:10应用电子(4)班学号:1006190120姓名:指导老师:答辩日期:2012年9月目录一、 绪论 -4-二、 对本课程设计的分析 -4-2.1 工作原理 -5-2.节拍的确定 -6-3.音符的编码 -8-4.软硬件环境: -8-三、 主要电路模块的实现方案比较及选择 -8-3.2设计方案的确定: -9-四、 系统电路图 -9-五、 系统的软件设计 -13-六、 结论 -15-七、 课程设计中所负责的内容 -15-八、 课程设计过程中遇到的主要问题以及解决办法 -15-九、 心得体会 -16-黎明职业大学机电工程系课程设计PAGE共22页第5-页00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。 3、例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO(523Hz)。 计数脉冲值与频率的关系公式如下: N=Fi2Fr N:计算值; Fi:内部计时一次为1us,故其频率为1MHz;4、其计数值的求法如下:初值T=65536-N=65536-Fi2Fr例如:设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的计算值T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr低音DO的T=65536-500000/262=63627低音DO的T=65536-500000/523=64580低音DO的T=65536-500000/1047=65059C调各音符频率与计数值T的对照表如表4.1所示。表2.3C低音频率N参数中音频率N参数高音频率N参数Do2621908229Do523956115Do10465757Do#2771805217Do﹟554903108Do﹟11095454Re32941701204Re587852102Re11755151Re﹟3111608193Re﹟62280497Re﹟12454848Mi3301515182Mi65975991Mi13184545Fa3491433172Fa69871686Fa13974343Fa﹟3701351162Fa﹟74067681Fa﹟14804141So3921276153So78463877So15683838So﹟4151205145So﹟83160272So﹟16613636La4401136136La88056868La17603434La﹟4641078129La﹟93253664La﹟18653232Si4941012121Si98850661Si197630302.节拍的确定若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。表2.41节拍与节拍码对照节拍码节拍数节拍码节拍数11/4拍11/8拍22/4拍21/4拍33/4拍33/8拍41拍42/1拍51又1/4拍55/8拍61又1/2拍63/4拍82拍81拍A2又1/2拍A1又1/4拍C3拍C1又1/2拍F3又3/4拍每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表2.41为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。表2.421/4和1/8节拍的时间设定曲调值DELAY曲调值DELAY调4/4125毫秒调4/462毫秒调3/4187毫秒调3/494毫秒调2/4250毫秒调2/4125毫秒3.音符的编码doremifasolasi分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志。举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsignedchar的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。4.软硬件环境:我用的单片机是at89s51机并且利用keil和proteus仿真软件,设计出一个多功能音乐盒,使用c语言写程序。主要电路模块的实现方案比较及选择3.1方案设计:第一方案此方案采用的是模拟电路,其中涉及有几部分:1.基准频率产生器,产生基准频率,其值应根据音调发生器的频率要求决定。

电路可由晶振构成时钟脉冲振荡器。2.音调发生器,音调发生器产生各个音区与音符所对应的频率;音符代码存储器,用来存储与乐曲的音符对应的数字代码及乐曲的数量。3.通常先将乐曲进行编码,再将其代码存储在EPROM存储器。4.节拍发生器与地址计数器,节拍发生器的振荡频率由乐曲演奏的速度所决

定。演奏的速度越快,节拍发生器的速度越高。5节拍分配器,将节拍分配好,产生驱动打击的节拍信号。6.声音驱动电路,使乐曲的节拍和频率通过发音演奏出所想要的乐曲。第二方案:采用单片机来设计电路。其中主要涉及以下几个部分:1.AT89S51单片机,通过对其进行编程,利用其内部的定时器/计数器改变计数初值,可以实现不同的音调。2.按键电路

有不同按键可以实现不同功能。3.晶振复位电路

由石英晶体振荡器产生单片机工作时所必须的时钟信号。振荡器采用12MHZ的晶振,使之机器周期Tcy=1us,方便发音程序的计算和编译。4.蜂鸣器

通过相应程序可以驱动蜂鸣器使之发声。

3.2设计方案的确定:

经过查资料、构思和自己的设计,为保证电路基本功能实现,经过分析,从实现难度、性能、经济等方面综合就以上两种方案进行比较:1.从实现音乐盒电路的硬件方面看,用单片机实现所用硬件电路比用模拟电路实现所用器件少,接线图简单,功耗较小,稳定性和抗干扰性及相对方案1好2.用单片机实现音乐盒,通过编程就可实现音频和节拍,省去了节拍发生器和节拍分配器,实现音乐的产生较简单3.AT89S51微处理器的性价比高,用它完全可以实现本设计当中要求的功能,且体积小,便于产品小型化,功耗小,工作电压范围宽。4.用单片机设计的音乐盒音质较方案一好5.用单片机设计的音乐盒电路可以加按键电路实现播放\暂停及选曲功能综合以上因素,选择方案二比较可行。系统电路图4.1设计思路(仿真)程序设计部分主要有:简谱音调及节拍、计时、键盘扫描部分。设计部分见下图3.11:图3.11利用keil和proteus仿真软件,在仿真部分可以看到分别有八个按键通过74ls21外部中断来控制歌曲切换及相应功能,及蜂鸣器放出程序中的音乐4.2PCB电路图上图包括最小51系统、8按键以及74ls48P.4.3电路实物图1开机2第一曲3下一曲4播放5第二曲6第三曲7暂停8上一曲“1”:歌曲1,《世上只有妈妈好》“2”“3”:歌曲3,《千年之恋》(共有三首歌曲)4.4实现系统功能由图中的8个按键控制相应功能通过hd74ls08p控制外部中断,再由51机中的c语言程序控制输出实现相应功能。系统的软件设计由下面流程图我们看出,首先主程序开始先是初始化变量,然后按key1,判断是否按下,有的话则开机,默认播放第一首歌曲,这时我们可以按key2、key3、key4、key5、key6、key7、key8控制歌曲的切换、播放和暂停。主程序开始主程序开始初始化变量初始化定时器T1Key1=?开机播放歌曲1Key2=?暂停Key8=?播放返回Key7=?Key6=?Key5=?Key4=?Key3=?歌曲1歌曲2歌曲3上一曲下一曲NYNYNYYYYYYNNNNN结论设计是以AT89S51芯片的电路为基础,利用keil和proteus仿真软件,设计出一个多功能音乐盒。并通过硬件实现在单片机上的音乐播放。现在我们的音乐盒已经能够完成我们写的所有功能,并且有进一步的可拓展性,相信我经过这次的学习能更好的学好单片机。在此间我发现有个非常好的方法,同时也是老师的提醒下,就是先写流程图,这样能使思路清晰,然后按流程图的步骤来,就不会出现混乱的情况了。最后终于将程序完成了,并且能在仿真软件上调试成功,然后就是完成硬件。现已全部可用(包括硬件及仿真)。通过这次的单片机设计我发现要学好单片机还有很大的一大段距离,由于自己理念知识不扎实,能力有限,导致编程困难,最后在有资料和同学的帮助下才将程序较好的完成并且能用到实际中。我觉得在此期间我学到是很多,没有扎实的基础是不行的,我们要在理念知识的指导下去实践,细心是非常重要的。在程序中我们要注意指令的规范。课程设计中所负责的内容在本次设计过程中,我负责写驱动程序,并且负责查找相关的资料,以及画PCB、还有写报告。程序已经写好能正常使用,出现的问题已经得到解决。PCB已经画好,除了有部分跳线,一切正常。课程设计过程中遇到的主要问题以及解决办法问题:歌曲在下一曲再下一曲后,无法由最后一曲返回到第一曲。解决方法:加一个if循环函数使其能够返回2.问题:按暂停键老是出现尾音。解决方法:每次判断完按键开关的位置后,都将总中断开关EA和定时器开关TR0关闭3.问题:硬件悍好发现不能用。解决方法:细心观察,发现电路出现粗心时悍错,认真悍好。4问题:发现程序一点也没有出错,但就是不能正常运行。解决方法:认真对照书上的程序,最后发现是指令书写不规范,最后将其改正。心得体会通过这次实验,我加深了对单片机的认识。从硬件到软件,从设计到调试。并深刻体会到了理论和实践有时并不是完全相同的,理论上可以解释,可以实现的东西,在实践中很有可能出现问题。在以后的学习中,不能一味依赖课本,实验中遇到问题,要尝试多种思路。在为期二周的课程设计当中感触最深的便是实践联系理论的重要性,当遇到实际问题时,只要认真思考。就是思考,运用所学的知识,一步一步的去探索,是完全可以解决遇到的一般问题的。本次实习使我们对电子元件及电路设计有一定的感性和理性认识;培养和锻炼我们的实际动手能力。使我们的理论知识与实践充分地结合,作到不仅具有专业知识,而且还具有较强的实践动手能力,能分析问题和解决问题的高素质人才,为以后的顺利就业作好准备。本次实习的对我们很重要,是我们应用电子技术专业学生实践中的重要环节。在以前我们学的都是一些理论知识。一周的的时间很短,但是我们学到的比我们在学校两年学的还要多,以前我们光只注意一些理论知识,并没有专门的练习我们的实际动手能力。这次的实习使我意识到我的操作能力的不足,在理论上也有很多的缺陷。附件:/*C语言音乐盒源程序设计*/#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintucharcount=0,count1=0; //count1歌曲标志ucharkey,count2,h=1,i;uchartemp;//temp歌调//uchars1,s2,m1,m2;ucharsecond,j=0;voiddelay1(uintz); //延时1mssbitkey2=P3^2; //按key2可切换歌曲sbitkey1=P3^3;sbitfm=P3^7;//蜂鸣器连续的IO口sbitrs=P2^2;sbitrw=P2^1;sbite=P2^0;sbitbusy=P0^0; sbitCS1=P2^4;sbitCS2=P2^3;/*于键消抖的延时函数*/voiddelay5(){uintt;for(t=400;t>0;t--);}/*======音乐按键扫描函数=======*/ucharkeyscan(void)//键盘扫描{{unsignedcharkey_l,key;key_l=P1&0x0f;if(key_l!=0x0f)//判断是否有按键按下{delay5();//消抖if(key_l!=0x0f)//再次判断是否有按键按下{key_l=P1&0x0f;//扫描列得到列值P1=0X7f; //01111111 if(P1!=0x7f)key=P1; P1=0Xbf; //10111111 if(P1!=0xbf)key=P1; P1=0Xdf; if(P1!=0xdf)key=P1; P1=0Xef; if(P1!=0xef)key=P1; P1=0x0f;}delay1(1000);} switch(key) { case0xeb: count1=1;i=0;TR1=1; break; case0xd7: count1=2;i=0;TR1=1; break; case0xdb: count1=3;i=0;TR1=1; break; case0xe7: count2=1;count1=1;delay1(100);TR1=1;break; //开机键ON/C case0xed: count2=2;h=0;delay1(100);TR1=1;ER0=0;EA=1;break; //暂停键= case0xee:count1=count1+1;i=0;delay1(100);TR1=1; if(count1==4)count1=1;break;//下一曲+ case0xde:count1=count1-1;i=0;delay1(100);TR1=1; if(count1==0)count1=3;break;//上一曲- case0xbe:count2=5;h=1;TR0=1;break;TR1=1;//播放键 default:break; } P1=0x0f; }}//=======外部中断INT0==========//voidZD()interrupt0{ keyscan();}//===========显示延迟=======================//delay2(inta){intb;for(;a>0;a--)for(b=0;b<255;b++);}check() //查忙{e=1;rw=1;rs=0;P0=0xff;if(busy);}/*写指令程序*/wc(unsignedchardat){check();e=0;rw=0;rs=0;P0=dat;e=1;e=0;}/*写数据程序*/wd(unsignedchardat) {check();e=0;rw=0;rs=1;P0=dat;e=1;e=0;}//简谱音调对应的定时器初值////适合11.0592M的晶振ucharcodecuzhi[]={ 0xff,0xff,//占位停顿 0xFC,0x8E,//中音1-7 0xFC,0xED, 0xFD,0x43, 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D, 0xFE,0x47, //高音1-7 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 };/*函数声明*/voiddelay1(uintz);//延时1mSvoiddelay(uintz); //延时165ms,即十六分音符voidsong();voidbeep();//蜂鸣器叫一声/*初始化程序*/voidinti(){wc(0X3f);//显示开关关00111111wc(0XC0);//修改显示起始行11000000wc(0XB8);//修改页地址,x地址10111000wc(0X40);//修改列地址,y地址01000000}uchartimeh,timel,i;//简谱//编程规则:字节高位是简谱,低位是节拍持续时间,//代表多少个十六分音符//1-7代表中音,8-E代表高音,0代表停顿//最后的0是结束标志//=====================歌曲============//ucharcodemamahao[]={ //世上只有妈妈好//世上只有妈妈好0x68,0x52,0x34,0x54,0x84,0x62,0x52,0x68,//世上只有妈妈好0x34,0x52,0x62,0x54,0x34,0x12,0xc2,0x52,0x32,0x28,//有妈的孩子像个宝0x24,0x32,0x54,0x52,0x62,0x34,0x24,0x18,//投进了妈妈的怀抱0x54,0x32,0x22,0x12,0xc2,0x12,0xb8,0x04,0xff,//幸福享不了};ucharcodeganen[]={//感恩的心0x12,0x14,0x22,0x32,0x54,//我来自偶然,0x32,0x84,0x72,0x62,0x54,//像一颗尘土,0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,//有谁看出我的脆弱,0x12,0x14,0x22,0x32,0x54,//我来自何方,0x32,0x84,0x92,0x82,0x54,//我情归何处,0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,//谁在下一刻呼唤我,0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,//天地虽宽这条路却难走0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,//我看遍这人间坎坷辛苦0x31,0x52,0x51,0x52,0x31,0x51,0x58,//我还有多少爱0x31,0x82,0x81,0x82,0x31,0x61,0x68,//我还有多少泪0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,//要苍天知道我不认输0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,//感恩的心感谢有你0x62,0x94,0x82,0x94,//伴我一生0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94,//让我有勇气做我自己0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,//感恩的心感谢命运0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88,0xff//花开花落我一样会珍惜};ucharcodeqnzl[]={ //千年之恋0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,//前奏0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,//竹林的灯火到过的沙漠0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22,//七色的国度不断飘逸风中0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,//有一种神秘灰色的旋涡0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02,//将我卷入了迷雾中0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,//看不清的双手0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02,//一朵花传来谁经过的温柔0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76,//穿越千年的伤痛0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,//只为求一个结果0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,//你留下的轮廓指引我0x42,0x63,0x83,0x83,0x91,0x91,//黑夜中不寂寞0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76,//穿越千年的哀愁0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,//是你在尽头等我0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53,//最美丽的感动会值得0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志//用一生守候};//===========计时程序=========//voidtm()interrupt3//T1分秒计时{j++;if(j==20){j=0;}}//=========唱歌显示歌名============//voidsong() { uinttemp; //temp歌调

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论