1、- -Yibin University电子信息技术与科学专业题 目 基于单片机的音乐盒设计_专 业 电子信息科学与技术 学生 伟 学 号 110303013 年 级 物电2021级 班 级硕勋励志班 指导教师 甘德成 2013年 06 月 05 日目 录引言11概述21.1 课题意义21.2设计方案21.3研究容22 系统总体方案介绍32.1 系统组成框图32.2 音乐盒的功能构造图33硬件设计33.1 总体设计框图43.2各局部硬件设计及其原理43.2.1 LED显示电路设计与原理43.2.2时钟振荡电路43.3 硬件电路图及功能54软件设计64.1音调、节拍以及编码确实定方法64.1.1
2、音调确实定74.1.2 节拍确实定74.1.3 编码85调试95.1 检查硬件连接95.2 检查软件系统95.3 测试结果95.3.1总体运行图9参考文献9附录A 程序源代码及注释10- word.zl- -引言21世纪,电子技术获得了飞速的开展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的开展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。目前,单片机正朝着高性能和多品种方向开展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路装化等几个方面开展。单片机应用的重要意义还在于它从根本上改变了传统
3、的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大局部功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的平安保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。随着科学技术的进步和社会的开展,人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人们已经能够
4、利用计算机等工具高效准确地对之进展处理,但要想将处理完的信息及时,清晰地传递给别人,还必须通过寻求更加卓越的显示技术来实现。单片机技术与液晶显示技术的结合,使信息传输交流向着智能可视化方向迅速开展。随着人类社会的开展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。1概述本设计是以AT89C51芯片的电路为根底,外部加上放音设备,以此来
5、实现音乐演奏控制器的硬件电路,通过软件程序来控制单片机部的定时器使其演奏出优美动听的音乐。用户可以按照自己的喜好选择音乐并将其转化成机器码存入单片机的存储器中。对于不同型号的单片机只需要相应的改变一下地址即可。该软、硬件系统具有很好的通用性,很高的实际使用价值,为广阔的单片机和音乐爱好者提供了很好的借鉴。1.1 课题意义音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会的钟塔报时,而将大小的钟表装上机械装置,被称为“可发出声音的组钟。音乐盒有着300多年的开展历史,是人类文明开展的历史见证。传统的音乐盒多是机械音乐盒,其工作原理是通过齿轮带动一个带有铁钉的铁桶转动,铁桶上的铁钉撞击铁片
6、制成的琴键,从而发出声音。但是,机械式的音乐盒体积比拟大,比拟笨重,且发音单调。水、灰尘等外在因素,容易使部金属发音条变形,从而造成发音跑调。另外,机械音乐盒放音时为了让音色稳定,必须放平不能动摇,而且价格昂贵,不能实现大批量生产。本文设计的音乐盒,是基于单片机设计制作的电子式音乐盒。与传统的机械式音乐盒相比更小巧,音质更优美且能演奏和弦音乐。电子式音乐盒动力来源是电池,制作工艺简单,可进展批量生产,所以价格廉价。基于单片机制作的电子式音乐盒,控制功能强大,可根据需要选歌,使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,使音乐盒的功能更加丰富。1.2设计方案设
7、计一个基于AT89C51系列单片机的音乐盒,利用按键切换演奏出不同的乐曲。蜂鸣器发出某个音调,与之相对应的LED亮起。使用按键,用来切换歌曲,1.3研究容1演奏音乐模式:演奏完整的一首的歌曲,八路LED随着音乐变化。2按下按键进入演奏音乐模式,再按切换歌曲,共两首歌曲。此电路的程序只占用了1K左右,可编制更多的音乐,使系统的功能更加强大。2 系统总体方案介绍2.1 系统组成框图音乐盒的系统构造以AT89C51单片机位控制核心,加上1个按键、时钟复位电路、蜂鸣器、LED模块组成。单片机负责接收按键的输入,根据输入控制音乐播放曲目和音乐把戏灯的显示样式以及蜂鸣器发音。系统组成框图如图2.1所示。图
8、2.1 系统组成框图2.2 音乐盒的功能构造图音乐盒的功能构造如图2.2所示。Key负责切换播放歌曲,播放歌曲共4首,分别是挥着千年之恋、寂寞沙洲冷和祝你平安、和相信我们会创造奇迹。3硬件设计3.1总体设计框图图3.1总体设计框图3.2各局部硬件设计及其原理3.2.1LED显示电路设计与原理LED显示电路是由8个LED发光二极管组成,连接方式为共阳极,LED接到单片机的P1口,假设为低电平,可使LED亮起。发光二极管的亮、灭由部程序控制,8个LED发光二极管分别对应不同的音阶,所以LED会随着音阶的变化按规律亮、灭。3.2.2 时钟振荡电路AT89C51中有一个用于构成部振荡器的高增益反相放大
9、器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反应元件的片外石英晶体或者瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反应回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的上下、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,我们推荐电容使用30PF10PF,而如果使用瓷振荡器建议选择40PF10PF。用户也可以采用外部时钟。采用外部时钟的电路如图示。这种情况下,外部时钟脉冲接到XTAL1端,即部时钟发生器的输入端,XTAL2那么悬空。由于外部时钟信号是通过一个2分频触
10、发器后作为部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。振荡器电路图如下:图3.3单片机部、外部振荡电路3.3 硬件电路图及功能总体硬件电路实现功能如下,如图3.4所示1) 电路中用P3.2控制按键。2) P1.0P1.7控制LED。3) P3.7控制蜂鸣器。4) 电路为12MHZ晶振频率工作,起振电路中C1、C2均为30PF。图3.3 硬件电路图4软件设计在本程序中设置了标志count,初始化为0。按键使得count在1、2、3、4之间切换,程序检测count的值,count等于1时播放第一首歌曲,等于2时播放第二首
11、。等于3播放第3首。等于4时播放第4首。4.1音调、节拍以及编码确实定方法一般说来,单片机演奏音乐根本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调和节拍表示一个音符唱多长的时间。4.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这一组音的距离分成1
12、2个等份,每一个等份叫一个“半音。两个音之间的距离有两个“半音,就叫“全音。在钢琴等键盘乐器上,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的一倍
13、,中音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=1912u
14、s,因此只要令计数器计时956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO523Hz。计数脉冲值与频率的关系公式如下:N=Fi2FrN:计算值;Fi:部计时一次为1us,故其频率为1MHz;4) 其计数值的求法如下:T=65536-N=65536-Fi2Fr例如:设K=65536,F=1000000=Fi=1MHz,球低音DO261Hz。中音DO523Hz。高音的DO1046Hz的计算值T=65536-N=65536-Fi2Fr=652Fr=65536-500000/Fr低音DO的T=65536-500000/262=63627低音DO的T=65536-500000
15、/523=64580低音DO的T=65536-500000/1047=650595) C调各音符频率与计数值T的对照表如表4.1所示。表4.1 C调各音符频率与计数值T的对照表低音频率T参数中音频率T参数高音频率T参数Do2621908229Do523956115Do10465757Do2771805217Do554903108Do11095454Re2941701204Re587852102Re11755151Re3111608193Re62280497Re12454848Mi3301515182Mi65975991Mi13184545Fa3491433172Fa69871686Fa1397
16、4343Fa3701351162Fa74067681Fa14804141So3921276153So78463877So15683838So4151205145So83160272So16613636La4401136136La88056868La17603434La4641078129La93253664La18653232Si4941012121Si98850661Si197630304.1.2 节拍确实定假设要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律固定的律动,而且可以调节各个音的快满度。“节拍,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。假设1拍实
17、0.5s,那么1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大局部人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些根底知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。表4.2节拍与节
18、拍码对照节拍码节拍数节拍码节拍数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位代表音符的节拍,图5.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,那么1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。表4.3 1/4和1/8节拍的
19、时间设定曲调值DELAY曲调值DELAY调4/4125毫秒调4/462毫秒调3/4187毫秒调3/494毫秒调2/4250毫秒调2/4125毫秒4.1.3 编码do re mi fa so la si分别编码为17,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位在本程序中为165ms,一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的完毕标志。举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。举例2:音调re,发音长度为半拍,即八分音符,将其编
20、码为0x22歌曲播放的设计。先将歌曲的简谱进展编码,储存在一个数据类型为unsignedchar 的数组中。程序从数组中取出一个数,然后别离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着别离出该数的低4位,得到延时时间,接着调用软件延时。表4.4 简谱对应的简谱码、T值、节拍数简谱发音简谱码T值节拍码节拍数5低音SO16426011/4拍6低音LA26440022/4拍7低音TI36452433/4拍1中音DO46458041拍2中音RE56468451又1/4拍3中音MI66477761又1/2拍4中音FA76482082拍5中音SO864898A2
21、又1/2拍6中音LA964968C3拍7中音TIA65030F3又3/4拍1高音DOB650582高音REC651103高音MID651574高音FAE651785高音SOF65217- word.zl- -4.2 软件程序设计见附录A- word.zl- -5调试5.1 检查硬件连接在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正确,例如:晶振电路的连接,复位电路是否设计正确。5.2 检查软件系统1根据系统的原理构造检查各流程图是否正确,再根据流程图来检查程序是否也正确。2将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现
22、问题即可把源程序编译成HEX文件装载到单片机中,对硬件进展仿真。5.3 测试结果5.3.1总体运行图图5.1 系统总体运行图- word.zl- -附录A 程序源代码及注释/*功能:音乐可调可调使用说明:k1作为音乐选择键,用于切换音乐。作者;伟班级;物电11级励志班日期:2013-06-06学院工作室 所有*/#include #define uchar unsigned char#define uint unsigned intsbit key=P32;/按key2可切换歌曲sbit beep=P37;/蜂鸣器连续的IO口uchar count;/歌曲标志uchar timeh,timel
23、,i; /定时初值高位和低位/-简谱-/编程规那么:字节高位是简谱,低位是持续时间,/代表多少个十六分音符/1-7代表中央C调,8-E代表高八度,0代表停顿/最后的0是完毕标志uchar code qnzl= /千年之恋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
24、,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
25、,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,
26、/最美丽的感动 会值得 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff/完毕标志/用一生守候;/*/uchar code jmszl= /寂寞沙洲冷0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,/自你走后心憔悴0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15 /白色油桐风中纷飞0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,/落花似人有情 这个季节0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0
27、x51,0x52,/河畔的风放肆拼命地吹0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,/不断拨弄离人的眼泪0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54,/那样浓烈的爱再也无法给0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,/伤感一夜一夜0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,/当记忆的线缠绕过往支离破碎0x02,0x32,0x
28、81,0x81,0x81,0x81,0x62,0x52,0x34,/是慌乱占据了心扉0x31,0x81,0x81,0x81,0x61,0x91,0x82,/有花儿伴着蝴蝶0x51,0x51,0x51,0x51,0x31,0x61,0x53,/孤雁可以双飞0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,/夜深人静独徘徊0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52,/当幸福恋人寄来红色分享喜悦0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0
29、x61,0x31,0x56,/闭上双眼难过头也不敢回0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34,/仍然捡尽寒枝不肯安歇微带着懊悔0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16,/寂寞沙洲我该思念谁0xff;/*/uchar code znpa=/祝你平安 0x32,0x52,0x54,0x56,0x32,0x12,0x12,0x61,0x16,/你的心情 现在好吗0x32,0x52,0x51,0x62,0x54,0x22,0x32,0x51,0x2
30、2,0x31,0x23,/你的脸上 还有微笑吗0x32,0x11,0x11,0x61,0x31,0x32,0x21,0x32,0x32,0x12,0x11,0x61,0x31,0x34,/人生自古 就有许多愁和苦0x21,0x32,0x21,0x21,0x22,0x11,0x61,0x21,0x31,0x21,0x22,/请你多一些开心0x52,0x51,0x52,0x53,0x23,0x14,0x02,0x02,0x02,0x02,0x02,/少一些烦恼0x82,0x82,0x32,0x53,0x22,0x12,0x12,0x62,0x54,/祝你平安 噢 祝你平安0x62,0x62,0x6
31、2,0x13,0x61,0x11,0x52,0x32,0x32,0x23,/让那快乐 围绕在你身边0x12,0x12,0x32,0x53,0x22,0x12,0x12,0x62,0x54,/祝你平安 噢 祝你平安0x33,0x21,0x14,0x62,0x21,0x32,0x22,/你永远都幸福0x51,0x51,0x51,0x52,0x21,0x32,0x14,/是我最大的心愿0xff ;/-简谱音调对应的定时器初值-/适合11.0592M的晶振uchar code cuzhi= 0xff,0xff,/占位 0xFC,0x8E,/中央C调1-7 0xFC,0xED, 0xFD,0x43, 0
32、xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D, 0xFE,0x47,/高八度1-7 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 ; uchar yinyue=0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff;/uchar yinyue=0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0;/将音调转化为对应的
33、LED样式/*/延时165MS,即十六分音符void delay(uint z)uint x,y;for(x=z;x0;x-) for(y=19000;y0;y-);/*/ /延时1MSvoid Delay_ms(uchar z)uchar x,y;for(x=z;x0;x-) for(y=112;y0;y-);/*歌曲函数*/void song()uchar temp;uchar jp;/jp是简谱i=0;while(1)if(count=0)break; /选曲if(count=1) temp=qnzli;else if(count=2)temp=jmszli;else if(count=
34、3)temp=znpai;if(temp=0xff)break; /歌曲完毕返回jp=temp/16; /取数的高4位P1=yinyuejp;if(jp!=0) /简普位0表示停顿timeh=cuzhijp*2;timel=cuzhijp*2+1;elseTR0=0;beep=1;/关蜂鸣器delay(temp%16); /取数的低4位TR0=0; /唱完一个音停10MSbeep=0;Delay_ms(10); TR0=1; i+;beep=0;/*主程序*/main()count=3;/唱第一首歌EA=1;/开总中断EX0=1;/开外部中断0IT0=1;/外部中断0下降沿触发方式TMOD=0x01;/定时器0工作在方式1TH0=0;TL0=0;ET0=1;P2=0; while(1)while(count!=0) TR0=1;song();delay(10);TR0=0;beep=0;void int0() interrupt 0EA=0;/关总中断Delay_ms(2);/去抖if(key=0)count+;if(count=4) count=0;P2=count;EA=1;/开总中断void timer0() interrupt 1 /用于产生各种音调TH0=timeh;TL0=timel;beep=beep;- word.zl- - word.zl