基于单片机的音乐盒的设计毕业设计(论文)_第1页
基于单片机的音乐盒的设计毕业设计(论文)_第2页
基于单片机的音乐盒的设计毕业设计(论文)_第3页
基于单片机的音乐盒的设计毕业设计(论文)_第4页
基于单片机的音乐盒的设计毕业设计(论文)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

天津轻工职业技术学院 毕业毕业 设计设计(论文论文) 课题 : 专业班级 学生姓名学生学号 指导教师 提交日期成绩 答辩日期答辩成绩 答辩教师 总评成绩 B34 课题设计 基于单片机的音乐盒的设计基于单片机的音乐盒的设计 单片机原理及应用是高校工程专业的一门专业基础课,该门课 程具有很强的实践性。通过课程的学习,使我能够掌握基本概念、基本 理论和基本技能, 为今后从事相应的生产设计和科研工作打下一定的基 础。因此,除了在课堂的理论学习和做实验外,课程设计也是一个重要 的实践学习环节。 通过课程设计, 进一步培养我们理论联系实际的能力, 学会正确地分析工程实际问题,善于查阅参考文献,准确地选择相应的 数据、参数,具备全面地解决实际问题的素质,同时课程设计也为今后 的毕业设计打下基础。单片机自 20 世纪 70 年代问世以来,以其极高的 性能价格比,受到人们的重视和关注,应用很广、发展很快。而 51 单 片机是各单片机中最为典型和最有代表性的一种。本音乐播放器是利 用 89C51 单片机结合内部定时系统, 设计一个简易的微电脑音乐盒。 引言引言 单片机原理及应用是高校工程专业的一门专业基础课,该门课 程具有很强的实践性。通过课程的学习,使我能够掌握基本概念、基本 理论和基本技能, 为今后从事相应的生产设计和科研工作打下一定的基 础。因此,除了在课堂的理论学习和做实验外,课程设计也是一个重要 的实践学习环节。 通过课程设计, 进一步培养我们理论联系实际的能力, 学会正确地分析工程实际问题,善于查阅参考文献,准确地选择相应的 数据、参数,具备全面地解决实际问题的素质,同时课程设计也为今后 的毕业设计打下基础。单片机自 20 世纪 70 年代问世以来,以其极高的 性能价格比,受到人们的重视和关注,应用很广、发展很快。而 51 单 片机是各单片机中最为典型和最有代表性的一种。本音乐播放器是利 用 89C51 单片机结合内部定时系统, 设计一个简易的微电脑音乐盒。 1 1 概述概述 通过按键给单片机的 P2 口输入低电平,进而利用程序来判断是否 执行某一播放功能。而利用单片机的定时器 0 中断来控制播放乐曲。 1.11.1 课题意义课题意义 音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会 的钟塔报时,而将大小的钟表装上机械装置,被称为“可发出声音的组 钟” 。音乐盒有着 300 多年的发展历史,是人类文明发展的历史见证。 传统的音乐盒多是机械音乐盒, 其工作原理是通过齿轮带动一个带 有铁钉的铁桶转动,铁桶上的铁钉撞击铁片制成的琴键, 从而发出声音。 但是,机械式的音乐盒体积比较大,比较笨重,且发音单调。水、灰尘 等外在因素,容易使内部金属发音条变形,从而造成发音跑调。另外, 机械音乐盒放音时为了让音色稳定,必须放平不能动摇, 而且价格昂贵, 不能实现大批量生产。 本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传 统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式 音乐盒动力来源是电池,制作工艺简单,可进行批量生产,所以价格便 宜。 基于单片机制作的电子式音乐盒, 控制功能强大, 可根据需要选歌, 使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可 以设计彩灯外观效果,使音乐盒的功能更加丰富。 1.21.2 设计方案设计方案 设计一个基于 AT89C51 系列单片机的音乐盒,利用按键切换演奏出 不同的乐曲。 1.31.3 研究内容研究内容 1)电路工作模式:演奏音乐模式。演奏完整的一首的歌曲,随着音乐 变化,蜂鸣器随着发出音乐声。 2)按下按键进入演奏音乐模式,再按切换歌曲,共两首歌曲。 2 2 设计原理设计原理 通过按键给单片机的 P2 口输入低电平,进而利用程序来判断是否 执行某一播放功能。而利用单片机的定时器 0 中断来控制播放乐曲。 3 3 时钟振荡电路、复位电路时钟振荡电路、复位电路 利用 12MHZ 的晶振做外部时钟,AT89C51 中有一个用于构成内部振 荡器的高增益反相放大器, 引脚 XTAL1 和 XTAL2 分别是该放大器的输入 端和输出端。 这个放大器与作为反馈元件的片外石英晶体(陶瓷)谐振器 一起构成自然振荡器。外接石英晶体及电容 C1、C2 接在放大器的反馈 回路中构成并联振荡电路。对外接电容 C1,C2 虽然没有什么严格的要 求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定 性、起振的难易程序及温度稳定性。电路如下图 1。 图 1 晶振电路、复位电路 4 4 蜂鸣器电路蜂鸣器电路 利用 NPN 管(9012)放大驱动。基极接 10K 欧姆的电阻,发射极接蜂 鸣器,集电极接电源。蜂鸣器电路连接如下图 2 图 2 蜂鸣器电路 5 5 控制电路控制电路 本次设计中,按键有 7 个.键分别接于 7 根 I/O 线(P2 口),各按键 在实物连接上相互独立,彼此的工作状态互不影响,单片机自带上拉电 阻因此无需外接上拉电阻,用查询法可完成此按键功能。电路连接如下 图 3 图 3 键盘控制电路 6 6 仿真调试仿真调试及及说明说明 6.16.1 调试调试结果结果 图 4 仿真调试 6.26.2 性能分析性能分析 用 AT89C51 单片机的 I/O 口产生一定频率的方波,驱动蜂鸣器,发 出不同的音调,从而演奏乐曲。共有 4 支乐曲,每首乐曲都由相应的按 键控制,并且有开关键、暂停键、上一曲以及下一曲控制键。将源程序 导入单片机后,在 proteus 软件中进行仿真。我通过仿真发现,按下按 键时,存在一定的延时,不能立刻反应,当按下按键时,应必须有足够 的时间。 7 7 系统软件设计系统软件设计 图 5 源程序流程图 7 7 音调、节拍以及编码的确定方法音调、节拍以及编码的确定方法 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度 的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此 单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个 音符唱多长的时间。 7.1.1 音调的确定 不同音高的乐音是用 C、D、E、F、G、A、B 来表示,这 7 个字母就 是音乐的音名,它们一般依次唱成 DO、RE、MI、FA、SO、LA、SI,即唱 成简谱的 1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读 音,这是唱曲时乐音的发音,所以叫“音调” ,即 Tone。把 C、D、E、F、 G、A、B 这一组音的距离分成 12 个等份,每一个等份叫一个“半音” 。 两个音之间的距离有两个“半音” ,就叫“全音” 。在钢琴等键盘乐器上, CD、DE、FG、GA、AB 两音之间隔着一个黑键,他们之间的 距离就是全音;EF、BC 两音之间没有黑键相隔,它们之间的距离 就是半音。通常唱成 1、2、3、4、5、6、7 的音叫自然音,那些在它们 的左上角加上号或者 b 号的叫变化音。叫升记号,表示把音在原来 的基础上升高半音,b 叫降记音,表示在原来的基础上降低半音。例如 高音 DO 的频率(1046Hz)刚好是中音 DO 的频率(523Hz)的一倍,中 音 DO 的频率(523Hz)刚好是低音 DO 频率(266 Hz)的一倍;同样的, 高音 RE 的频率(1175Hz)刚好是中音 RE 的频率(587Hz)的一倍,中 音 RE 的频率(587Hz)刚好是低音 RE 频率(294 Hz)的一倍。 1)要产生音频脉冲,只要算出某一音频的周期(1/频率) ,然后将 此周期除以 2,即为半周期的时间。利用定时器计时这半个周期时间, 每当计时到后就将输出脉冲的 I/O 反相, 然后重复计时此半周期时间再 对 I/O 反相,就可在 I/O 脚上得到此频率的脉冲。 2)利用 AT89C51 的内部定时器使其工作在计数器模式 MODE1 下,改 变计数值 TH0 及 TL0 以产生不同频率的方法。 此外结束符和休止符可以分别用代码 00H 和 FFH 来表示,若查表结 果为 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-5000 00/Fr 低音 DO 的 T=65536-500000/262=63627 低音 DO 的 T=65536-500000/523=64580 低音 DO 的 T=65536-500000/1047=65059 5)C 调各音符频率与计数值 T 的对照表如表 4.1 所示。 表 4.1C 调各音符频率与计数值 T 的对照表 7.1.2 节拍的确定 若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律 (固定的律动) ,而且可以调节各个音的快满度。 “节拍”,即 Beat,简 单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若 1 拍实 0.5s,则 1/4 拍为 0.125s。至于 1 拍多少 s,并没有严格规定,就像 人的心跳一样,大部分人的心跳是每分钟 72 下,有些人快一点,有些 人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数 表示。休止符表示暂停发音。 一首音乐是由许多不同的音符组成的,而每个音符对应着不同频 率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成 音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即 能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利 用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清 楚音乐中的音符和对应的频率,以及单片机定时计数的关系。 表 4.2 节拍与节拍码对照 7.1.3 编码 do re mi fa so la si 分别编码为 17,重音 do 编为 8,重音 re 编 为 9, 停顿编为 0。 播放长度以十六分音符为单位 (在本程序中为 165ms) , 一拍即四分音符等于 4 个十六分音符,编为 4,其它的播放时间以此类 推。音调作为编码的高 4 位,而播放时间作为低 4 位,如此音调和节拍 就构成了一个编码。以 0 xff 作为曲谱的结束标志。 举例 1:音调 do,发音长度为两拍,即二分音符,将其编码为 0 x18。 举例 2:音调 re,发音长度为半拍,即八分音符,将其编码为 0 x22 歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型 为 unsigned char 的数组中。程序从数组中取出一个数,然后分离出 高 4 位得到音调,接着找出相应的值赋给定时器 0,使之定时操作蜂鸣 器,得出相应的音调;接着分离出该数的低 4 位,得到延时时间,接着 调用软件延时。 表 4.4 简谱对应的简谱码、T 值、节拍数 8 8 总结总结 通过对单片机的学习,发现对单片机的硬件设计,软件设计掌握的 深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的 工作原理有了进一步的学习, 同样就有了进一步的认识; 其次软件方面, 在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单 片机的大程序,很有成就感。在一个好的氛围里才能踏下心来做东西, 在这几天课设的时间里,编程中出现问题时,一定要戒骄戒躁,脚踏实 地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难, 我也是这么做的,这在课设中十分重要。 在本次设计的过程中,我发 现很多的问题, 虽然以前没有做过这样的设计但通过这次设计我学会了 很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙 的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一 件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编 程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失 败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西 是很难理解的,更谈不上掌握。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要 理论联系实际,把所学的理论知识用到实际当中,学习单机片机更是如 此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课 程设计中的最大收获。 参考文献参考文献 1 胡有彬.现代微机原理与接口技术M.北京:电子工业出版 社,2002. 2 张友德,赵志英,涂时亮.单片微型机原理.应用与实验M.上 海:复旦大学社,2003. 3 张洪润,张亚凡.单片机原理及应用M.北京:清华大学出版 社,2005. 4 张靖武,周灵彬.单片机系统的 Proteus 设计与仿真M.北京: 电子工业出社,2007. 5 何立明.单片机应用系统设计M.北京:北京航空航天大学出版 社,1990. 6 凌玉华.单片机原理及应用系统设计M.长沙:中南大学出版 社,2006. 7 张毅刚.MCS-51 单片机应用设计M.哈尔宾:哈尔宾工业大学出版 社,1997. 8 谭浩强.C程序设计M.北京:清华大学出版社,2009. 9 王思明,张金敏,张鑫等.单片机原理及应用系统设计M.北京:科 学出版社,2012. 附录附录 源程序代码源程序代码 #include #define uchar unsigned char #define uint unsigned int sbitBEEP = P14; /蜂鸣器 sbitk0=P20; sbitk1=P21; sbitk2=P22; sbitk3=P23; sbitk4=P24; sbitk5=P25; sbitk6=P26; uint code Tone_Delay_Table= 64021,64103,64260,64400,64524,64580,64684,64777, 64820,64898,64968,65030,65058,65110,65157,65178 ; uchar code Song1_Tone=1, 1, 5, 5, 6, 6, 5,4, 4, 3 ,3, 2, 2, 1,5, 5, 4, 4, 3, 3, 2, 5, 5, 4, 4, 3, 3, 2,1,1, 5, 5, 6, 6 ,5,4 ,4, 3, 3, 2, 2, 1,0 xff; uchar code Song1_Time=2,2,2,2,2,3,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2 ,2,2,2,5,2,2,2,2,2,2,5,2,2,2,2,2,2,5,0 xFF; uchar code Song2_Tone=1,2,3,1,1,2,3,1,3,4,5,3,4,5,5,6,5,4,3,1, 5,6,5,4,3,1 ,1,5,1,0 xFF; uchar code Song2_Time=2,2,3,2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ,2,2,2,2,2,2,3,0 xFF; uchar code Song3_Tone = 1,3,3,3,3,5,4,2,5,3,7,6,5,5,7,4,4,3,6,7,2,1,0 xFF; uchar code Song3_Time = 2,1,1,2,1,1,1,2,1,1,3,2,1,1,2,4,1,1,2,1,1,1,0 xFF; uchar code Song4_Tone = 8,9,2,3,7,6,2,3,10,11,1,2,3,1,2,3,3,4,5,6,5,3,5,6,5,3,5,3, 2,1,1,2,3,0 xFF; uchar code Song4_Time = 3,6,7,2,4,5,8,1,2,2,5,5,1,9,1,1,1,1,6,1,1,2,4,1,1,2,1,1,1, 1,1,2,2,1,0 xFF; uchar Song_Index = 0, Tone_Index = 0;/音乐片段索引,音符索 引 uchar *Song_Tone_Pointer, *Song_Time_Pointer;/音符指针, 延时指针 uchar i = 0; uchar j=0,k=0,m=0;/从当前数组中取音符的位置 void DelayMS(uint ms)/延时 uchar t; while(ms-) for (t = 0; t 120; t+); void play0()/按键产生的 INT0 ET0=1; TR0 = 0; k0=1; Song_Index = ( Song_Index + 1) % 4;/切换到下一音乐 switch (Song_Index) case 0:Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1:Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2:Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break; case 3:Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; /从下一段音乐的第 0 个音符开始 i = 0; while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停顿一段时间 continue;/继续播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play1() ET0=1; TR0 = 0; k1=1; Song_Index = ( Song_Index + 3) % 4;/切换到上一段音 乐 switch (Song_Index) case 0:Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1:Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2:Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break; case 3:Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; i = 0;/从上一段音乐的第 0 个音符开始 while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停顿一段时间 continue;/继续播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play2() m=!m; TR0 = 0; k2=1; if(m=0) j=1; TR0=0; ET0=0; if(m=1) ET0=1; k=1; if(j=1)/播放被暂停的音乐 switch (Song_Index) case 0:Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1:Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2:Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break; case 3:Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; /从本一段音乐的第 i 个音符开始 while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停顿一段时间 Song_Index = ( Song_Index + 1) % 4;/播放下 一首音乐 switch (Song_Index) case 0:Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1:Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2:Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break; case 3:Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; continue; TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; if (j=0) j=1; Song_Tone_Pointer = Song1_Tone;/开始播放音乐 Song_Time_Pointer = Song1_Time; i = 0; while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停顿一段时间 Song_Index = ( Song_Index + 1) % 4;/播放 下一段音乐 switch (Song_Index) case 0:Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; break; case 1:Song_Tone_Pointer = Song2_Tone; Song_Time_Pointer = Song2_Time; break; case 2:Song_Tone_Pointer = Song3_Tone; Song_Time_Pointer = Song3_Time; break; case 3:Song_Tone_Pointer = Song4_Tone; Song_Time_Pointer = Song4_Time; break; continue; TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play3() ET0=1; TR0 = 0; k3=1; /切换到第一段音乐 Song_Tone_Pointer = Song1_Tone; Song_Time_Pointer = Song1_Time; Song_Index=0; /从第一段音乐的第 0 个音符开始 i = 0; while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停顿一段时间 continue;/继续播放 TR0 = 1; DelayMS( Song_Time_Pointer Tone_Index * 240); TR0 = 0; i+; return; void play4() ET0=1; TR0 = 0; k4=1; Song_Tone_Pointer = Song2_Tone;/切换到第二段音 乐 Song_Time_Pointer = Song2_Time; Song_Index=1 ; i=0; /从第二段音乐的第 0 个音符开始 while (k0=1 if ( Tone_Index = 0 xFF ) i = 0; DelayMS(2000); /每段音乐播放结束后停

温馨提示

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

最新文档

评论

0/150

提交评论