单片机原理及应用课程设计-电子音乐盒设计.doc_第1页
单片机原理及应用课程设计-电子音乐盒设计.doc_第2页
免费预览已结束,剩余17页可下载查看

下载本文档

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

文档简介

湖南人文科技学院课程设计报告课程名称:单片机原理及应用课程设计设计题目: 电子音乐盒 系 别: 通信与控制工程系 专 业: 通信工程专业 班 级: 学生姓名: 学 号: 起止日期: 2010年6月10日 6月24日指导教师: 教研室主任: 指导教师评语: 指导教师签名: 年 月 日成绩评定项 目权重成绩1、设计过程中出勤、学习态度等方面0.22、课程设计质量与答辩0.53、设计报告书写及图纸规范程度0.3总 成 绩 教研室审核意见:教研室主任签字: 年 月 日教学系审核意见: 主任签字: 年 月 日摘 要本次所设计的音乐播放利用stc89c52的内部定时器使其工作在计数器模式方式1下,改变计数值th0及tl0从而实现从p3.3输出不同频率的方波,经过一个简单的驱动电路,驱动蜂鸣器来产生音乐,它能够使一首歌连续播放,并且能够使其重复播放,并且通过三个不同的按键的选择,能够播放事先存下的三首对应不同的音乐。其电路简单易于理解,主要由stc89c52单片机最小系统,和三极管组成的驱动电路以及蜂鸣器组成。关键字:单片机 计数器 定时器 音乐目 录电子音乐盒一、单片机播放音乐原理概述1、基本知识1.1要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以 2,即得出半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的i/o 反相,然后重复计时此半周期时间再对i/o 反相,就可在i/o 脚上得到此频率的脉冲。1.2利用 8051 的内部定时器,使用其工作在模式 1下,改变定时值 th0及 tl0 可以产生不同频率的音频脉冲。1.3例如频率为523hz,其周期t1/5231912us,因此只要令定时器计时956us/1us956,在每次计数956次时将 i/o 反相,就可得到中音do(523hz)。计数脉冲值与频率的关系公式如下:nfi2frn:计数次数;fi:音频脉冲频率;fr:单片机的机器周期;1.4.定时器初始值的求法如下:t65536-n65536-fi2fr例如:设k65536,f1000000fi1mhz,求低音do(261hz)、中音do(523hz)、高音的do(1046hz)的定时器初始值。t65536-n65536-fi2fr65536-10000002fr65536-500000/fr低音do:t65536-500000/26263627中音do:t65536-500000/52364580高音do:t65536-500000/1047650591.5.c调各音符频率与计数值t 的对照表如表1所示表1 c调各音符频率与计数值t的对照表音符频率(hz)简谱码(t值)音符频率(hz)简谱码(t值)低1do26263628# 4 fa#74064860#1do#27763731中 5 so78464898低2re29463835# 5 so#83164934#2 re#31163928中 6 la88064968低 3 m33064021# 693264994低 4 fa34964103中 7 si98865030# 4 fa#37064185高 1 do104665058低 5 so39264260# 1 do#110965085# 5 so#41564331高 2 re117565110低 6 la44064400# 2 re#124565134# 646664463高 3 m131865157低 7 si49464524高 4 fa139765178中 1 do52364580# 4 fa#148065198# 1 do#55464633高 5 so156865217中 2 re58764684# 5 so#166165235# 2 re#62264732高 6 la176065252中 3 m65964777# 6186565268中 4 fa69864820高 7 si196765283二、设计要求电子音乐盒1.利用i/o口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(最少三首乐曲,每首不少于30秒;2采用led显示信息; 3可通过功能键选择乐曲,暂停,播放。 主要额外器件:蜂鸣器设计要求分析:三、方案论证与对比本课题设计采用的是以stc89c52为主要控制芯片,通过它来产生一定频率的音频脉冲信号,但由于经stc89c52芯片的引脚输出的脉冲信号不能直接驱动蜂鸣器发声,因此,我们考虑了以下两种方案。3.1方案一: 电路以stc89c52为主要控制芯片,采用音频功率放大器lm386来进行放大,推动蜂鸣器发出声音。此电路比较简单,没有控制开关,直接按了复位键就开始播放音乐,程序也不复杂,由于没有控制开关,不能单独选择播放一首乐曲。而由于lm386放大功能强大,声音信号经lm386之后发音会相对稳定,清晰。其系统方框图图1所示。lm386功率放大蜂鸣器发声震荡电路按键选择播放歌曲与停止 图 1 方案一的系统方框图方案一的不足之处在于,lm386功率放大模块要实现音频信号的放大,需要使用到较多的电容、电阻等元器件。3.2方案二:电路还是以stc89c52为主要控制芯片,由于对音乐的质量、功率没有特别要求,采用三极管放大即可满足条件,于是,经stc89c52引脚p3.3输出的音频脉冲信号,连接到一个三极管9015上,经放大后直接驱动蜂鸣器发声,发声电路非常简单,如图2所示。三极管驱动蜂鸣器发声震荡电路按键选择播放歌曲与停止图 1 方案二系统方框图方案二的不足之处在于,采取简单的晶体管放大,发出的声音不是很稳定,效果不是非常理想。方案对比与选择以上两个方案都是可行的,并且电路都比较容易实现,但由于方案一中的lm386功率放大模块增加多了许多额外的电容电阻器件,器件用起来较多,实现的功能并不很强大,而本课题的设计要求对音质无特别高的要求,从经济性、复杂性等方面综合考虑,我们采用方案二来实现本课题的设计。四、具体设计4.1 硬件电路音乐播放的控制采用stc89c52单片机,驱动放大电路使用到三极管9015,发声器件采用蜂鸣器,显示模块用到七段显示数码管led等器件。4.1.1控制电路的设计控制电路主要是由stc89c52作为控制芯片,其引脚说明如图3所示。电路图34.1.2振荡电路的设计 电路图4要使单片机能够正常工作,那么就必须在stc89c52单片机的18和19脚之间接上一个振荡电路,因为振荡电路就是为单片机工作提供所需要的时钟脉冲信号,使单片机的内部电路及内部程序开始工作,在单片机最小系统当中我们只需在18和19脚之间接一个石英晶体,给单片机加上工作所需直流电源,振荡器就能开始工作,stc89c52常常外接6mhz、12mhz的石英晶体,本课题设计所用的实验板中接入的是12mhz的石英晶体,为了防止单片机自激在18和19脚上分别对地接了一个30pf的电容。其电路如图4所示。4.1.3驱动电路的设计由于单片机p3.3引脚输出的信号不能够直接驱动蜂鸣器,因此还需要在单片机的最小系统中接一个外围电路,因为本次设计对声音的没有特别要求,所以不需要做一个功放电路去驱动,只需一个的简单驱动电路就可以实现。电路如图5所示。电路图54.1.4显示电路的设计 由于本次是采用固定的单片机实验板,作为显示功能的数码管不是直接连到stc89c52芯片的i/o口,而是经过i/o口拓展芯片8255与单片机相连,但这没有关系,只需要将8255芯片的工作模式,通过软件设置在方式0(基本输入/输出方式),即将8255作为无条件传输数据的设备,此时相当于stc89c52芯片的i/o口直接驱动数码管来进行显示。本实验板上的stc89c52芯片的p0口与8255芯片相连,然后使用8255芯片的pa口驱动数码管。4.2 原理说明由于采用的是固定的实验板,所有的元器件的连接已经固定,特此说明如下:(1)用p3.3口输出音频脉冲信号。(2)用p0.0-p0.6经过8255的pa口控制七段码a,b,c,d,e,f。8255芯片工作在方式0,无条件传输数据,相当于p0口直接控制七段数码管。(3)当键盘有键按下时,判断键值,启动计数器t0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时启动定时器t1,显示对应的歌曲号1、2、3。 图1 音乐盒原理图4.3 软件设计 软件的设计主要是对stc89c52单片机进行编程,本次编程采用c语言编写。经过对设计要求的考虑,程序框图如图3所示,音乐播放的程序主要是对乐曲的音符频率的转换,初始化以及乐谱到音符频率的转化读取那个按键按下播放对应的乐曲,显示代码是否程序开始播放并等待,是否停止程序停止利用c语言编写实验程序,总的测试程序如附件1:4.4程序说明:程序中将有2个比较复杂的函数,一个乐谱解释函数,实现乐谱到音符频率的转化,另外一个是音乐播放函数。再这里,三首音乐的乐谱以一个我们自己定义的乐谱形式写好,以第一首仙剑为例来说明,乐谱作为一个预定义的字符串,再通过乐谱解释函数解释为“音符频率的序号”和“音符播放的时间”两个数组,在音乐播放函数中,就将音符频率的序号数组对应的频率送入定时器预置数中,再延时对应音符播放的时间。这样音乐就播放出来了。 仙剑的乐谱: |3_3_3_2_3-|2_3_2_2_,6,6_,7_|12_1_,7,6_,5_|,6-|3_3_3_2_3.6_|5_6_5_5_22_3_|45_4_32_1_|3.-3_|67_6_55_3_|5-3_5_|26_5_32_3_|3-|26_6_6-|16_6_66_7_|17_6_76_7_|3.-3_|67_6_55_3_|5-3_5_|67_6_76_7_|3-|26_6_6-|16_6_66_7_|17_6_7.5_|6-|乐谱书写规则: l 1 2 3 4 5 6 7 为 7 个基本音阶; l 前面加逗号,表示这是低音; l 前面加上点号表示这是高音;l 后面加#,表示这个音符升半个音阶; l 后面加.,表示这个音符要再加长自身一半的延时; l 后面加一个或多个-,每个表示延时一拍; l 后面加一个或多个_,表示这个音符要缩短自身一半的时长,最多支持 2 个_。这些规则对一般的乐谱都可以应付得来了。乐谱解释函数,是逐个字符解释的。基本上是以下过程:遇到拍子分隔符和空格跳过,判断是否高低音,读音符,调整为高低音音符,读音符后的升半个音符的“#”,读延长音“-”“.”,读缩短一半音长的“_”,字符串结束符“0x00”。请仔细领会这个函数。 奏乐函数就比较简单,基本上就是从数组中取出音符和时长,送入定时器预置数,再延时即可。在每个音符播放前后,用 tr0 控制是否输出音乐,每个音符之间也有短暂静音,以使音乐更为清晰。4.5系统工作流程五、详细仪器清单表格 1 仪器清单仪器名称数量17四、总结1)通过此次课程设计,使得我们对于单片机的硬件电路的工作原理有了进一步的学习,同时有了一个提升,在程序的设计,程序的调试方面都有了很大的进步。2) 由于单片机这门课程自身学得不是很好所以在设计的过程中遇到了很多困难,在这一段时间里,在遇到不懂的地方,通过查阅资料,与同学们互相讨论等,一步一步地将问题解决,另外在编程中出现问题时,一定得要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误。这一点在这次的课程设计中十分重要。3)通过这次课程设计,让我们体会到了成功的喜悦,听着自己设计的程序下载到单片机中播放出音乐,心理非常高兴,终于做完了有种如释重负的感觉,但轻松之余,也让我明白了,知识必须通过应用才能实现其价值,有些知识以为学会了,但真正到用的时候才发现是两回事,所以只有到真正懂理论运用到实践的时候才是真的学会了。五、 谢辞本次设计能够顺利的完成要感谢我的指导老师对我耐心的指导,感谢老师给我的帮助,同时也要感谢同学们对我的帮助,因为在设计的过程中遇到了很多的困难是老师和同学们帮我度过了那些难关。在设计的过程中,我通过查阅大量有关资料,与同学交流经验和自学,并向老师请教等方式,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。在整个设计中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。使我充分体会到了在创造过程中探索的艰难和成功时的喜悦。虽然这个设计做的也不太好,但是在设计过程中所学到的东西是这次设计的最大收获和财富,使我终身受益。六、参考文献1张鑫单片机原理及应用 北京: 电子工业出版社 2009年2陈振源电子技术基础北京: 高等教育出版社 2001年 3李朝青单片机原理及接口技术(第3版)北京航空航天大学出版社2005年 4 范风强. 单片机语言c51应用实战集锦 北京: 电子工业出版社2003年.附件1:#define uchar unsigned char /定义一下,方便下面使用#define uint unsigned int#define ulong unsigned long#include /包括一个52标准内核的头文件#include absacc.h#define a8255_pa xbyte0xd1ff /*pa口地址*/#define a8255_pb xbyte0xd2ff /*pb口地址*/#define a8255_pc xbyte0xd5ff /*pc口地址*/#define a8255_con xbyte0xd7ff /*控制字地址*/unsigned char count,watch6,temp,flag; unsigned char const dis_table16= 0xa0, /*0*/ 0xbb, /*1*/ 0x62, /*2*/ 0x2a, /*3 */ 0x39, /*4*/ ;sbit beep=p33; /音频信号的输出引脚sbit p10=p10; sbit k1= p32; /按键输入引脚sbit k2= p35;sbit k3= p24; sbit k4= p25;uchar th0_f; /在中断中装载的t0的值高8位uchar tl0_f; /在中断中装载的t0的值低8位/t0的值,及输出频率对照表uchar code freq36*2=0xa9,0xef,/00220hz ,1 /00x93,0xf0,/00233hz ,1#0x73,0xf1,/00247hz ,20x49,0xf2,/00262hz ,2#0x07,0xf3,/00277hz ,30xc8,0xf3,/00294hz ,40x73,0xf4,/00311hz ,4#0x1e,0xf5,/00330hz ,5 0xb6,0xf5,/00349hz ,5#0x4c,0xf6,/00370hz ,60xd7,0xf6,/00392hz ,6#0x5a,0xf7,/00415hz ,7 0xd8,0xf7,/00440hz 1 /120x4d,0xf8,/00466hz 1# /130xbd,0xf8,/00494hz 2 /140x24,0xf9,/00523hz 2# /150x87,0xf9,/00554hz 3 /160xe4,0xf9,/00587hz 4 /170x3d,0xfa,/00622hz 4# /180x90,0xfa,/00659hz 5 /190xde,0xfa,/00698hz 5# /200x29,0xfb,/00740hz 6 /210x6f,0xfb,/00784hz 6# /220xb1,0xfb,/00831hz 7 /230xef,0xfb,/00880hz 10x2a,0xfc,/00932hz 1#0x62,0xfc,/00988hz 20x95,0xfc,/01046hz 2#0xc7,0xfc,/01109hz 30xf6,0xfc,/01175hz 40x22,0xfd,/01244hz 4#0x4b,0xfd,/01318hz 50x73,0xfd,/01397hz 5#0x98,0xfd,/01480hz 60xbb,0xfd,/01568hz 6#0xdc,0xfd,/01661hz 7 /35;void delay(unsigned int i)/ 延时 while(i-); void display(unsigned char place,unsigned char num)unsigned char display_num = 0; a8255_con=0x89; a8255_pb=0xff; a8255_pa=0xff;a8255_pa= (0x1= 0x30 & num = 0x41 & num = 0x46) a8255_pb = dis_tablenum - 0x37;else a8255_pb = 0xff;delay(100); /*按键函数*/unsigned char keyscan(void) unsigned char a = 0,b = 0,pc_data = 0,test_x=0,test_y=0,key;/*test keyboard and display*/ while(1) a8255_con=0x89; a8255_pb=0xff; a8255_pa=0xff; delay(100); pc_data=a8255_pc; for(b = 0;b4;b+) if(pc_data&(1b) = (1b) for(a = 0;a4;a+) a8255_pa=1a; delay(10); pc_data=a8255_pc; if(pc_data&(1b) = (1b) test_x = a; test_y = b; key =test_x+test_y*4; return(key); delay(100); /定时中断0,用于产生唱歌频率timer0() interrupt 1 tl0=tl0_f; th0=th0_f; /调入预定时值 beep=beep; /取反,从而i/o产生音乐输出/*/音乐符号串解释函数/入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar *song,uchar *diao,uchar *jie) uchar i,i1,j; char gaodi; /高低+/-12音阶 uchar banyin;/有没有半个升音阶 uchar yinchang;/音长 uchar code jie78=0,12,14,16,17,19,21,23; /c调的7个值 *diao=*song; for(i=0,i1=0;) gaodi=0; /高低=0 banyin=0;/半音=0 yinchang=4;/音长1拍 if(*(song+i)=|) | (*(song+i)= ) i+; /拍子间隔和一个空格过滤 switch(*(song+i) case ,: gaodi=-12;i+;/低音 break; case : gaodi=12;i+; /高音 break; if(*(song+i)=0) /遇到0结束 *(diao+i1)=0; /加入结束标志0 *(jie+i1)=0; return; j=*(song+i)-0x30; i+; /取出基准音 j=jie7j+gaodi; /加上高低音yinc: switch(*(song+i) case #: /有半音j加一个音阶 i+; j+;goto yinc; case -: /有一个音节加长 yinchang+=4; i+; goto yinc; case _: /有一个音节缩短 yinchang/=2; i+; goto yinc; case .: /有一个加半拍 yinchang=yinchang+yinchang/2;i+;goto yinc; *(diao+i1)=j; /记录音符 *(jie+i1)=yinchang; /记录音长 i1+; /*/奏乐函数/入口:要演奏的音乐符号串void play(uchar *songdata) uchar i,c,j=0; uint n; uchar xdata diaodata112; /音调缓冲 uchar xdata jiedata112; /音长缓冲 changedata(songdata,diaodata,jiedata); /解释音乐符号串 tr0=1; for(i=0;diaod

温馨提示

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

最新文档

评论

0/150

提交评论