首页 电子音乐盒设计论文

电子音乐盒设计论文

举报
开通vip

电子音乐盒设计论文目  录 1  引言    1 2  系统总体设计    2 2.1  系统组成框图    2 2.2  电子音乐盒功能框图    2 2.3  设计软件    3 3  硬件设计    4 3.1  AT89S51简介    5 3.2  复位电路和时钟电路    6 3.3  按键电路    8 3.4  LED显示电路    8 4  软件设计    9 4.1  电子音乐的产生    10 4.2  音乐播放    17 4.3  花样灯    19 4.4  源程序代码    21 5  仿真    21...

电子音乐盒设计论文
目  录 1  引言    1 2  系统总体设计    2 2.1  系统组成框图    2 2.2  电子音乐盒功能框图    2 2.3  设计软件    3 3  硬件设计    4 3.1  AT89S51简介    5 3.2  复位电路和时钟电路    6 3.3  按键电路    8 3.4  LED显示电路    8 4  软件设计    9 4.1  电子音乐的产生    10 4.2  音乐播放    17 4.3  花样灯    19 4.4  源程序代码    21 5  仿真    21 5.1  硬件电路的仿真    21 5.2  软件电路的仿真    21 5.3  联调    21 5.4  仿真结果    21 6  电路板焊接与调试    22 6.1  元器件处理    22 6.2  电路焊接    22 6.3  电路调试    23 7  程序烧录、调试与运行结果    24 结  论    26 致  谢    27 参 考 文 献    28 附 录    29 1  引言 电子技术是十九世纪末才开始发展起来的新兴技术,二十世纪发展最迅速,应用最广泛,成为近代科学技术发展的一个重要标志。特别是集成电路的出现和应用,标志着电子技术发展到了一个新的阶段。而计算机技术的高速发展把我们带入了信息社会,同时也加速了电子技术的发展,现在电子技术与计算机技术的结合,为我们的生活带来了翻天覆地的变化,其中单片机在其中扮演着一个重要的角色。 单片微型计算机简称单片机,是典型的嵌入式微控制器。单片机简单的说是一种集成电路芯片,具有强大的处理数据能力,从上世纪80年代开始出现以来,根据市场的需要,正朝着高性能和多品种方向发展趋势发展,进一步向着低功耗、CMOS化、小体积、低价格、高性能、大容量以及外围电路内装化等发展。 现在的单片机已经不仅仅是应用于用来实现数据采集,对象的控制和信号的检测等的工业控制领域,现在在电子玩具、家用电器、通信、机器人、汽车、计算机、图形图像处理等等与我们日常生活息息相关的方面都能看到它的影子,我们的生活离不开它,已经成为生活的“必需品”。 现在随着社会的发展,人类物质文明的提高,对精神文明的要求也已提上日程,音乐可以改变我们的心情,可以改变我们对生活的看法,可以影响我们的命运,音乐也是我们生活中的必需品。小小的音乐盒可以影响我们的心情,可以给我们带来愉悦的精神享受,有时甚至可以改变我们的一生。传统的音乐盒大多是机械式的,体积大,发音单调,不能多次载入歌曲,比较单调。而单片机的出现为我们解决了这一难题,本文设计的音乐盒就是以单片机为核心的电子式音乐盒,具有体积下,重量轻,可多次写入不同的歌曲,存储量大,外观美观等的特点,使用方面,趣味性强,有一定的商业价值。 音乐盒又称八音盒。音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会的的钟塔报时,而将大小的钟 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 上机械装置,被称为“可发出声音的组钟”。 1796年由瑞士钟表匠安托·法布尔发明,转动盒内的链环,可自动演奏音乐。这是最古老的音乐盒。1992年,中国第一台具有知识产权的八音琴在韵升诞生。 音乐盒悠扬的乐声,经常勾起人们对美好往事的回忆,甚至魂牵梦萦,坠入时光岁月的追忆中。300多年来席卷全球市场的音乐盒的最大魅力,也许就在于它能将抽象的音乐,凝固成具象的艺术品。成为人们表达美好情感,追思逝去岁月的最佳选择。现代科技的发展为我们提供了更方便快捷的制作音乐盒的方式,不用经过繁琐的工艺,可以利用单片机自己制作一个简单的电子音乐盒,很用意义。 本文设计的电子音乐盒,就是基于单片机芯片设计制作的电子音乐盒。体积小巧,音质优美且能演奏和弦音乐。电子音乐盒以点为动力,制作工艺简单,且可批量生产,因此价格便宜。基于单片机芯片制作的电子式音乐盒,控制功能很强大,可根据需要选歌,使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,使小小的音乐盒达到愉悦身心的目的。 2  系统总体设计 2.1  系统组成框图 本设计的系统以AT89S51为核心,和按键电路,复位电路,时钟电路,蜂鸣器,LED流水灯电路共同组成。以单片机为核心模块,完成按键的输入,音调的产生,蜂鸣器和LED灯的输出等,系统组成框图如下图2.1所示。 图2.1 系统组成框图 2.2  电子音乐盒功能框图 本次设计主要设计了三个标志位,count1、count2和count3,对应按键电路的key1、 key2和key3,key1用来选择播放不同的歌曲,key2用来改变LED流水灯的显示花样,key3用来暂停和播放歌曲。功能结构图如下图2.2所示。 Key3暂停/播放歌曲 图2.2  电子音乐盒功能框图 2.3  设计软件 本设计主要使用三个软件,proteus、keil和SLISP。用proteus进行硬件电路设计,用keil进行软件设计,使用proteus和keil进行联调,等程序功能都实现且调试好了之后,在使用USB-ISP软件将程序烧入制作好的实物中,实现电子音乐盒的设计与制作。 2.3.1  proteus Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。且在编译方面,它支持IAR、Keil和MPLAB等多种编译器。可以与他们进行联调,结合使用。 2.3.2 keil Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。使用C语言编程,Keil是很好的选择。 Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc公司联合运营。Keil公司制造和销售种类广泛的开发工具,包括ANSI C编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-time kernel)。Keil C51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。Keil公司在2005年被ARM公司收购。而后ARM Keil推出基于uVision界面,用于调试ARM7,ARM9,Cortex-M内核的MDK-ARM开发工具,用于为控制领域的开发。在使用单片机C语言开发时,大多使用keil编程,与proteus进行联调,达到软硬件结合的目的。 2.3.3  SLISP SLISP 是一款单片机下载编程烧录软件。支持USB1.1或USB2.0通信,支持WIN98,WINME,WIN2K,WINXP等操作系统,采用USB口供电,供电输出有500MA自恢复,可有效防止外面短路对USB影响,目标板亦可同时与USB一起供电,下载完成不影响目标板的运行。支持AT89S51及AVR芯片的烧录,速度比并口ISP要快,更稳定,是没有并口的笔记本和电脑使用的最佳选择。使用标准是IDC10接口。 3  硬件设计 本设计主要是以单片机AT89S51芯片为核心,由复位电路,时钟电路,按键电路,蜂鸣器和LED流水灯电路组成,实现的功能如下,电路图如图3.1所示。 a) P3.2,P3.3,P3.5控制按键 b) P1.0—P1.7控制LED流水灯 c) P3.7控制蜂鸣器 d) RST键控制复位 e) XTAL1、 XTAL2接晶振 图3.1  电路图 3.1  AT89S51简介 AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,是C系列的升级版。芯片内集成了通用8位中央处理器和ISP Flash存储单元,实现了ISP下载功能,故而取代了AT89C系列的单片机,在众多嵌入式控制应用系统中得到广泛应用。AT89S51的管脚图如图3.2所示。 图3.2  AT89S51管脚 AT89S51的主要功能特性 a) 4k Bytes Flash片内程序存储器 b) 128 bytes的随机存取数据存储器(RAM) c) 32个外部双向输入/输出(I/O)口 d) 2个中断优先级、2层中断嵌套中断 e) 5个中断源 f) 2个16位可编程定时器/计数器 g) 2个全双工串行通信口 h) 看门狗(WDT)电路 i) 片内振荡器和时钟电路 j) 与MCS-51兼容 k) 全静态工作:0Hz-33MHz l) 三级程序存储器保密锁定 m) 可编程串行通道 n) 低功耗的闲置和掉电模式。 3.2  复位电路和时钟电路 时钟电路和复位电路共同组成了单片机的最小系统,即最少的元件组成的单片机可以工作的系统。是单片机应用中不可缺少的一部分,若没有最小系统,好多的设计将不能完美运行。图3.3为本设计的复位电路和时钟电路。 图3.3  复位电路和时钟电路 3.2.1  复位电路 在上电或复位过程中,控制CPU的复位状态,这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令,执行错误操作,也可以提高电磁兼容性能。所以说单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。若不设置复位电路,或设置不可靠,在程序运行时,可能出现死机、程序跑飞等现象。 单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初始状态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期以上,则CPU就可以响应并将系统复位。单片机主要有手动复位和上电复位两种复位方式。 本设计使用的是手动复位方式,在RST端与正电源VCC之间接一个按钮,当按下按钮时,在复位输入端RST上加入一个高电平,由于人的动作再快也会使按键保持接通数十毫秒,完全能满足复位时间的要求。 3.2.2  时钟电路 单片机晶振的作用是为单片机系统提供基本的时钟信号,单片机晶振提供的时钟频率越高,单片机的运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。 89系列的时钟信号由两种方式产生,一种是利用芯片内部的震荡电路,产生时钟信号的内部方式,一种是时钟信号有外部引入的外部方式。内部时钟方式为:89系列单片机内部有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端,其频率范围为1.2~12MHz,这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。89系列单片机虽然有内部震荡电路,但要形成时钟,必须外接元件.外接晶振以及电容C2,C3构成并联谐振电路,接在放大器的反馈回路中,这种方式称为内部时钟方式。对外接电容C2,C3没有严格的要求,石英晶体的电容值一般使用30PF10PF,陶瓷振荡器一般选择40PF10PF。 本设计的晶振选择11.0592MHz,而不是12MHz,是因为在进行通信时,12M频率进行串行通信时不容易实现标准的波特率,而11.0592M计算时正好可以产生理论误差为零的波特率时钟。基于本设计对串口的要求,选用11.0592MHz的晶振。电容值选择30pF。 若采用外部时钟,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。 3.3  按键电路 AT89S51系列单片机有五个中断源,引脚与中断源的对应关系如表3.1所示 表3.1  AT89S51中断源与引脚的对应关系 中断源 对应的管脚 外部中断0 P3.2/INT0 外部中断1 P3.3/INT1 定时/计数器T0中断 P3.4 T0 定时/计数器T1中断 P3.5 T1 串口中断 P3.6/WR 串口中断 P3.7/RD 本设计按键电路有三个按键key1,key2和key3组成,分别接单片机的P3.2,P3.3和P3.5口。三个按键分别对应程序中的三个标志位count1,count2和count3。P3.2口控制LED流水灯的花样,P3.3口控制歌曲的选择,P3.5口控制歌曲的暂停与继续。按键电路如图3.4所示 图3.4  按键电路 3.4  LED显示电路 由8个LED发光二极管组成,连接方式为共阳极,由于加10K上拉电阻LED灯的亮度太低,最终使用4.7KΩ的电阻。LED接到单片机的P1口,低电平时,LED亮起。发光二极管的亮、灭由内部程序控制,8个LED发光二极管分别对应不同的音阶,所以LED会随着音阶的变化按规律亮、灭。LED流水灯电路如图3.5所示。 图3.5  LED流水灯电路图 4  软件设计 本设计中,相对于简单的硬件电路设计,程序设计的重要性不言而喻。 在本程序中设置了3个标志——count1,count2和count3,分别初始化为1,0和0。key1使得count1在1和4之间切换,key2使得count2在1~5之间切换。Key3使得count3在1~2之间切换。程序检测count1的值,count1等于1时流水灯执行花样一,值为2时,执行花样2程序,共四种花样程序,所以count1的值在1~4之间切换。而count2的值控制着歌曲的播放,count2等于1时播放第一首歌曲,等于2时播放第二首,以此类推。在播放音乐的过程中,检测count3的值,等于1时,暂停播放,等于2时,继续播放。另一方面根据count2的高四位值来切换LED的花样。count1和count2的值是互斥的,设置count1等于1~4时,count2同时设置为0;设置count2等于1~5时,count1也同时设置为0。 从上面的描述可以看出,程序的设计主要可分为这几个模块。音乐产生模块,音乐播放模块,蜂鸣器发声模块,音乐暂停/继续模块,流水灯花样模块,按键与中断模块和延时模块。通过这些模块的相互联系,与硬件相结合,组成一个完整的多功能电子音乐播放系统。主程序主要完成了程序的标志位的赋值,中断的开启,定时/计数器初值以及花样灯程序和音乐程序的调用。程序 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 图如下图4.1所示。 图4.1  主程序流程图 在本程序设计时,音乐的实现是关键。 4.1  电子音乐的产生 单片机演奏音乐基本是单音频率,不包含相应幅度的谐波频率,不能像电子琴那样能奏出多种音色的声音。单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”表示一个音符唱多长的时间。 4.1.1  音频脉冲的产生 音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器的发音,要产生音频脉冲信号,只要算出某一音频的周期,然后将此周期除以2,即为半周期的时间,利用定时器定时这半周期的时间,每当计时到,就将输出脉冲的I/O端口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。 不同音调的乐音是用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个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。通常唱成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)的一倍。 通常利用AT89S5X单片机的内部定时器0,在工作方式1下,改变计数初值TH0和TL0来产生不同的频率。例如,若采用12MHz的晶振,要产生频率为587Hz的音频脉冲时,其音频脉冲信号的周期T=1/587=1703.5775us,半周期的时间为852us,因此只要令计数器计数852us/1us=852,在每次计数852次时,将I/O口反相,就可得到C调中音Re。 计数脉冲值与频率的关系公式如下:     N=Fi2Fr                                                  式(1) N:计算值;        Fi:内部计时一次为1us,故其频率为1MHz; 那么计数值T的求法如下: 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=63628 低音DO的T=65536-500000/523=64580 低音DO的T=65536-500000/1047=65058 综上所述,在11.0592MHz频率下,C调音符频率计数值T的关系如下表4.1所示 表4.1  C调音符频率计数值T的关系 低音 频率 T 中音 频率 T 高音 频率 T Do 262 62018 Do 523 63773 Do 1046 64654 Re 294 62401 Re 587 63965 Re 1175 64751 Mi 330 62491 Mi 659 64137 Mi 1318 64836 Fa 349 62895 Fa 698 64215 Fa 1397 64876 So 392 63184 So 784 64360 So 1568 64948 La 440 63441 La 880 64488 La 1760 65012 Si 494 63506 Si 988 64603 Si 1976 65067 本设计中,在11.0592MHz频率下,中央C调1~7和高8度1~7的计数值T即初值的十六进制数数值为: uchar code chuzhi[]={0xff,0xff,//占位 0xFC,0x8E,0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D, 0xFE,0x47,0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16}; 4.1.2  音乐节拍 若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。 在音乐中,最小的音符为十六分音符,即四分之一拍,所以只要延时函数设置为十六分音符的时间(165MS),其他的音符延时其的整数倍,就可得到相应的节拍。 十六分音符的延时函数为 void delay(uint z)    {    uint x,y;     for(x=z;x>0;x--)         for(y=19000;y>0;y--);} 一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。 每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表4.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表4.3为1/4和1/8节拍的时间设定。 表4.2  节拍码的对照 节拍码 节拍数 节拍码 节拍数 1 1/4拍 1 1/8拍 2 2/4拍 2 1/4拍 3 3/4拍 3 3/8拍 4 1拍 4 2/1拍 5 1又1/4拍 5 5/8拍 6 8 1又1/2拍 2拍 6 8 3/4拍 1拍 A 2又1/2拍 A 1又1/4拍 C 3拍 C 1又1/2拍 F 3又3/4拍 表4.3  1/4和1/8节拍的时间设定 1/4节拍的时间设定 1/8节拍的时间设定 曲调值 DELAY 曲调值 DELAY 调4/4 125毫秒 调4/4 62毫秒 调3/4 187毫秒 调3/4 94毫秒 调2/4 250毫秒 调2/4 125毫秒 4.1.3 移调 一般的歌曲有3/8、2/4、3/4、4/4等节拍类型,但不管有几拍,基本上是在C调下演奏的。如果是C调,则音名唱Do,音名D唱Re,音名E唱Mi,音名F唱Fa,音名G唱So,音名A唱La,音名B唱Ti等。但并不是所有的歌曲都是在C调下演奏的,还有D调,E调,F调,G调等。D调是将C调各音符上升一个频率实现的,即C调下的音名D在D调下唱Do,C调下的音名E在D调下唱Re,C大调各音名F在D调下升高半音符F#唱Mi,C调下的音名G在D调下唱Fa,C调下的音名A在D调下唱So,C调下的音名B在D调下唱La,C调下的音名C在D调下升高半音符C#唱Ti。这种改变唱法成为移调。 E调是在D调的基础上进行移调的,而F调是在E调的基础上进行移调的……各大调音符与音名的关系如表4.4所示。 表4.4  各大调音符与音名的关系 音调 Do Re Mi Fa So La Ti C调 C D E F G A B D调 D E F# G A B C E调 E F# G# A B C D F调 F G A B C D E G调 G A B C D E F# A调 A B C# D E F# G# B调 B C D E F G A 4.1.4  音乐编码 本设计以音乐简谱进行编码。简谱中的1~7,分别编码为1~7,重音1~7,分别编码8、9、A、B、C、D、E。停顿编为0,结束标志为FF。 简谱节拍的对应关系也是编码的关键。在简谱中,全音符是在数字后面加三根延时线的音符,其时值等于四分音符的四倍,打满四拍就得一个全音符。若延时函数为165ms,即十六分音符的时间,则一个全音符需要16次延时。可分为两个8次延时。可编码为0x08,0x08。二分音符是在数字后面加了一根延时线的音符,分音符时值是四分音符的两倍,打两拍得一个二分音符。将其编码为8。而四分音符在简谱里就是不带延时线,没有减时线单单的一个音符,以四分音符为一拍,也就是手打一拍就是一个四分音符的时值。将其编码为4。八分音符是在数字下面划了一根减时线的音符;八分音符时值等于四分音符的一半,而以四分音符为一拍的话,那八分音符也就是半拍。 在本次设计中将其编码为2。十六分音符在简谱里是在数字下面划了两根减时线的音符;十六分音符时值等于四分音符的四分之一,也就是四分之一拍。将其编码为1。符点音符在音符后面加个符点,等于把这个音符的时值再延长它本身时值的一半。比如符点四分音符,时值等于四分音符加八分音符的时值。休止符最好的理解就是你把它当一个音符看待,但是是没有音高的音符,因为它时值也是跟一般音符一样标记的。可编码成0。  举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22 4.1.5  歌曲播放设计 将歌曲的简谱进行编码后,储存在一个数据类型为unsigned char 的数组中。音乐播放程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,这样就建立了音乐库。表4.5为简谱对应的简谱码、T值及节拍数。 表4.5  简谱对应的简谱码、T值和节拍数 简谱 发音 简谱码 T值 节拍码 节拍数 5 低音SO 1 64260 1 1/4拍 6 低音LA 2 64400 2 2/4拍 7 低音TI 3 64524 3 3/4拍 1 中音DO 4 64580 4 1拍 2 中音RE 5 64684 5 1又1/4拍 3 中音MI 6 64777 6 1又1/2拍 4 中音FA 7 64820 8 2拍 5 中音SO 8 64898 A 2又1/2拍 6 中音LA 9 64968 C 3拍 7 中音TI A 65030 F 3又3/4拍 1 高音DO B 65058 2 高音RE C 65110 3 高音MI D 65157 4 高音FA E 65178 5 高音SO F 65217   本次设计一共可播放5首歌曲,分别为《千年之恋》、《寂寞沙洲冷》、《蝴蝶泉边》、 《同桌的你》和《老男孩》,在这里我以《千年之恋》为例,说明一下简谱与编码的对应关系,其他四首歌曲的数据编码将在附录中显示。图4.2为歌曲《千年之恋》的简谱。 图4.2  歌曲《千年之恋》简谱 根据上述规则,《千年之恋》的简谱编码为 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,  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//结束标志 //用一生守候 } 4.2  音乐播放 音乐播放涉及到音调初值的调用,音乐代码的调用,延时函数的调用,流水灯随着音符闪烁,暂停/继续程序的调用等。音调初值,音乐代码和延时函数上面已做介绍,下面依次介绍一下LED与音符的对应,暂停/继续程序以及音乐子程序。 4.2.1  LED与音符的对应 在本设计中,LED流水灯会随着音调的不同相应的亮起。程序会从音乐数组中取出一个数,分离出高4位得到音调,将其值赋值给流水灯音乐花样数组,将P1口相应的位置0,LED灯亮起。表4.5列出了音调与LED灯及P1口的对应关系。 表4.5  C调各音符与LED灯及P1口的对应关系 C调简谱音符 P1口低电平 LED灯亮 编码 1 P1.0 D0 0xfe 2 P1.1 D1 0xfd 3 P1.2 D2 0xfb 4 P1.3 D3 0xf7 5 P1.4 D4 0xef 6 P1.5 D5 0xdf 7 P1.6 D6 0xbf 8 P1.7,P1.6 D.7,D.6 0x3f 9 P1.6,P1.5 D.6,D.5 0x9f A P1.5,P1.4 D.5,D.4 0xcf B P1.4,P1.3 D.4,D.3 0xe7 C P1.3,P1.2 D.3,D.2 0xf3 D P1.2,P1.1 D.2,D.1 0xf9 E P1.1,P1.0 D.1,D.0 0xfc 4.2.2  音乐子程序 音乐播放首先要判断count3(暂停的标志位)的值,由于在定义count3时,已将其初始化为零,对下面的程序没有影响,检测count2(由中断函数控制)的值,count2的值决定歌曲的选择。选定count2的值后,就是与音乐程序相关函数的调用。程序流程图如下图4.3所示。 在音乐播放过程中,若有中断产生,则会执行中断程序。当key2键按下时,产生外部中断1中断,控制count2的值,而count2的值控制歌曲的切换,外部中断1的流程图如图4.4所示,当key3键按下时,产生定时/计数器T1溢出中断,控制count3的值,而count3的值控制歌曲的暂停/继续。定时/计数器T1的溢出中断流程图如图4.5所示,暂停/继续程序的流程图如图4.6所示。         图4.3  音乐播放流程图              图4.4  外部中断1流程图     图4.5  T1中断流程图        图4.6  暂停/继续程序流程图 4.3  花样灯 随着人们生活水平的提高,在物质生活满足的同时,精神生活的要求也越来越高,音乐盒不仅仅要会播放音乐,视觉享受同时也很重要,因此本设计为来增加美观性和多样性,还增加了流水灯的花样功能。 上面已经提到音乐播放时LED灯会随着音符的变化而变化,而花样灯也是要LED灯随着一定的规律变化,所以在使用花样灯这个功能时,要确保音乐程序关闭,即置count2为零,以免程序发生冲突。 本设计一共设计了4种流水灯花样 第一种:从开始D0亮一下,D1亮一下,D1亮起的同时,D0熄灭;紧接着D2亮一下,D3亮起的同时,D2熄灭,以此类推,依次循环点亮。 第二种:从两边向中间移动,首先从D0移向D7,再从D7移向D1,以此类推,往复循环。 第三种:从D1移向D2,再从D2移向D3,以此往复循环。与第一种方式的不同之处为:当D1移向D2时,D1不熄灭, 再从D2移向D3时, D2也不熄灭,以此类推,往复循环。 第四种:一次同时亮四个,开始时D0和D2,D4和D6同时亮,然后依次向右移动, 即D1和D3,D5和D8同时亮,以此类推,往复循环。 四种花样灯的移动示意图如下图4.7所示。   花样一,花样三和花样四   花样二 图4.7  花样灯移动规律示意图 花样灯程序的执行与切换由标志位count1控制,count1取值的不同决定花样的选择。而 count1本身是由外部中断0(P3.2口)控制的,中断程序与外部中断1的程序相类似,这里就不在介绍。花样灯的播放程序是附在主程序中的,图4.8主要说明花样灯的执行流程图,在主程序的介绍中,这一段程序由花样灯执行程序代替,就不在作详细介绍。 图4.8  花样灯执行流程图 4.4  源程序代码 见附录 5  仿真 5.1  硬件电路的仿真 电路的调试主要在proteus中进行。首先检查了画好的电路图,在元器件的选择,电路的连接,线路逻辑上都没有发现错误,然后在单片机芯片没有装入程序时,运行一下电路图。在只上电情况下,LED灯全部点亮,且没有出现过亮的情况,且除了没有装入程序的错误提示,再没有错误提示。 5.2  软件电路的仿真 根据系统的原理结构检查各流程图是否正确, 再根据流程图来检查程序是否也正确。将所有程序组织起来, 在软件环境下运行, 检查程序是否正确。通过对硬件和软件系统的认真检查, 反复测试, 如果没有出现问题即可把源程序编译成HEX文件。 5.3  联调 在keil中, 在Debug中的Use选择Proteus VSM Simulator, 即使用Proteus进行调试。 在proteus中, 双击单片机芯片, 在程序文件选择keil生成的HEX文件的路径, 即把HEX文件装入单片机中, 点击运行, 进行仿真, 就实现了联调。在联调时, 点击功能键, 看程序所涉及的功能是否都能实现, 不能实现的功能, 检查修改相应的程序, 重复上述动作, 直至完成所有设计的功能。 5.4  仿真结果 仿真结果如图5.1所示 a) 按下key1键, 可切换流水灯花样。 b) 按下key2键, 可切换歌曲曲目 c) 按下key3键, 可暂停/继续播放歌曲 图5.1  proteus仿真结果示意图 6  电路板焊接与调试 在使用proteus和keil仿真成功后,就开始着手焊接电路板。 6.1  元器件处理 元器件选好之后,先不着急焊接,还要设计一下元器件在电路板上的布局。Proteus中的电路连接在实际的焊接中,可能会出现线路的交叉、元器件布局不合理等情况,所以需要自己重新布局和排线。 根据proteus中的电路图做参考,先画出AT89S51单片机的引脚图,再以单片机为核心,标出所用到的引脚以及元器件。之后再以用线短和线路不交叉为原则,调整元器件的位置,连线,查看效果,若不理想,重复上述动作,尽量做到元器件布局合理,连接方便,尽量无交叉连线,以便检查。 在本设计中,由于元器件大多与单片机的左侧引脚相连,所以单片机芯片放在电路板的右侧,为了使流水灯放在板的左上侧,扬声器在其右侧。按键电路也放在单片机的左侧靠近电路板边缘,以便操作。 6.2  电路焊接 根据所画电路布局图,在电路板上安排好各个元器件的位置后,使用导线进行焊接。在焊接过程中,认真观察电路图和单片机的各个引脚,不要把元器件与单片机引脚焊错,即张冠李戴。各个焊点也要注意不要出现虚焊和焊点过大,相邻的焊点电路图上显示不能相连的不要连接在一起,以免出错。 本设计电路的焊接可分为三部分,第一,复位电路和时钟电路的焊接。第二,LED花样灯和蜂鸣器的焊接。第四,按键电路的焊接。第五,标准IDC10接口的焊接。第六,电源和接地线的焊接。 在上面的介绍中,除了标准IDC10接口,其他已做详细说明,就不在赘述,只详细介绍一下标准IDC10接口的引脚连接。标准IDC10接口定义如图6.1所示。此为蓝板接口标准,ATMEL公司的ISP标准。AT89S51系列引脚与下载线对应连接如表6.1所示。 图6.1  标准IDC10接口 表6.1  AT89S51系列引脚与下载线对应连接 AT89S51系列引脚 下载线接口 P1.5 MOSI P1.6 MISO P1.7 SCK RST /RES GND GND VCC VCC 由于此接口的另一端与计算机相连,所以可使用计算机为其提供电源,为了节约成本,在制作实物时,就没有添加电池盒。 6.3  电路调试 电路板焊接完成之后,不要急着上电,先与电路图对照一下,检查元器件的选择和连线正确性,导线的连接牢固程度,有错误的连焊情况及时改正。上电后,LED灯为全亮状态,蜂鸣器没有杂音,各个元器件没有过热的状况,此种状态下说明电路板的硬件部分的调试可暂时告一段落。 7  程序烧录、调试与运行结果 硬件电路焊接调试完成后,还不能实现音乐盒的功能,还需要在单片机中烧入程序。本设计使用ISP下载线(与计算机相连的为USB口,单片机端相连的为标准IDC10接口),使用USBISP软件向单片机中烧入程序。烧入程序操作页面如下图7.1所示。 图7.1  烧入软件页面 为确保导入的程序不受影响,先擦除,擦除次数最多可达4096次,然后调入Flash,即装入keil中生成的.Hex文件,然后点击自动,软件将自动执行校验和调入Flash文件。程序正确烧入后,实物就会按照程序执行。若不能达到预期的功能,检查调整电路,找出原因,直至正常执行。 在开始导入程序后,LED灯能闪烁,但蜂鸣器没有发声,在用万用表检查与P3.7口相连的蜂鸣器的电压变化,发现始终是低电平,意识到蜂鸣器是无源器件,单片机端口的电压不足以使其正常工作,需要外接电压。就将其接地的一端连到电源上,这次上电之后,音乐就能播放了,按键功能也都能实现,调试工作完成。     调试完成后运行设计,在播放音乐时,LED灯会随着音符的变化而相应的点亮,按下key2键可切换歌曲。按下暂停键后,音乐暂停播放,再按一下,音乐继续。按下key1键,切换到花样灯样式,LED灯会随着所选花样闪烁。按下复位键,程序将从头开始执行。图7.2为播放歌曲模式下播放La音符时的实物图。 图7.2  总体运行图 结  论 设计是基于单片机的电子音乐盒,以AT89S51单片机芯片为核心,复位电路、时钟电路、按键电路、LED电路和蜂鸣器电路组成了一个简易的电子音乐盒。使用proteus软件画出电路图,C语言编程,proteus和keil联调成功后,焊接好电路板并导入程序后制作出一个多功能音乐盒。音乐盒的主要实现以下功能: 1)花样灯有四种不同的闪烁花样,按key1键可切换花样 2)可播放《千年之恋》、《寂寞沙洲冷》、《蝴蝶泉边》、《同桌的你》和《老男孩》这五首歌曲,按key2键可切换歌曲 3)在歌曲播放过程中,LED灯可根据音调的变化而相应的灯亮起 4)按key3键可暂停歌曲 设计电路简单,程序也不复杂,实物的使用性也高。由于没有显示设备,所以不能显示唱的是哪首歌曲。若加一个数码管,可以显示数字,说明一下是第几首歌曲,还可以使用LCD屏显示歌曲的名字。进一步改进音乐盒的实用性和可读性。 致  谢 时光荏苒,有事便是大学毕业季,春梦秋云,聚散真容易。离校的日期已日趋临近,毕业论文的完成也随之进入尾声。从开始进入课题到论文的顺利完成,一直都离不开老师、同学、朋友给我热情的帮助,在这里请接受我诚挚的谢意! 要特别感谢我的导师赵瑞梅老师,她一丝不苟、严谨细致的作风一直是我工作、学习中的榜样;他循循善诱的教导和不拘一格的思路给予我无尽的启迪。在做毕业设计的过程中,她一直是我的指路灯,使我一步步思路清晰的完成设计。无论多忙,都会尽量抽出时间,耐心为我们解答疑问。 感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。 当然不能忘了我亲爱的329的室友们,是你们和我共同维系着彼此之间感情,维系着寝室那份家的融洽,给予我生活和学习以及各个方面的积极影响。不久, 我们就要离别,就要“分家”了。我相信距离不能使我们生分,只会是我们越来越珍惜身边的人。离别,是为了再次相聚,不管将来身在何方,终将重逢,大学生活会是我们最美好的时光。 最后,要感谢我的学校,为我提供了良好的环境,使我充实了自己,也把欢乐带给别人,在这健康积极向上的环境里,我不光获得了知识,更学会了思考和解决问题的方式,和对待生活的态度。这将使我一生受益。 参 考 文 献 1  高锋.单片微型计算机原理与接口技术.北京:科学出版社,2003 2  吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用.北京:清华大学出版社,2002 3  余文俊.8051C语言学习.北京:中国水利水电出版社,2003 4  贾金玲 .单片机原理及应用.成都:电子科技大学出版社 ,2004  5  王东峰,王会良,董冠强.单片机C语言应用百例.北京:电子工业出版社,2009 6  周润景.基于Protues的电路及单片机系统设计与仿真.北京:北京航空航天大学出版社,2006 7  徐爱钧.单片机的原理与应用:基于Protues虚拟仿真技术.北京:机械工业出版社,2010 8  谢维成,杨加国主编,董秀成主审.单片机原理与应用及C51程序设计.北京:清华大学出版社,2006 9  秦龙.MSP430单片机C语言应用程序设计实例精讲.北京电子工业出版社,2006 10  李建忠.单片机原理及应用.西安电子科技大学出版社,2008.2. 11  陈忠平.基于protues的51系列单片机设计与仿真(第2版).北京:电子工业出版社 2012.5 12  J. Frank. Instrumentation for Process Measurement and Control. BEIJING: Science Publishing House.2000, 60-79. 13  He Jian-jun, Yu Shou-yi. Temperature Intelligent Control System of Large-Scale Standing Quench Furnace.Journal of Electronic Science and Technology of China, 2005,(1),72-88 14  Jong Sun Ko.A robust.Digital position control of brushless DC motor with dead beat load torque observer.IEEE transaction on industrial electronics.1993 vol.40 512520  15  R.Kenjo and S.Nagamori.Permanent magnet and brushless,DC motors  Tokyo:Sogo.1984,96       附  录 源程序及注释 #include #define uchar unsigned char #define uint  unsigned int sbit key1=P3^2;//按key1可切换花样 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P3^7;//蜂鸣器连续的IO口 sbit key3=P3^5;//暂停/继续键 //***************花样灯花样编码 Uchar  code  huayang1[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf}; Uchar  code  huayang2[]= {0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,0xef,0xfb,0xdf,0xfd,0xbf,0xfe}; Uchar  code  huayang3[]= {0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; uchar  code  huayang4[]={ 0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0}; uchar count1;//花样标志    uchar count2;//歌曲标志    uchar timeh,timel,i,count3=0; //---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符 //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,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//结束标志//用一生守候 }; uchar code jmszl[]={ //寂寞沙洲冷 0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,//自你走后心憔悴 0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,//白色油桐风中纷飞 0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28,//落花似人有情这个季节 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,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,0x81,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,0x61,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 hdqb[]={//蝴蝶泉边 0x68,0x68,0x31,0x21,0x31,0x21,0x31,0x21,0x31,0x21,0x31,0x21,0x31,0x21,0x31,0x21,0x31,0x21,0x64,0x82,0x92,0x82,0x62,0x54,0x64,0x02,0x12,0x22,0x32,0x52,0x82,0x32,0x34,0x62,0x68,0x68,0x08,0x64,0x82,0x92,0x82,0x62,0x54,0x58,0x58,0x58,0x58,//前奏 0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x11,0x61,0x13,//我看到满片花儿的开放 0x32,0x12,0x61,0x51,0x12,0x22,0x31,0x23,//隐隐约约有声歌唱 0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x11,0x61,0x21,0x12,//开出它最灿烂笑的模样 0x32,0x12,0x12,0x61,0x51,0x12,0x22,0x12,0x12,    //要比那日光还要亮 0x08,0x04,0x62,0x82,0x82,0x91,0x81,0x62,0x51,0x31,0x52,0x82,//荡漾着青澄流水的泉啊 0x62,0x51,0x31,0x52,0x81,0x81,0x62,0x51,0x31,0x51,0x23,//多么美丽的小小村庄 0x08,0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x61,0x13,//我看到淡淡飘动的云儿 0x32,0x12,0x11,0x22,0x11,0x18,0x18,//印在花衣上 0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x11,0x61,0x13,//我唱着妈妈唱着的歌谣 0x32,0x11,0x11,0x12,0x61,0x51,0x12,0x22,0x31,0x23,//牡丹儿绣在金匾上    0x32,0x52,0x51,0x62,0x51,0x32,0x21,0x11,0x61,0x21,0x12,//我哼着爸爸哼过的曲调 0x32,0x11,0x11,0x12,0x61,0x51,0x12,0x22,0x12,0x12,//绿绿的草原上牧牛羊 0x08,0x04,0x62,0x82,0x82,0x91,0x81,0x62,0x51,0x31,0x52,0x82,//环绕着扇动银翅的蝶啊 0x62,0x51,0x31,0x52,0x82,0x62,0x51,0x31,0x61,0x53,//追回那遥远古老的时光 0x62,0x82,0x82,0x91,0x81,0x62,0x51,0x31,0x51,0xA2,0x91,//传诵着自由勇敢的鸟啊 0x91,0x81,0x82,0x81,0x82,0x61,0x61,0x53,0x54,//一直不停唱 0xD1,0xC1,0xA1,0xC1,0xA1,0x91,0x81,0x91,//间奏 0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x11,0x61,0x13,//叶儿上轻轻跳动的水花 0x32,0x12,0x12,0x61,0x51,0x11,0x22,0x31,0x24,//偶尔沾湿了我发梢 0x32,0x52,0x52,0x61,0x51,0x32,0x21,0x11,0x51,0x61,0x11,0x31,//阳光下那么奇妙的小小人间 0x34,0x11,0x32,0x11,0x18,0x18,//变模样 0x08,0x08,0x38,0x58,0x36,0x22,0x18, 0xFF//啊!啊! }; uchar code tzdn[]={//同桌的你 0xC6,0xC6,0xC6,0xA2,0xB2,0xC5,0xE6,0xD6,0xD6,0x02,0x92,0xA2,0xB6,0xB6,0xB6,0xB2,0xA2,0x82,0x86,0x86,//前奏 0x52,0x52,0x52,0x32,0x42,0x52,0x56,0x76,//明天你是否会想起 0x62,0x62,0x62,0x62,0x42,0x62,0x56,0x56,//昨天你写的日记 0x52,0x52,0x52,0x52,0x72,0x62,0x52,0x44,//明天你是否还惦记 0x46,0x42,0x42,0x42,0x42,0x33,0x21,0x18,0x18,//曾经最爱哭的你 0x82,0x82,0x82,0x82,0x52,0x62,0x84,0x82,0xA6,//谁娶了多愁善感的你 0x92,0x92,0x92,0x93,0x81,0x72,0x66,0x66,//谁看了你的日记 0x72, 0x72, 0x72, 0x72, 0x72,0x82,0x96,0x56,//谁把你的长发盘起 0x72,0x72,0x82,0x92,0x82,0x72,0x86,0x86,0xFF//谁给你做的嫁衣 }; uchar code lnh[]={ //老男孩 0x52,0x51,0x51,0x52,0x52,0x52,0x61,0x51,0x52,0x42,0x32,0x61,0x71,0x72,0x81,0x72, 0x52,//那是我日夜思念深深爱着的人呐 0x02,0x51,0x51,0x62,0x11,0x11,0x12,0x22,0x32,0x52,//到底我该如何表达 0x02,0x01,0x51,0x42,0x51,0x21,0x22,0x12,0x24,0x04,//她会接受我吗 0x52,0x51,0x51,0x52,0x52,0x52,0x61,0x51,0x52,0x42,0x32,0x61,0x71,0x72,0x82,0x72,0x52,//也许永远都不会跟他说出那句话 0x02,0x51,0x51,0x62,0x11,0x11,0x12,0x22,0x32,0x52,//注定我要浪迹天涯 0x02,0x01,0x51,0x42,0x51,0x21,0x22,0x12,0x14,//怎么能有牵挂 0x82,0x72,0x62,0x71,0x81,0x82,0x92,0xA2,0x72,//梦想总是遥不可及 0x02,0x51,0x51,0x62,0xA1,0x91,0x92,0x82,0x84,//是不是应该放弃 0x82,0x72,0x62,0x71,0x81,0x82,0x92,0xA2,0x72,//花开花落又是一季 0x2,0x51,0x51,0x62,0xA1,0x91,0x92,0x82,0x88,0x08,//春天啊你在哪里 0x08,0x04,0x02,0x81,0x81,0xC2,0xC1,0xC1,0xC2,0xC2,0xC2,0x71,0x71,//青春如同奔流的江河 0x72,0x71,0x71,0xC2,0xC1,0xC1,0xC2,0xD2,0xC2,0x81,0x81,//一去不回来不及道别 0x82,0x81,0x91,0xA2,0x91,0xB2,0xA2,0xA2,0x91,0xB1,0xB2,0xA2,0xA2,0x91,0xB1,0xB2,0xA2,0xC4,//只剩下麻木的我没有了当年的热血 0x02,0x81,0x81,0xC2,0xC1,0xC1,0xC2,0xC2,0xC2,0x71,0x71,//看那漫天飘零的花朵 0x72,0x71,0x71,0xC2,0xC1,0xC1,0xC2,0xD2,0xC2,0x81,0x81,//在最美丽的时刻凋谢 0x82,0x81,0x91,0xA2,0x91,0xB1,0xB2,0xA2,0xA2,0x91,0x81,0x82,0x72,0x88, 0xFF//有谁会记得这世界她来过 }; //----------------------------简谱音调对应的定时器初值--------------------------- //适合11.0592M的晶振 uchar code chuzhi[]={0xff,0xff,//占位 0xFC,0x8E,0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D,//中央C调1-7 0xFE,0x47,0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16//高八度1-7 }; uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc}; //将音调转化为对应的LED样式 void delay1(uint z);//延时1MS void delay(uint z);//延时165MS,即十六分音符 void song(); void beep();//蜂鸣器叫一声 main() {    uchar x;     count1=0;//流水灯无花样     count2=1;//唱第一首歌     EA=1;//开总中断     EX0=1;//开外部中断0     IT0=1;//外部中断0下降沿触发方式     EX1=1;//开外部中断1     IT1=1;//外部中断1下降沿触发方式     TMOD=0x61;//定时器0工作在方式1,计数器1工作在方式2     TH0=0;//T0设初值     TL0=0;     ET0=1;     TH1= 0XFF;//T1设初值     TL1=0xff;     TR1= 1;//开T1中断     ET1=1;     PT1=1;//设T1高优先级     while(1)     {         if(count1!=0)         {             switch(count1)//花样灯程序             {                 case 1:                     for(x=0;x<14;x++)                     {                         P1=huayang1[x];                         beep();                         delay1(300);                         if(count1!=1)                             break;                        }                 break;                 case 2:                     for(x=0;x<16;x++)                     {                         P1=huayang2[x];                         beep();                         delay1(300);                         if(count1!=2)                             break;                        }                 break;                 case 3:                     for(x=0;x<8;x++)                     {                         P1=huayang3[x];                         beep();                         delay1(300);                         if(count1!=3)                             break;                        }                 break;                 case 4:                     for(x=0;x<14;x++)                     {                         P1=huayang4[x];                         beep();                         delay1(300);                         if(count1!=4)                             break;                        }                 break;                 }         }         else      //歌曲程序调用         {             song();             delay1(1000);         }     } } void int0() interrupt 0 { count2=0;     i=0;     EA=0;//关总中断     delay1(1);//去抖     if(key1==0)     {         EA = 0;         count2=0;//不让蜂鸣器唱歌         count3=0;         TR0=0;         count1++;         if(count1==5)         count1=1;     }     EA=1;//开总中断 } void int1() interrupt 2 {     EA=0;//关总中断     delay1(1);//去抖     if(key2==0)     {         count1=0;//流水灯无花样         TR0=1;         i=0;//从头开始唱         count2++;         if(count2==6)             count2=1;     }     EA=1;//开总中断 } void timer0() interrupt 1    //用于产生各种音调 {     TH0=timeh;     TL0=timel;     fm=~fm; } void timer1()interrupt 3  //控制count3的值 {   delay1(5);   if(key3==0)   {     count3++;     if(count3==3)     count3=1;   } } void song() {     uint temp;     uchar jp;//jp是简谱     i=0;     while(1)     {         if(count3 == 1)//暂停         {             TR0 = 0;         }         if(count3 == 0 || count3 == 2)//继续         {             EA = 1;             TR0 = 1;             if(count2==0)                    break;             if(count2==1)    //选曲                 temp=qnzl[i];             if(count2==2)                 temp=jmszl[i];             if(count2==3)                 temp=hdqb[i];             if(count2==4)                 temp=tzdn[i];             if(count2==5)                 temp=lnh[i];             if(temp==0xff)                 break;             jp=temp/16; //取数的高4位             P1=yinyue[jp];             if(jp!=0)             {             timeh=chuzhi[jp*2];             timel=chuzhi[jp*2+1];             }             else             {             TR0=0;             fm=1;//关蜂鸣器             }             delay(temp%16); //取数的低4位             TR0=0;    //唱完一个音停10MS             fm=1;             delay1(10);             TR0=1;             i++;         }     }     i=0;     TR0=0;     fm=1; } void delay(uint z)    //延时165MS,即十六分音符 {    uint x,y;     for(x=z;x>0;x--)         for(y=19000;y>0;y--); } void delay1(uint z)    //延时1MS {    uint x,y;     for(x=z;x>0;x--)         for(y=112;y>0;y--); } void beep()    //蜂鸣器叫一声 {    uchar i;     for(i=0;i<50;i++)     {    fm=~fm;         delay1(1);     }     fm=1; }
本文档为【电子音乐盒设计论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_337177
暂无简介~
格式:doc
大小:630KB
软件:Word
页数:31
分类:生活休闲
上传时间:2017-09-19
浏览量:103