《音乐发生器毕业设计论文.doc》由会员分享,可在线阅读,更多相关《音乐发生器毕业设计论文.doc(34页珍藏版)》请在三一办公上搜索。
1、毕业设计说明书(论文)设计(论文)题目: 单片机音乐发生器 专 业: 应用电子 班 级: 应电G09-3 学 号: 0973204 姓 名: 王宝旭 指导教师: 王娜丽 2011年4月20日目录摘 要1绪 论211研究的目的和意义212国内外研究的现状及发展趋势2121国内外研究的现状213音乐发生器的扩展3第1章 设计方案411 设计方案论证4111 方案一4112 方案二4113 方案三5113 方案比较6第2章 硬件设计721 电路组成及工作原理7211 电路组成7212 电路工作原理722 AT89C51的简介8221 AT89C51功能概述8222 AT89C51的管脚图9223 A
2、T89C5 单片机的引脚介绍9224 晶振电路1023 扬声器电路1024 显示电路1125 更换歌曲电路1126 复位电路1227 程序存储器外部扩展电路12第3章 软件系统设计1331 软件流程设计13第4章 系统调试1441 常用调试工具14411 Keil C 软件14412 PROTEUS软件1542 系统调试及性能分析15心得体会16参考文献17附 录18附录1 音乐发生器电路原理图18附录2 元件明细表19附录3 源程序代码20摘 要近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为
3、一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。当今,利用单片机控制音乐播放多不胜举,音乐芯片也相当之多,而利用单片机存储音乐,控制播放最为广泛。它有功能多价格优外围电路简单的特点,很受音乐爱好者及音乐芯片制造商的青昧。本文中,用单片机芯片及少数外围电路控制音乐播放。本设计是以单片机AT89C51为核心数据处理器件,由数码管显示调整歌曲的曲号和播放中,显示歌曲的曲号,四个数据输入按键组成七功能分别是对歌曲曲号进行加一设置、对歌曲曲号进行减一设置、对歌曲曲号进行复位、对在播放中的歌曲进行暂停;元件以低耗、高能、耐用、精确、易于操作
4、等为优先考虑因素。采用独立式输入按钮,用作对歌曲播放的设置,通过按键将单片机I/0 口的电平拉低,单片机检测到I/O口电平为0时,在下一曲按钮中,自动将歌曲的编号加一;在播放/暂停按钮中,自动将歌曲暂停、播放;在上一曲按钮中自动将歌曲的编号减一。当播放歌曲时,会在数码管上显示该歌曲的序号。在显示时使用的是由一个七段数码管显示,在本设计中根据实际情况采用的是动态显示方法并通过查表法,将其在数码管上显示出来,P1口低7位为字选段输入端。通过查表将字型码送给7段数码管显示数字。软件去抖动功能,如果“开始键”按下就向下执行,否者跳到开始。AT89C51单片机的内存较小,就用了一个74LS373锁存器和
5、27512外部扩展芯片对该单片机进行了内存的扩充,增大了它的存储空间,让他可以存储足够多的歌曲。该音乐发生器的论文详细介绍了其硬件结构和设计方法,整个设计简单实用,功能完整。结论11研究的目的和意义音乐电声的一个重要内容就是电子音乐。电子琴的出现,开辟了音乐的一个新天地。但是自从电子合成器问世以来,电子音乐就又进入了一个更高的阶段。 目前,由于电子音乐的普及,电子合成器(合成器实际上是一台声音的频率合成仪,可以制作各种声音,改变各种音色)可以解决相当一部分的歌唱及舞厅的伴奏问题。可以事先制作伴奏音乐或背景音乐,而不需要乐队,或者部分代替乐队。由于音乐合成器制作和修改方便,成本低,音乐丰满,所以
6、市场需求量很大,因此,世界许多国家的厂商都不断地在发展并推出新的型号,每年都要更新换代。当前的发展趋势是不断的采用先进技术,例如有的合成器有“跟随”功能,即经预置,每一个音后可以跟随一个二度或三度音,“重叠”功能,轻奏或重奏时可以发不同音调或音色;另外,合成器还向轻便、使用操作方便等方向发展。电脑音乐也许不会成为今后音乐的主流,但它在整个人类音乐史上的地位已经不容置疑地确立了,相信它会越来越深入地浸透到音乐创作和欣赏的领域中,并且将在一定程度上影响人们对音乐的理解和诠释。用单片机制作的音乐发生器也会越来越多,这将必然成为一种趋势。12国内外研究的现状及发展趋势 121国内外研究的现状随着以法、
7、德、意为代表的欧洲和以美国为代表的电子音乐、计算机音乐早期的大力发展,国际上许多国家纷纷开始引入电子音乐研究与创作。因此,电子音乐创作作为音乐科技领域发展的重要标志,在风格上也体现出比以往任何时代都鲜明的个性化特征。六十年代,美国物理学家Robert Moog 研制出了小型实用的电子合成器。从此,首先在欧美地区,合成器作为新型的乐器被音乐家尤其是流行音乐家所采用并飞快的流行开来。由于美国雄厚的经济和科技基础,在早期计算机音乐获得巨大成功后,越来越多的音乐家和科学家步入到计算机音乐的研究与开发的领域中来,他们一起工作、共同开展研究,许多新产品和新设计不断涌现。13音乐发生器的扩展熟练的运用89C
8、51单片机定时器产生固定频率的方波信号,推动喇叭发出旋律,按下单键可以演奏预先设置的歌曲旋律,最重要的是自己还可以通过程序设计输入自己喜欢的歌曲来演奏中,本设计采用简易音阶编码直觉式输入法方便设计音乐旋律,可以扩充其功能如下:1. 设计三个按键操作来更改歌曲的序号;2. 可以按照歌曲的序号来播放歌曲;3. 可以显示播放中歌曲的序号;4. 可以存储多首歌曲;第1章 设计方案11 设计方案论证111 方案一利用AT89C51和LM386(音频功放) 组成的音乐播放器(1)功能特色。LM386(音频功放)来实现音乐的播放。(2)硬件设计。电路以AT89C51为主控制器,LM386(音频功放)来实现的
9、。晶振采用12MHz,音乐信号由P30口输出,经喇叭发声而播放歌曲,框架图如图1-1所示。图1-1方案二框架图AT89C51单片机LM386音频功放扬声器(3)软件设计。程序中根据每个音符对应频率由定时器T0产生。为了程序调用方便,每个音符都对应一个编码,占用一个字节。112 方案二利用AT89C51、74LS373锁存器和27512外部扩展组成的音乐播放器(1)功能特色对内存进行了扩展,可以播放三首以上的歌曲。(2)硬件设计电路以AT89C51为主控制器,74LS373和27512进行外部程序存储器的扩展,播放/暂停键为播放/暂停歌曲,下一曲键和上一曲键分别为调整歌曲的下一曲和上一曲选择键的
10、按钮。晶振采用12MHz,音乐信号由P30口输出,经喇叭发声而播放歌曲如图1-2所示框架图。AT89C51单片机复位电路外部扩展电路图1-2方案二框架图扬声电路显示电路晶振电路更换歌曲电路(3)软件设计程序中根据音选取的是C调三个8度内的音符,共16个音。每个音符对应频率由定时器T0产生。为了程序调用方便,每个音符都对应一个编码,占用一个字节。在程序中以查表的方式加载计数初值。当值为00H时表示空拍,与节拍码配合完成节拍发音。节拍码也占一个字节,其总时间长度等于基本时间乘以节拍码的值。节拍码值为01H时,表示当前乐曲结束,为00H时,表示全部乐曲结束。为了编码简单,一般节拍码高半字节表示整拍,
11、低半字节表示分数,只要基本延时设定恰当即可并且在按开始按钮后,可以播放歌曲。113 方案三(1)功能特色本播放器是由4X4组成的16个按钮矩阵键盘,设计成16个音组成的声音发生器并且能够播放音乐。(2)硬件设计电路以AT89C51为主控制器,下一曲、上一曲分别为上一曲、下一曲选择键的按钮并且采用利用4X4组成的16个按钮矩阵键盘来每按一个键,发出一个音。晶振采用12MHz,音乐信号由P30口输出,经喇叭发声而播放歌曲,如图1-3所示。AT89C51单片机晶振电路4*4矩阵键盘扬声器图1-3方案三框架图(3)软件设计程序中音选取的是C调三个8度内的音符,共16个音。每个音符对应频率由定时器T0产
12、生。为了程序调用方便,每个音符都对应一个编码,占用一个字节。在程序中以查表的方式加载计数初值,为了编码简单,一般节拍高半字节表示整拍,低半字节表示分数,只要基本延时设定恰当即可,为了及时响应键盘操作,键扫描指令安排在基本延时时间子程序中,按键每按下一次,乐曲数目计数器R5加1或减1,根据R5的内容转向不同的乐曲并且在按下开始按钮后,就开始播放歌曲。113 方案比较从以上三种方案,方案三只能利用按键发音,可以发出16个音并且只能播放三首歌曲,而方案二进行了内存的扩充而可以播放三首以上的歌曲,在播放的过程中,方案二可以随时的暂停播放歌曲的进度,而方案一不具有该功能。方案二从实现的功能上优于方案一、
13、三,方案二在使用上及其功能的实现上都较方案三简洁,并且由于单片机具有优越的高集成电路性,使其工作速度更快、效率更高。另外AT89C51单片机采用12MHz的晶振,提高了信号的测量精度,并且使该系统可以通过软件改进来扩张功能。通过方案对比,最终选择方案二,音乐发生器电路原理图见附录1所示。第2章 硬件设计21 电路组成及工作原理211 电路组成音乐发生器的电路设计方框图如图2-1所示,电路原理图见附录1所示,主要由单片机控制系统、调整歌曲序号、显示歌曲序号、内存外部扩充电路、复位电路等组成。AT89C51单片机扬声电路显示电路晶振电路更换歌曲电路复位电路外部扩展电路图2-1 音乐发生器框架图单片
14、机AT89C51是本系统的核心,它主要负责控制各个部分协调工作。在其外围接上:复位电路、数码管、按钮及扬声器。元件为:晶振X1、电容、电阻、与非门、非门、数码管、扬声器、四个按键、74LS373锁存器、27512外部程序存储器扩展。其中,四个按键分别是上一曲、下一曲、暂停/播放、复位。P10-P16是位选口,P32、P36、P37共同为上、下歌曲的调整口,实现对歌曲的调整操作,并且加减调整歌曲的曲号,P33口为歌曲的暂停/播放按钮,可对播放中的歌曲进行暂停/播放,P30为蜂鸣器的控制口。212 电路工作原理 本音乐发生器是用单片机来设计制作完成,其功能的实现主要通过软件编程来完成, AT89C
15、51单片机片内带有4KB和外部程序存储器扩展的256K的内存,并且允许在系统内改写或用编程器编程。该音乐发生器的效率较高,其误差主要由晶振自身的误差所造成。存储歌曲是采用的外部扩展,更改歌曲号是通过下一曲和上一曲来实现的,按键将单片机I/0 口的电平拉低,单片机检测到I/O口电平为0时,自动改变显示的数,实现更改的功能。显示是使用一个的七段共阴极数码管显示,设计中根据实际情况采用的是动态显示方法,其中通过查表将字型码送给7段数码管显示的数字。当播放歌曲时,会在数码管上显示该歌曲的编号提示现在正在播放的歌曲的序号。软件去抖动,如果“开始键”按下就向下执行,否者跳到开始。采用延时程序进行对歌曲的播
16、放。22 AT89C51的简介221 AT89C51功能概述自从1971年微型计算机问世以来,随着大规模集成电路技术的进一步发展,导致微型计算机正向两个主要方向发展:一是高速度、高性能、大容量的高档微型机及其系列化向大、中型计算机的挑战;另一个是稳定可靠、小而廉、能适应各种控制领域需要的单片机。MCS51系列是Intel公司在1980年推出的高档8位单片机,具有性能价格比高、品种多、兼容性强、开发用的仿真机较完善等优点,所以在国际上和国内的占有率相当高。它拥有8位微处理器和控制器,内含一个一位布尔运算处理器,可直接对数据的位进行操作和运算,特别适用于逻辑控制。内部含有4KB的程序ROM并且在外
17、部扩展了256K的存储空间,2个16位的计数/定时器。本次采用的是AT89C51单片机,其电路如2-2所示,它的中断功能比较强,有5个中断源,即外部中断2个,定时器中断2个,串行中断1个,有2个中断优先级。中断控制电路主要包括用于中断控制的四个寄存器:定时器控制寄存器TCON,串行口控制寄存器SCON,中断允许控制寄存器IE,中断优先级控制寄存器IP等。内部时钟振荡器,全双工方式的串行接口(UART),两极中断优先权的6个中断源/5个中断矢量的中断逻辑。哈佛结构的存储器组织,支持高达64K为单周期指令,支持六种寻址方式。最高时钟振荡频率可达12MHZ,大部分指令执行时间为1s,乘、除指令为4s
18、。222 AT89C51的管脚图MCS-51系列单片机采用40引脚双列直插式封装(DIP),其引脚排列和逻辑符号如图2-3所示,4个并行口共有32根引脚,可分别作地址线、数据线和I/O线;2根电源线;2根时钟振荡电路引脚和4根控制线。a)b)图2-2 AT89C51芯片信号引脚图223 AT89C5 单片机的引脚介绍AT89C51单片机是高性能单片机,因为受引脚数目的限制,所以有许多引脚具有第二功能,各引脚功能说明如下:(1)输入/输出口线A 口8位双向口线B 口8位双向口线C 口8位双向口线D 口8位双向口线(2)ALE地址锁存控制信号在系统扩展时,ALE用于控制把口输出的底8位地址送入锁存
19、器锁存起来,以实现低位地址和数据的分时传送。此外由于ALE是以六分之一晶振频率的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用。(3)外部程序存储器读选通信号在读外部ROM时有效(低电平),以实现外部ROM单元的读操作。(4)访问程序存储器控制信号当信号为低电平时,对ROM的读操作限定在外部程序存储器;而当信号为高电平时,对ROM的读操作是从内部程序存储器开始,并可延续至外部程序存储器。(5)RST 复位信号当输入的复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位操作。(6)XTAL1和XTAL2外接晶体引线端当使用芯片内部时钟时,这两个引线端用于外接石英晶体和微
20、调电容;当使用外部时钟时,用于接外部时钟脉冲信号。(7)电源、地线GNDVCC、GND。VCC一般接+5V电源,GND接地。图2-3 晶振电路24 晶振电路MCS-51片内有一个高增益的反相放大器,其输入端为引脚XTAL1和输出端为引脚为XTAL2,用于外接石英晶体振荡器和微调电容,构成稳定的的自激振荡器,其发出的脉冲直接送入内部的时钟电路,如图2-3所示。电容C1和C2对频率有微调作用,电容一般取20pF左右。晶体振荡频率范围是12Mz12MHz,一般情况下,选用振荡频率为12MHz的石英晶体。振荡脉冲信号经过内部时钟发生器进行二分频之后,才成为单片机的时钟信号。23 扬声器电路本设计是采用
21、蜂鸣器用来发出声音,当你按下播放按钮时,单片机就开始运行程序,蜂鸣器开始读程序而播放你所要播放的歌曲,电路如图2-4所示。24 显示电路图2-4 扬声电路本设计显示是采用一个七段共阴极LED显示,当片选信号为0时,数码就会点亮,主要是用来显示播放中歌曲的序号、选择歌曲来播放等信息。其分别利用单片机的P10口至P17口与数码管相连接,完成字段码显示歌曲的号数。数码管的另一引脚接低电平(接地)。电路如图2-5所示。图2-5 显示电路25 更换歌曲电路采用3个按钮作为更换歌曲按键,上一曲、下一曲和播放/暂停按键分别是歌曲的序号的加、减和对歌曲进行暂停/播放。利用三个上拉电阻和与非门、非门来实现歌曲的
22、选择和暂停,单片机的P32口至P37口始终是高电平,当没有按键按下时,就会一直的播放歌曲。电路如图2-6所示。26 复位电路AT89C51的复位是由外部的复位电路来实现的。复位引脚RST通过一个施密特触发器用来抑制噪声,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。图2-7 复位电路本设计是采用上电自动复位,上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用12MHZ时C取20PF。27 程序存储器外部扩展电路图2-8程序存储器外部扩展电路本设计是采用了一个74LS373锁存器和一个27512
23、程序存储器外部扩展组成,其主要的功能就是为了在外部扩展单片机内存,使它有足够的空间存放系统中的程序,而达到使它实现所要得到的功能和应用的领域,其图如图2-8所示第3章 软件系统设计31 软件流程设计主要程序流程有:主程序、显示子程序、发声子程序、更改歌曲曲号子程序。软件实现的基本原理是,当单片机P30口为0时,软件去抖动功能,如果“开始键”按下就向下执行,否者跳到开始。主程序流程图校验键,歌曲曲号显示,发声程序等功能子程序组成,系统完成初始化后循环检查各个功能当用户使用某个功能时,按下相应的按钮(或开关)单片机进入相应的功能处理。主程序流程图如图3-1所示。而外来脉冲是通过按键产生的,因此实际
24、上单步执行就是按一次键执行一条指令。NYCnt=0;判断歌曲是否播放到最后一首开始初始化Temp=cnt;调用播放子程序并且随时等待相应中断Cnt+;图3-1主程序流程图第4章 系统调试调试是一个必不可少的环节,它将会验证你的成果,是否实现了所要完成的功能。系统调试仿真时先要使用Keil C编译器,把所写的程序进行编译,同时在仿真器里设置生成HEX文件,编译无错误时还要进行PROTEUS仿真,查看功能是否能够实现。下面就将仿真将会用到的软件进行简单的介绍,并对仿真过程予以简介。41 常用调试工具411 Keil C 软件Keil C软件是集成调试环境,集成了编缉器、编译器、调试器,支持软件模拟
25、,支持项目管理功能强大的观察窗口,支持所有的数据类型。树状结构显示,一目了然,支持ASM(汇编)、C语言,多语言多模块源程序混合调试,在线直接修改、编译、调试源程序,错误指令定位。功能很强大。用于对程序的调试和编辑。图4-1 Keil C软件界面Keil C软件界面如图4-1所示。412 PROTEUS软件系统仿真还用到了PROTEUS软件,可通过仿真可以完全显示出所设计系统的功能,对于程序的调试等有很大的帮助。首先要新建一个文档是DNS型的找出需要的器件,可以使用搜索功能。接着把各个器件放到合适的位置都要放到蓝色框内。然后根据自己的设计要求连线。把所有的元件都连接好,做出完整的电路图。42
26、系统调试及性能分析系统的调试开始是把伟福编译生成的无错误后缀名为HEX的文件加载到AT89C51单片机中,方法是双击单片机弹出一个对话框,在program file后选择要添加文件,文件要求必须是HEX文件。然后可以点击运行观察现象,当出现错误时,大多都是软件出了问题,经过不断的改进调试。对按键检测、加减歌曲序号与按键之间产生的不一致、歌曲调用子程序等软件的修改后,系统基本实现了所要设计的功能。 在进行系统的测试过程中。当调节歌曲的序号时,程序是给了一个初始值“1”,假如调节歌曲的序号后,歌曲播放的就是显示屏上显示的歌曲序号的歌曲。如按下复位键后时间会回到初始时间,即从头开始。数码管也跟随显示
27、歌曲的序号为“1”,同时蜂鸣器发出了声响,为第一首歌曲。通过调试系统达到设计的任务要求。心得体会本设计报告主要介绍了用单片机实现的音乐发生器的设计方法。系统介绍了该电路的硬件构成和软件工作过程,系统以AT89C51为核心,主要采用中断控制系统,结合所学的单片机的知识,实现系统的功能要求。设计中很好的使软、硬件相结合,基本上达到了设计的要求。通过这次毕业设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、自信、失落、奋发、所悟、完成几个过程。课程设计时,仔细阅读设计的题目和要求,以为没什么
28、困难的,所用的知识书上都有。可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。经过一天的努力,毫无结果。失落的心情油然而生。于是,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。埋头苦干的过程是痛苦的,尤其是在思考算法和程序框架时,迷茫,烦躁,特别是当苦思出来一个结果,又被自己推翻,心痛的无法言绘,在这不断循环中,终于最后完善了程序。其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,不懂付出怎么能知道回报的快乐,一分耕耘一分收获,有付出才会有回报,就在这样的痛与快乐的交换中,我学到了
29、知识, 学到了做人的道理。通过这短短几个月的制作,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。很多元器件根本不知道有什么功效,在仿真仪器中是什么代码。有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。我遇到了不少问题,花费了很多的时间。这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时,是取用成本的最小化,做设计不仅要考虑大的方面,小的方面也必须做到完美。最大的收获是
30、:对按键,显示器,单片机汇编语言的应用有了深刻的了解。参考文献1 樊明龙任丽静编单片机原理与应用M化学工业出版社,20052 徐爱卿编单片微型计算机应用和开发系统M北京航空航天大学出版社,19983 戴梅芳编微型计算机技术及应用M清华大学出版社,19964 李广弟,朱月秀,王秀山编单片机基础M北京航空航天大学出版社,20015 吴金戌编8051单片机实践与应用M清华大学出版社,2003附 录附录1 音乐发生器电路原理图附录2 元件明细表序号名称型号规格标号数量1电阻10KR1-R1111个2电容20pfC1、C2各1个3电容10ufC31个4单片机AT89C51U11个5数码管LED7SEG-
31、COM-CATHODE1个6扬声器SounderS11个7按键Button1-44个8晶振CRYSTALX11个9锁存器74LS373U21个10程序存储器27512U31个11与非门74LS00U41个12非门74LS04U51个附录3 源程序代码 /* SOUND PLAY FOR 51MCU /*说*明* 曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长, 0,0;末尾:0,0 表示结束(Important)*/#ifndef _SOUNDPLAY_H_REVISION_FIRST_#define _SOUNDPLAY_H_REVISION_F
32、IRST_/*#define SYSTEM_OSC 12000000/定义晶振频率12000000HZ#define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔sbit BeepIO=P30; /定义输出管脚 sbitkey_int0=P33;sbit key_add=P36;sbitkey_dec=P37;sbit key_led=P31;unsigned char code table=0x06,0x5b,0x4f;unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,4
33、66,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在频率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0; /音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; /音长定时器初值暂存unsigned char cnt=0;unsigned char temp=0;unsigned char flag=1;void
34、Delay1ms(unsigned int count); /初始化函数void InitialSound(void)BeepIO = 0; /喇叭关闭Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;/ 计算TL1应装入的初值 (10ms的初装值)Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;/ 计算TH1应装入的初值 TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |= 0x11;/设置定时器0、1的工作方式为工作方式1ET0 = 1;/开启定时
35、啤/计数中断0ET1 = 0;/开启定时啤/计数中断1TR0 = 0;/启动定时计数器0TR1 = 0;/启动定时计数器1EA = 1;EX0=1;EX1=1;/定时器0的中断程序void BeepTimer0(void) interrupt 1/音符发生中断BeepIO = !BeepIO;TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; /播放程序int Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)unsigned int
36、 NewFreTab12; /新的频率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octachord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;Sou
37、ndLength = 0;while(SoundSoundLength != 0x00) /计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和它时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最长间隔标准 TR0 = 0;TR1 = 1;while(Point = 2; /低音 if (SM=3) Current
38、Fre = 2; /高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是对中断延时的补偿 if(cnt!=temp) /判断有无中断 return 0; flag=1;while(flag=1)flag=1;/暂停程序SLen=LengthTabLength%10; /算出是几分音符XG=
39、Length/10%10; /算出音符类型(0普通1连音2顿音) FD=Length/100;LDiv=LDiv0/SLen; /算出连音音符演奏的长度(多少个10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏长度 if (SLen0;i-) /发规定长度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(cnt!=temp) /判断有无中断 return 0;flag=1;while(flag=1)flag=1; if(LDiv2!=0)TR
40、0=0; BeepIO=0;for(i=LDiv2;i0;i-) /音符间的间隔while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;Point+=2; Tone=SoundPoint;Length=SoundPoint+1; BeepIO = 0;cnt+; #endif#include #include SoundPlayhvoid Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j120;j+); /挥着翅膀的女孩unsigned char code Music_file3500= 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x