基于单片机的音乐流水灯设计(共18页).doc
精选优质文档-倾情为你奉上单片机原理及系统课程设计评语:考勤(10)守纪(10)过程(40)设计报告(30)答辩(10)总成绩(100)专 业:电气工程及其自动化班 级: 电气1003班 姓 名: 李鹏飞 学 号: 指导教师: 兰州交通大学自动化与电气工程学院2013 年 3 月 7 日专心-专注-专业基于单片机的音乐流水灯设计摘要本设计是一种基于AT89C52单片机音乐控制彩灯的方案,实现单片机演奏音乐,并且对LED彩灯随音符频率的不同而闪烁发光。本方案以AT89C52单片机作为主控核心,通过三极管放大电流使蜂鸣器播放音乐,利用编程实现循环点亮24个太极图案的LED彩灯,根据用户需求可以编写若干种亮灯模式.,蜂鸣器可以根据用户需求改写编程播放各种音乐。本方案具有电路结构简单、体积小、元器件少、能耗低等优点。在美丽的都市夜晚音乐彩灯为我们的生活增添了无限光彩。音乐彩灯具有更广阔的发展天地。关键字:AT89C51;LED彩灯;音乐 AbstractThe design is based on AT89C52 microcontroller music control lantern program microcontroller playing music, and note the frequency of different flashing light LED Lantern with. Program AT89C52 microcontroller as the master core through the transistor amplifier to the current buzzer play music programming cycle LED lantern lit 24 Taiji patterns can write certain kinds of lighting modes according to user needs, beep can rewrite the program play a variety of music based on user demand. The program has a simple circuit structure, small size, fewer components and lower energy consumption. Add unlimited glory for our lives in the beautiful city night music Lantern. Music lantern has a broader development world.Keywords: AT89C51,LED Lantern,music1 引言1.1设计目的:设计是学生理论联系实际的重要实践教学环节,是对学生进行的一次综合性专业设计训练。通过专业综合设计使学生获得以下几方面能力:(1) 进一步巩固和加深学生所学一门或几门相关专业课(或专业基础课)理论知识,培养学生设计、计算、绘图、计算机应用、文献查阅、报告撰写等基本技能;(2) 培养学生实践动手能力及独立分析和解决工程实际问题的能力;(3) 培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风。 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。学习单片机的最有效方法就是理论与实践并重,现在我把基于单片机控制的音乐流水灯设计作为单片机课程设计的题目,通过查找资料和仿真实验的结合,在实践应用中得以更加深入的了解和掌握单片机技术。1.2 设计要求: (1) 用24个发光二极管作为显示电路,能够循环的显示灯的亮灭;(2) 流水灯按照多种方式闪烁,同时播放<<仙剑奇侠传>>和<<笑傲江湖>>的音乐。 2 设计方案及原理通过控制单片机的内部定时器的定时时间来产生不同的脉冲频率,以驱动蜂鸣器发出不同音节的声音,利用延时子程序来控制音调的节拍。 为了编程方便,通常是将简单的音符和相应的节拍转换成为定时常数和延时常数,利用查表法得到定时常数,分别控制定时器产生相应的脉冲频率和脉冲频率的持续时间,当持续时间到时,程序自动查找下一个音符的定时常数和延时常数,这样就可以听到悦耳动听的歌声。 音调是由不同的频率产生的,而每一个音调都是有一个音符和一个节拍组成,音符决定该音调的高低,节拍决定了该音调是多少拍。因此一个音调是由两个字节组成的。根据音符字节产生该大小次数的延时,声音输出口取反,就可以得到该音调的高低音。根据设置单位的延时长短,可以控制音乐演唱速度。因此算法很简单,定义单片机的一个I/O端脚为声音输出口,在规定的节拍内,根据音符字节的大小产生延时,将声音输出口不断的置高置低(即取反),就可以得到该音调。只要选取合适的单位节拍延时,就可以输出动听的音乐。3 硬件设计3.1 硬件框图:复位电路晶振电路STC89C52音乐电路彩灯电路 图1 硬件框图3.2 彩灯电路:彩灯电路由三组共24个LED发光二极管组成,红、黄、绿各一组,每组各8个LED灯,每个LED发光二极管串联一个200欧姆的限流电阻。三组彩灯电路各配一个74LS373控制各组彩灯的集体亮灭,从而使彩灯的控制更为灵活,为实现彩灯的多样闪烁模式创造了条件。彩灯整体造型为一个太极图案,三种颜色彩灯组合巧妙,搭配合理,闪烁非常漂亮,再配以音乐仙剑奇侠传和笑傲江湖别有一番江湖气氛。图4 彩灯电路仿真图3.3 音频放大电路音频功放电路中喇叭由LM386功率放大芯片驱动,此电路喇叭的音质要比采用蜂鸣器发出的音质好很多,声音清晰洪亮,效果非常好。 图5 音频放大电路图 3.4 中断服务说明:与每类I/O设备相关的进程都有一个靠近内存底部的地址,称作中断向量。 它包括中断服务程序的入口地址。中断服务程序:处理器处理“急件”,可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理“急件”的程序被称为中断服务程序。当中央处理器正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个紧急事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的部件称为中断系统,申请CPU中断的请求源称为中断源,单片机的中断系统一般允许多个中断源,当多个中断源同时向CPU请求中断时,就存在一个中断优先权的问题。通常根据中断源的优先级别,优先处理最紧急事件的中断请求源,即最先响应级别最高的中断请求。 4 软件设计软件是相对硬件而言的,它是指由计算机硬件执行,用来完成一定任务的所有程序及数据,即为运行、管理和维护计算机所编制的程序的总和。 单片机的软件系统比较简单,它不需要复杂的操作系统来进行系统管理,只使用于管理单片机系统工作的管理程序(称为监控程序)和用于完成实际具体任务的应用程序。而对于简单的单片机应用系统,只要有为实现控制目的而直接行的应用程序就行了。本设计软件部分具体分为音乐程序和流水灯程序,音乐程序主要由二首歌曲组成,流水灯程序主要由24盏LED灯组成,编程则通过C语言进行编写。 开始根据程序执行LED灯闪烁和音乐演奏检查是否按下按钮执行结束YN图5 程序设计流程图 5 系统仿真与实际调试将音乐流水灯电路在Proteus 7电路仿真软件上仿真效果非常好,经过数十次调试,音乐由最初的“跑调”变得优美动听,这主要在于调节每个音符的发音时长,还有音乐中段与段之间的停顿时长,只要配合歌曲原曲边听边反复修改,调整效果是非常显著的:还有一项巨大的工程是调节LED流水灯的闪烁规律,让灯亮起来并不难,但是让灯闪的漂亮并不是一件易事,这需要几十次的调节,如果有自己的创意就更好了,我设计的彩灯共有8种闪烁方式,每一种都包含了我的灵感和创意,都是经过数十次试验精选出来的。程序的调试是所有工作中的难点,同时也是最为繁琐的,经过一个星期的调试,整体效果有了质的提升,也终于满足了自己的要求。图6 Proteus仿真图6 总结在这次单片机课程设计中遇到了很到困难,尤其是程序调试。为了达到自己与预期的制作效果着实下了一番工夫,但最终还是圆满实现了设计任务。从拿到设计课题到仿真出电路,再到基本程序框架的建立其实并没有花费太多时间,因为之前有过设计流水灯的经验,所以感觉还是比较轻松的。但是要想让流水灯闪的漂亮却并非易事,这要考虑循环方式,循环周期,更要考虑到LED灯的排列图案。采用边看仿真效果边对症修改程序的方式,经过几十次的修改,精雕细琢力求完美,最终设计出数种非常好看的闪烁方式,个人非常满意。还有就是音乐谱曲,这个任务非常繁琐,也是采用边听边改程序的方式,为了让喇叭播放出完美的韵律,都不知道听了多少次仙剑奇侠传和笑傲江湖,听到难以忍受的地步,是真的听腻了,但为了让自己的作品能有更好的效果我还是坚持了下来,好几个晚上都熬到深夜一两点,但每看到闪烁的彩灯更加迷人,听到播放的乐曲愈来愈动听,自己还是感到很满足的。经过这次课程设计,我可以更加熟练的运用单片机的知识,更为灵活的选择硬件设备,还使自己对单片机编程开发环境Keil软件和电路仿真软件Proteus有了更深的了解,今后可以较为熟练的完成类似的电路仿真设计。参考文献1 王思明.单片机原理及应用系统设计.科学出版社,2012,(1)2 冯博琴.微型计算机原理与接口技术.清华大学出版社,2007,(2).3 谭浩强编著.C程序设计(第三版)M.北京:清华大学出版社,2005.附录附录A:实物图 图1图2 附录B:元件清单器件名称型号个数单片机89C521个芯片74LS3733个芯片LM3861个开关1个电阻4.7K1个电阻10K2个电阻1K8个电阻4701个电阻20024个电阻101个扬声器0.5W1个集成运放LM3861个电解电容10uf2个电解电容47uf1个瓷片电容100pf1个瓷片电容10pf1个瓷片电容22pf2个晶振12MHZ1个发光二级管24个IP座40管脚1个IP座20管脚3个IP座8管教1个万能板2个导线若干附录C:程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit sbit K1=P10; /设定开关口sbit d1=P30; /设定绿灯LM373控制口sbit d0=P31;设定红灯LM373控制口sbit d2=P32;设定黄灯LM373控制口sbit BEEP=P36;喇叭输出端口 uchar th0_f; uchar tl0_f; void delay_1ms(unsigned int t)延时程序 unsigned char i,j; for(t;t>0;t-) for(i=34;i>0;i-) for(j=13;j>0;j-); /四阶35个音符对应的T0中断初值,及输出频率对照表static code freq372 = 0xA9,0xEF, /00220HZ ,1 /0 0x93,0xF0, /00233HZ ,1# /1 0x73,0xF1, /00247HZ ,2 /2 0x49,0xF2, /00262HZ ,2# /3 0x07,0xF3, /00277HZ ,3 /4 0xC8,0xF3, /00294HZ ,4 /5 0x73,0xF4, /00311HZ ,4# /6 0x1E,0xF5, /00330HZ ,5 /7 0xB6,0xF5, /00349HZ ,5# /8 0x4C,0xF6, /00370HZ ,6 /9 0xD7,0xF6, /00392HZ ,6# /10 0x5A,0xF7, /00415HZ ,7 /11 0xD8,0xF7, /00440HZ 1 /12 0x4D,0xF8, /00466HZ 1# /13 0xBD,0xF8, /00494HZ 2 /14 0x24,0xF9, /00523HZ 2# /15 0x87,0xF9, /00554HZ 3 /16 0xE4,0xF9, /00587HZ 4 /17 0x3D,0xFA, /00622HZ 4# /18 0x90,0xFA, /00659HZ 5 /19 0xDE,0xFA, /00698HZ 5# /20 0x29,0xFB, /00740HZ 6 /21 0x6F,0xFB, /00784HZ 6# /22 0xB1,0xFB, /00831HZ 7 /23 0xEF,0xFB, /00880HZ 1 /24 0x2A,0xFC, /00932HZ 1# /25 0x62,0xFC, /00988HZ 2 /26 0x95,0xFC, /01046HZ 2# /27 0xC7,0xFC, /01109HZ 3 /28 0xF6,0xFC, /01175HZ 4 /29 0x22,0xFD, /01244HZ 4# /30 0x4B,0xFD, /01318HZ 5 /31 0x73,0xFD, /01397HZ 5# /32 0x98,0xFD, /01480HZ 6 /33 0xBB,0xFD, /01568HZ 6# /34 0xDC,0xFD, /01661HZ 7 /35 0x00,0x00,;static code music1707 = / 仙剑奇侠传 28,28,26,26,28,28,28,28,28,28,21,21,26,26,26,26, 24,24,23,23,21,21,21,23,21,21,19,19,28,28,28,28, 16,16,19,19,24,24,24,24,16,16,19,19,26,26,26,26, 24,24,23,23,21,21,21,21,21,21,21,21,28,28,26,26, 28,28,26,26,21,21,21,21,24,24,26,26,28,28,28,28, 28,28,28,28,28,28,31,31,28,28,24,24,26,26,26,26, 26,26,26,26,21,21,21,21,24,24,28,28,26,26,26,26, 24,24,24,24,21,21,21,21,21,21,21,21,21,21,21,21, 36,36,36, 28,28,28,28,26,26,28,28,28,28,28,28,21,21,26,26,26,26,24,24,23,23,21,21,21,23,21,21,19,19, 16,16,16,16,16,16,19,19,24,24,24,24,16,16,19,19, 26,26,26,26,28,24,23,23,21,21,21,21,21,21,21,21, 21,21,21,21,23,23,23,23,23,23,23,23,23,23,23,23, 21,21,21,21,24,24,26,26,28,28,28,28,28,28,28,28, 31,33,31,31,28,28,24,24,26,26,26,26,26,26,26,26, 21,21,21,21,24,24,28,28,26,26,26,26,24,24,24,24, 21,21,21,21,21,21,21,21,21,21,21,21,36,36,36,36, / 笑傲江湖 16,16,16,16,21,21,21,16,19,19,19,19,19,19,16,16, 14,14,16,16,19,19,21,21,16,16,16,16,16,16,16,16,16,16,16,21,21,21,16,19,19,19,19,19,19,16,16,14, 14,16,16,19,19,21,19,16,16,16,16,16,16,14,12,12, 12,12,14,14,16,16,14,14,14,14,14,14,14,12,9,9, 9,12,14,14,16,16,19,19,19,21,19,19,16,14, 12,12,12,14,14,14,16,16,14,14,14,14,14,12,12,12,9,9, 9,12,14,16,16,19,21,21,21,21,21,21,21, 36,36, 16,16,16,16,21,21,21,16,19,19,19,19,19,19,16,16, 14,14,16,16,19,19,21,19,16,16,16,16,16,16,16,16,16,16,16,21,21,21,16,19,19,19,19,19,19,16,16,14, 14,14,16,19,19,21,19,16,16,16,16,16,16,14,12,12, 12,12,14,14,16,16,14,14,14,14,14,14,14,12,9,9, 9,12,14,14,16,16,19,19,19,21,19,19,16,14,12,12, 12,14,14,14,16,16,14,14,14,14,14,12,12,12,9,9, 9,12,14,16,16,19,21,21,21,21,21,21,21,14,14,14, 14,14,16,16,14,12,12,12,12,12,9,9,12,14,14,14,14,14,16,16,14,12,12,9,9,12,9,12, 14,14,14,14,14,16,16,14,12,12,12,12,12,9,12, 14,14,14,14,14,19,19,16,16,16,16,16,16,16,16, 9,9,9,9,9,9,9,14,14,14,14,14,14,16,14, 12,12,12,12,12,12,14,9,9,9,9,9,9,7,7,9,9,9,9, 9,7,7,4,4,4,4,4,7,7, 2,2,2,2,2,2,2,4,4,4,4,4,4,4,9,9,9,9,9,9,9,9,14,14,14,14,14,14,16,16, 12,12,12,12,12,12,14,14,9,9,9,9,12,9, 7,7,7,7,7,7,9,9,4,4,4,2,4,4,7,7, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, ;void PlayMusic(int k) / 音乐程序 unsigned int i; TMOD =0x01; /定时器/计数器工作方式寄存器负值,设定定时器0工作方式1 TR0 = 1; /启动定时器0 ET0 = 1; /定时器0容许 EA = 1; /打开中断总控制while(1) for(i=0;i<707;i+) if(music1i = 36) /停顿音处理 TR0=0; delay_1ms(190); else TR0=1; if(k=1) /判断开关是否处于开启位置(是则播放音乐,否则停止) if(i<100)P0=_crol_(P0,1); P2=P2;if(i=100)P0=0x22;P2=0x18;if(i>100&&i<200) P0=_cror_(P0,1);P2=P2;if(i=200) P0=0x55;P2=0x18;d1=1;if(i>200&&i<300) d1=d1; d2=d2;if(i=300) P0=0x36;d1=d2=0;if(i>300&&i<400)P0=_cror_(P0,1);if(i=400)P0=0xaa;if(i>400&&i<500)P0=_cror_(P0,1);if(i=500)P0=0x01;if(i>500&&i<600)P0=_cror_(P0,1);if(i=600)P0=0xfe;if(i>600)P0=_cror_(P0,1); tl0_f=freqmusic1i0; /给定时器赋值 th0_f=freqmusic1i1;delay_1ms(190); if(K1=1) /判断K1开关是否处于开启的位置(实则重复音乐,否则停止) EA=0; P0=0xff; P2=0xff; break; timer0() interrupt 1 /中断子程序 TL0=tl0_f; TH0=th0_f; BEEP=BEEP; void main() /主程序 uchar b,m; while(1) while(1) if(K1=1) break; if(K1=0) P3=0x00; delay_1ms(100);P0=0xff;P2=0xff;delay_1ms(1000); for(m=0;m<2;m+) P0=0x03;P2=0x00;delay_1ms(1000); for(b=0;b<5;b+) P0=_crol_(P0,1); delay_1ms(500); P0=0x00; P2=0x81; delay_1ms(300); P2=0x42; delay_1ms(300); P2=0x24; delay_1ms(300); P2=0x18;delay_1ms(300);P2=0x00;P0=0x80;delay_1ms(1000);P0=0x00;P2=0x18;delay_1ms(300);P2=0x24;delay_1ms(300);P2=0x42;delay_1ms(300);P2=0x81;delay_1ms(300);P2=0x00;P0=0x55;delay_1ms(300); for(b=0;b<8;b+) P0=_cror_(P0,1); delay_1ms(300); P0=0x00;delay_1ms(500); for(b=0;b<7;b+) P0=0xff;P2=0xff;delay_1ms(500);P0=0x00;P2=0x00;delay_1ms(500); if(K1=1) P3=0x07; break; P0=0x03; P2=0x00;PlayMusic(1); /播放音乐