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

下载本文档

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

文档简介

图书分类号:密级:毕业设计(论文)基于单片机的MP3播放器设计学生姓名学院名称信电工程学院专业名称电子信息工程指导教师徐州工程学院毕业设计(论文)PAGEII摘要因为单片机编写的MP3播放器具有执行效率高、频率输出稳定、易于修改、高可靠性、高性价比、低电压、低功耗等,使单片机近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、数据采集系统、智能化仪器仪表、及通讯设备、日常消费类产品、玩具等[1]。利用单片机设计的MP3播放器具有硬件电路简单,软件运行可靠等特点。本文介绍了一种以AT89S52单片机为控制核心的MP3。该设计采用2*16个点阵液晶模块LCD1602作为显示界面,蜂鸣器作为发声元件,并利用定时器进行中断控制。本文分析了基于单片机的MP3播放器的工作原理,详细介绍了MP3播放器的功能及其硬件设计和软件设计的方法,给出了基于MCS-51单片机的MP3播放器的具体实现方案并重点讲述了其硬件实现与软件编写,实现了单片机MP3播放器对音乐的演奏。关键词:MP3播放器;AT89S52;LCD1602目录TOC\o"1-4"\h\z\u摘要 I1绪论 12设计综述 22.1单片机工作原理 22.1.1单片机概述 22.1.2单片机的应用领域及发展趋势 22.2单片机产生音调的方法 32.3KEIL开发系统 42.4PROTEUS的操作 83硬件设计 93.1总体方案设计 93.2单片机最小系统电路 93.2.1AT89S52芯片性能介绍 93.2.2电源电路 133.2.3时钟振荡电路 133.3键盘扫描模块 143.4显示模块 153.5播放模块 164系统软件设计 184.1编程原理及流程图 185调试与仿真结果 225.1软件调试 225.1.1测试LED显示模块 225.1.2测试键盘控制模块 235.1.3测试P3.0口输出 235.2调试中遇到的问题及解决 245.3仿真结果 25结束语 26致谢 27参考文献 28附录 29附录1源程序 29PAGE361绪论几千年来,各种乐器的发声无一不是依靠琴弦、簧片、哨片引起管柱振动而作为声源的。随着现代电子工业技术的飞速发展,一种用新的声源来制造音响的新型乐器脱颖而出,这就是目前人们熟知的电子MP3播放器。目前市场上的MP3播放器形形色色,例如大家所熟悉的MP3,随着电子技术的不断发展,MP3播放器的发展也会进一步发展。目前单片机的应用渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。本课题即是在这种背景下,对基于MCS-51单片机的MP3播放器的设计与实现进行了硬件及软件的设计,并给出了一套完整的解决方案,实现了单片机MP3播放器对音乐的演奏。基于单片机的MP3播放器可应用于MP3,MP4,扩音器等很多方面,并可作为很多系统的辅助功能,作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括"Do"、"Re"、"Me"--等音阶在内的各种频率声音。将各个音阶连接在一起,便可组成一支曲子或是演奏一段旋律。基于这个思想,我设计了一款特殊的"MP3播放器",本播放器可实现播放、暂停、选曲等功能。由于时间及条件限制,本设计实现了一种简单的MP3播放器,其核心器件采用AT89S52单片机,本播放器具有电路简单,功能强大,易于拓展等特点。在此基础上,可以添加按键,LED显示屏等模块,实现切换歌曲,歌名显示,动感音乐屏等功能[2]。2设计综述2.1单片机工作原理2.1.1单片机概述单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。2.1.2单片机的应用领域及发展趋势单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分为如下几个范畴:一、在智能仪器仪表的应用单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计、示波器、各种分析仪)。二、在家用电器中的应用可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。三、在工业控制中的应用用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。四、在计算机网络和通信领域中的应用现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。单片机的发展趋势现在可以说是百花齐放,百家争鸣的时期,世界上各大芯片制造公司都推出了自己的单片机,从8位、16位到32位,数不胜数,应有尽有,有与主流C51系列兼容的,也有不兼容的,但它们各具特色,互成互补,为单片机的应用提供了广阔的天地。纵观单片机的发展过程,可以预示单片机的发展趋势,大致有:一、微型单片化现在常规的单片机普遍都是将中央处理器(CPU)、随机存取数据存储(RAM)、只读程序存储器(ROM)、并行和串行通信接口,中断系统、定时电路、时钟电路集成在一块单一的芯片上,增强型的单片机集成了如A/D转换器、PMW(脉宽调制电路)、WDT(看门狗)、有些单片机将LCD(液晶)驱动电路都集成在单一的芯片上,这样单片机包含的单元电路就更多,功能就越强大。甚至单片机厂商还可以根据用户的要求量身定做,制造出具有自己特色的单片机芯片。此外,现在的产品普遍要求体积小、重量轻,这就要求单片机除了功能强和功耗低外,还要求其体积要小。现在的许多单片机都具有多种封装形式,其中SMD(表面封装)越来越受欢迎,使得由单片机构成的系统正朝微型化方向发展。二、低功耗CMOS化MCS-51系列的8031推出时的功耗达630mW,而现在的单片机普遍都100mW左右,随着对单片机功耗要求越来越低,现在的各个单片机制造商基本都采用了CMOS(互补金属氧化物半导体工艺)。像80C51就采用了HMOS(即高密度金属氧化物半导体工艺)和CHMOS(互补高密度金属氧化物半导体工艺)。CMOS虽然功耗低,但由于其物理特征决定其工作速度不够高,而CHMOS则具备了高速和低功耗的特点,这些特征,更适合于要求低功耗像电池供电的应用场合。所以这种工艺将是今后一段时期单片机发展的主要途径。2.2单片机产生音调的方法MP3播放器是利用单片机产生乐曲音符,再把乐曲音符翻译成计算机音乐语言,用单片机进行信息处理,再通过蜂鸣器或喇叭放出音乐。音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音。要想产生音频脉冲信号,需要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半个周期时间,每当计时到后就将输出脉冲的I/O口反相,然后重复计时此半周期时间再对I/O口反相,这样就能在此I/O口上得到此频率的脉冲。通常,利用单片机的内部定时器0,工作在方式1下,改变计数初值TH0和TL0来产生不同频率。对于音乐的节拍,每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍。如果1拍为0.4S,1/4拍为0.1S,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,那么1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY,其余的节拍就是它的倍数。总而言之,一首乐曲是由音阶和节拍两大要素构成。一首乐曲演奏的原理是:不同音阶分别对应不同的频率,发出不同的音调,而节拍则控制发出音调时间的长短;若将乐曲的音调连续发出,并使其按相应的节拍变化,即可演奏一首乐曲。根据这一特点,我们采用单片机辅以相应的接口来设计MP3播放器。2.3KEIL开发系统使用Keil软件建立一个工程:Keil是目前进行51单片机开发最常用的编译软件。关于Keil的使用,有很多的资料介绍,这里只介绍其整个编译过程。在Keil里,每一个完整的程序,都是以一个工程的形式建立的。一个工程里可以有一个或多个*.c文件和*.h文件,但只可以有一个main()函数。一般的做法是将包含main()函数的C文件加入到工程中,其他文件以#include头文件的形式加到这个C文件里。这样,在编译的时候,其他的文件会被自动的导入到工程里来。打开Keil软件后,出现(图2-3-1)所示界面。当然,如果Keil在上次关闭时有打开的工程,再一次打开时它会自动加载上一次的工程文件。图2-3-1Keil软件主界面首先点击Project->NewProject…(Project->OpenProject…为打开一个已经存在的工程),如图2-3-2所示。图2-3-2Keil软件打开新工程界面点开后,在出现的对话框中选择工程存在路径,单击“保存”后,出现(如图2-3-3所示)界面。在此界面上选择电路板上所用的单片机型号:AtmelAT89S51(或者是AT89S52,视开发板上具体型号而定),单击“确定”。图2-3-3选择电路板上所用的单片机型号设置完成后,软件会提示“是否将8051上电初始化程序添加入工程?”如图2-3-4所示,这个一般选择“否”。(关于STARTUP.A51的相关内容可查阅相应资料)图2-3-4是否将8051上电初始化程序添加入工程这样,就建立了一个空的51工程。接下来的事,就是在这个工程里面加入自己的程序代码。点击,或者File->New,便建立了一个空的文本框。现在,就可以开始在里面输入你的代码了。保存时注意:如果是用C语言写的程序,则将文本保存成*.c,如果是用汇编写的程序,则将文本存成*.asm。到目前为步,我们已经建立了一个工程,也写了一个程序代码。但现在还不能开始编译。因为还没有将程序代码添加到工程里面去。下一步就是将写完的程序添加到工程里面,如图2-3-5所示,在左边ProjectWorkspace里的SourceGroup1上右击,选择AddFilestoGroup’SourceGroup1’。在打开的对话框中,选择刚存的文件路径和对应的文件名。图2-3-5添加文件到工程中下一步,就开始编译刚输入进去的代码。点击工具栏中的按钮。接着,Keil会打出下面的提示:Buildtarget'Target1'assemblingled.asm...linking...ProgramSize:data=8.0xdata=0code=100"first"-0Error(s),0Warning(s).其中“"first"-0Error(s),0Warning(s).”说明现在的工程编译通过,0个错误和0个警告。建立工程的时候,默认是不生成HEX文件的,得在编译做如下设置:单击,或者在ProjectWorkspace里Target1上右击,选择“OptionsforTarget‘Target1’”。出现如图2-3-6所示对话框,选择“Output”按图示,将箭头所指的多选框勾上,点“确定”。现在再点击重新编译,系统提示:“creatinghexfilefrom"first"...”。便会在工程所在文件夹里生成HEX文件。图2-3-6生成HEX文件2.4PROTEUS的操作1.硬件电路图的接法操作[3](1)放置选择(删除)元器件(2)移动元器件(3)缩放视图(4)连接导线(5)仿真,调试2.单片机系统PROTEUS设计与仿真过程[4]Proteus强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发和改进手段之一。全部过程都是在计算机上通过Proteus来完成的。其过程一般也可分为三步:(1)在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等。简称Proteus电路设计。(2)在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*.hex)。简称Proteus源程序设计和生成目标代码文件。(3)在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简称Proteus仿真。3硬件设计3.1总体方案设计以AT89S52为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称[5]。总体如图3-1所示:AAT89S52键盘扫描模块液晶显示模块蜂鸣器发声模块图3-1总体方案图3.2单片机最小系统电路3.2.1AT89S52芯片性能介绍AT89S52是低电压,高性能CMOS八位单片机,片内含8K字节的可反复擦写的只读程序存储器和256字节的随机存取数据存储器,器件采用ATMEL公司的高密度、非易失存储技术生产与标准MCS-51指令系统及8052产品引脚兼容,片内置通用八位中央处理器和Flash存储单元,功能强大适合于许多较复杂控制应用场合[6]。AT89S52主要性能参数: 与MCS-51产品指令和引脚完全兼容 8K字节可重复擦写Flash闪速存储器 1000次擦写周期 全静态操作:0Hz—33MHz 三级加密程序存储器 256×8字节内部RAM 32个可编程I/O口线 3个16位定时/计数器 8个中断源 全双工可编程串行UART通道 低功耗空闲和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 掉电标识符 快速编程周期 灵活ISP编程(字节和模式)芯片如图3-2-1所示:图3-2-1AT89S52引脚图功能特性概述:AT89S52提供以下标准功能:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器。一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时AT89S52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。而本毕业设计中用到了,AT89S52的各个口,P1口接RZ-1602液晶显示电路,P2口接按键,P3口接晶振,蜂鸣器,工作指示灯,复位等电路。AT89S52使一个功能强大的芯片,各个口由以下功能[7]:P0口是一组8位漏极开路型双向I/O口,即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。P1口是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路,对端口写“1”,通过内部的上拉电阻把端口拉到高电平,1不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。IL与AT89S5.1/T2EX)。表3-2-1P1.0和P1.1的第二功能表引脚号功能特性P1.0T2(定时/计数器2外部计数脉冲输入),时钟输出P1.1T2EX(定时/计数2捕获/重装载触发和方向控制)P2口是一个带有内部上拉电阻的8位双向I/O,P2的输出缓冲级可驱动吸(收或输出电流4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I)。IL在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。表3-2-2P3口第二功能表端口引脚第二功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2(外中断0)P3.3(外中断1)P3.4T0(定时/计数器0)P3.5T1(定时/计数器1)P3.6(外部数据存储器写选通)P3.7(外部数据存储器读选通)RST:复位输入,当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平,CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出。3.2.2电源电路系统直流9V或者12V电池供电,由一片LM7805将9V/12V电源稳压在5V上。5V电源给所有芯片和电路供电。在电源电路中我们使用了两个滤波电容,使用滤波电容主要目的是为了消除电源波动对系统的干扰,提高系统的抗干扰能力,其中104电容是用来滤高频杂波干扰,220uF电容是用来滤低频杂波干扰。如图3-2-2所示:图3-2-2电源电路图3.2.3时钟振荡电路AT89S52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。片外石英晶体或者陶瓷谐振器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。这里我们采用电容30pF,晶振采用12MHZ。电路图如图3-2-3所示:图3-2-3时钟振荡电路3.2.4复位电路复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。复位电路采用RC充电电路组成上电复位单片机电路,当系统上电时,在上电初期,电容C充电,使复位脚持续高电平,当C充电到达一定程度复位脚电位会慢慢变低,最后被电阻R完全拉低,高电平复位的时间由充电的时间决定,充电时间又由R与C的阻值和容值之积决定。一旦单片机复位脚拉低后就一直都低电平,只有下电后再上电才重新开始复位过程。电路图如图3-2-4所示:图3-2-4复位电路3.3键盘扫描模块本方案采用独立式按键接口设计,各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下。键盘工作方式采用定时扫描方式,采用定时器T0定时,通过读取输出数据,识别按键工作状态。键盘按键所用开关为机械弹性开关,利用了机械触点的合断作用。由于机械触点的的弹性作用,一个按键开关在闭合和断开的瞬间均有一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为10~100ms。电平信号的波动,有可能令CPU误解为多次按键操作,从而引起误处理。为了确保CPU对一次按键动作只确认一次按键,必须消除抖动的影响。按键的消抖通常有软件和硬件两种消除方法。如果按键较多,硬件消抖将无法胜任,常采用软件消抖。本设计虽然按键少但还是采用常规的软件延时的方法:在第一次检测到有键按下时,执行一段延时子程序后,再确认电平是否仍保持闭电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。判断键盘程序流程如图3-3所示:有键按下?开始去键盘抖动同一键按下?根据键值执行功能功能循环YESNOYESNO图3-3键盘判断程序流程图3.4显示模块常见的基于单片机设计的MP3播放器基本不能显示歌曲。该音乐播放系统设计上增加液晶显示器,可为使用者提供曲目信息。由于LED数码管只能显示数字而无法显示其他中英文字符,并对成本及功能考虑,因此从设计的成本及功能的角度考虑,采用LCD-1602显示模块,它可以显示每首曲目的英文名字。LCD-1602驱动电路简单,可以由单片机直接输出命令驱动。LCD各引脚功能如图表3-4所示:表3-4LCD引脚功能编号符号引脚说明编号符号引脚说明1VSS电源地9D2双向数据口2VDD电源正极10D3双向数据口3VL对比度调节11D4双向数据口4RS数据/命令选择12D5双向数据口5R/W读/写选择13D6双向数据口6E模块使能端14D7双向数据口7D0双向数据口15BLK背光源地08D1双向数据口16BLA背光源正极VDD:电源正极,4.5-5.5V,通常使用5V电压。VL:LCD对比度调节端,电压调节范围为0-5V。接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地。RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平。R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据。E:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。D0-D7:8位三态双向数据总线。如果MCU的I/O口资源紧张的话,该模块也可只使用4位数据线D4-D7接口传送数据。本充电器就是采用4位数据传送方式。BLA:LED背光正极。需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右。BLK:LED背光地端。3.5播放模块通过蜂鸣器实现发声,当三极管基级由单片机控制变成高电平时,V1导通并工作在饱和区,由于集电极和发射极之间的电压差几乎等于0,故相当于蜂鸣器的另一个脚接地,蜂鸣器会发出蜂鸣声。当三极管基级由单片机控制变成高低电平时,V1不导通并工作在截止区,那么蜂鸣器的另一个脚接到高电平,蜂鸣器不发出蜂鸣声。可以通过改变三极管基级的开关频率来控制蜂鸣器发出各种不同频率的声音。另外,蜂鸣器需要三极管驱动,而不能由单片机口线直接驱动,因为蜂鸣器的工作电流比较大(大概100mA),故单片机口线不能承受。图3-5蜂鸣器发声模块图4系统软件设计4.1编程原理及流程图音乐发声设计原理[8]:(1)总体原理:一首乐曲是由多个音符构成的。每个音符都对应着一个确定的频率,乐曲中不同的音符,实质就是不同频率的声音;另外每个音符会根据乐曲的要求设定一个确定的节拍。可以控制单片机产生不同频率不同节拍的脉冲信号,由蜂鸣器发出就产生了美妙和谐的乐曲。(2)单片机产生不同频率脉冲信号的原理:1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。2)利用单片机内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:例如,频率为523Hz,其周期天/523S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。计数脉冲值与频率的关系公式如下:N=Fi/2/Fr其中N表示计数值;Fi表示内部计时一次为1uS,故其频率为1MHz;Fr表示要产生的频率。3)其计数值的求法如下:T=65536-N=65536-Fi/2/Fr计算举例:设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr低音DO的T=65536-500000/262=63628中音DO的T=65536-500000/523=64580高音DO的T=65536-500000/1047=650594)每个音符使用1个字节,字节高4位代表音符高低,低4位代表音符节拍。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。只要求得1/4拍的DELAY时间,其余节拍则为它的倍数,本设计取4/4调值,延时时间为125ms,其中节拍码与实际节拍对照表4-1-1。表4-1-1简谱对应的频率、简谱码和计数初值表简谱发音频率(Hz)计数初值简谱码5低音SO3926426016低音LA4406440027低音SI4946452431中音DO5236458042中音RE5876468453中音MI6596477764中音FA6986482075中音SO7846489886中音LA8806496897中音SI98865030A1高音DO104665058B2高音RE117565110C3高音MI131865157D4高音FA139765178E5高音SO156865217F不发音0表4-1-2节拍码与实际节拍对照表节拍码实际节拍节拍码实际节拍节拍码实际节拍11/4拍51又1/4拍C3拍22/4拍61又1/2拍F3又3/4拍33/4拍82拍41拍A2又1/2拍建立音乐步骤:1)先把乐谱的音符找出,然后由上表建立T值表的顺序。2)把T值表构成一个编码表,构成发音符的计数值放在计数初值编码表里。3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的简谱编码表里。建立编码表具体如下:1)定时值为十六进制4位数,拆分为两组,如5对应的定时值为FD80H,拆分FDH和80H两组.前者装入定时器的高位TH0,后组装入定时器的低位TL0。2)在程序中使用定时器T0方式1来产生来产生歌谱中各音符对应频率的音频脉冲,由P3.7输出,经三极管将信号放大后驱动蜂鸣器发出不同音节的声音。3)程序中的节拍控制是通过调用延时子程序DELAY的次数来实现,1拍为500ms,即需要调用4次DELAY;3/4拍需要调用3次DELAY;2/4拍需要调用2次DELAY。4)节拍的控制码在表TABLE中位于音符码的后面。5)当一个音符的发音时间到时,再查下一个音符的定时常数和延时常数。依此进行下去,就可演奏出悦耳动听的乐曲。程序流程图如图4-1所示:图4-1主程序流程图如图4-2所示,开始播放自定义音乐程序时,指针指向乐谱第一个字节,将第一字节拆分为高低字节,其高字节即为音符中音高对应定时器定时常数,低字节即为音符中节拍对应的1/4节拍的次数,同时启动中断定时器0工作在方式1,由定时器定时常数得到相应音高,通过延时子程序设定1/4节拍的时间,由节拍次数得到节拍,再读取下一个乐谱字节,循环下去则演奏出美妙和谐的乐曲[9]。开始程序开始程序指向乐谱第一个字节拆分字节的高低字节由高字节得音高对应定时器定时常数由低字节得到节拍对应节拍次数启动定时器0延时节拍时间关闭定时器0读取下一个乐谱字节字节是00H吗?程序循环YESNO图4-2音乐播放子程序流程图5调试与仿真结果5.1软件调试结构化软件的调试一般可以将重点放在分模块调试上,通调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,借助于软件仿真器即可;后者一般需要仿真系统的支持。在本次设计中利用的是KEILC51软件仿真器,其评估版本可以免费获取,只是有2KB代码限制。基于MCS-51的MP3播放器的设计与实现的调试,主要集中在对扬声器的输出音乐部分的调试以及键盘控制和LED显示部分的调试上。在编写完整的MP3播放器程序前,可以先按照如下的顺序分别调试各个功能模块的程序。5.1.1测试LED显示模块(1)调试目的使用P2口作为输出口实现LED的显示,从而检测P2口及LED显示模块是否正常工作。(2)调试程序MAIN:MOVTMOD,#10H;定时器T1工作在方式1MOVTH1,#3CHMOVTL1,#0B0H ;T=50msSTART:MOVR1,#00H;计数显示初始化 MOV DPTR,#TABDISP:MOV A,R1MOVCA,@A+DPTR;查表得显示的字型码MOVP2,A;数码管显示0ACALLDELAY1S;延时1SINCR1;计数值加1CJNER1,#10,DISP;秒值不到10,继续显示;否则清0MOVR1,#00H;计数值清0SJMPDISPTAB:DB0C0H,0F9H,0A4H;0,1,2DB0B0H,99H,92H;3,4,5DB82H,0F8H,80H;6,7,8DB90H;9DELAY1S:;延时子程序MOVR3,#14H;置50MS计数循环初值 SETB TR1 ;启动T1LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;未到50MS继续计数LP2:MOVTH1,#3CH;重新置定时器初值MOVTL1,#0B0HDJNZR3,LP1;未到1S继续循环 RET;返回主程序(3)调试结果LED数码管从0到9自动循环显示,表明硬件与软件正确。5.1.2测试键盘控制模块(1)调试目的通过键盘的控制可使LED数码管显示相应的内容。(2)调试程序GETKEY: ;读A键盘子程序SA: JB P1.0,SB ;读A LCALL DELAY2 JB P1.0,SA JNB P1.0,$ MOV P2,#10001000B ;显示A MOV R5,#10001000B MOV A,#0FFH MOV B,#0AH RET(3)调试结果键盘按下后LED显示相应的内容,表明软硬件正确。5.1.3测试P3.0口输出(1)调试目的使用P3.0口做输出口使扬声器工作(2)调试程序START:MOVSP,#60HMOVTMOD,#11HMOVIE,#8AHMOVIP,#08H ;T1中断优先于T0中断MOV TH1,#3CHMOV TL1,#0B0H ;以上为系统初始化,T=50msHERE:SJMPHEREINT_T0: CLR TR0 MOV TL0,20H MOV TH0,21H CPL P3.0 SETB TR0 RETI(3)调试结果扬声器有声音发出,扬声器正常工作。5.2调试中遇到的问题及解决(1)编程前要画流程图,这样会使思路清晰。(2)编程时要注意,在程序开始时,要写入各定时器中断的入口地址。(3)有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定要按正确格式书写。(4)程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。(5)编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。(6)开始时候没有将单片机的第31号引脚接到高电平,结果使MP3播放器的播放性能不稳定(有时候能工作,有时候却工作不了),当接一高电平以后,播放器能正常工作了。(7)开始没有考虑键盘的消抖,造成的按键工作紊乱,具体的现象是:按1次键却被要机器认为是按了1次或多次,这就使播放器有时候可以正常工作,有时候却不可以。给键盘程序加了消抖呼程序以后,按键就工作正常了。(8)两个定时器同时工作,存在中断时序问题,刚开始时我们把定时器1设定在方式3,计250us,由于定时中断过于频繁,使CPU负载过大,导致音乐不能正常播放,时间不能正常显示。解决办法:将定时器1设定在工作方式1,16位计数,计50ms,效果有很大改观。5.3仿真结果我在keil软件中建立工程,连接,编译后生成了.hex文件,在proteus中在单片机中加载.hex文件仿真中遇到了以下几个问题。(1)显示屏不能工作刚开始时lcd只发亮不显示字符,我通过查找文献,在网上搜集资料,发现lcd的高电平和地引脚接错了,这是一个常识性的错误,它给我了深刻的教训,做事情要细心认真。(2)蜂鸣器不能正常播放音乐在protues仿真中的蜂鸣器老是不能正常响,会断断续续地播放,经过我几天的调试,我发现应该是电平驱动的问题,是由于三极管的失真造成的。最后终于能播放音乐了。最终仿真结果如图5-3所示:图5-3仿真图结束语我的题目是MP3播放器软件的设计,对于我们这些工科学生来说,这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的。这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。我设计的MP3播放器采用蜂鸣器作为MP3播放器件,若针对现在流行的WAV、MP3等音乐质量很好的系统,它就不是一个好的选择,这是本设计的不足。当然本设计也要考虑到性能和价格之比,和它驱动起来比较简单。同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。这次课程设计通过自己的努力,同学的帮助,还有老师的辛勤指导下,最终顺利完成了。致谢经过几个月的忙碌,本次毕业论文设计已经接近尾声。,由于经验的匮乏,难免有许多考虑不到的地方,在多次的修改和研究之后才写出完成。如果没有导师的督促和指导,以及同学和朋友的支持,想要完成这个毕业论文设计是难以想像的。感谢同学和朋友的及时帮助和教导。在论文的写作过程中,得到了陈豹老师的亲切关怀和耐心的指导。老师严谨的治学态度和科学的工作方法给了我极大的帮助和影响。从课题的选择得到毕业论文设计最终完成,老师都始终给予我细心的指导。在此谨向陈豹老师致以诚挚的谢意和崇高的敬意。同时,也要感谢各位老师,同学和朋友们给我极大的支持,对我的论文提出了宝贵的意见及建议。感谢所有帮助我的老师、同学和朋友们,在此向他们表达我的感激之情。参考文献[1]黄振杰,卢小冰.基于AT89S52的多功能音乐播放器[J].广东:电子设计工程,2009年2月第2期[2]吴迅.用单片机设计音乐播放器[J].山东:电子世界,2009.6[3]朱清慧等.Protues教程—电子线路设计、制版与仿真[M].北京:清华大学出版社2008.9[4]侯玉宝,陈忠平,,李成群.基于Proteus的51系列单片机设计与仿真.[M]北京电子工业出版社,2008[5]何立民.MCS-51系列单片机应用系统设计.北京航空航天大学出版社,[M]1990[6]李华.MCS-51系列单片机应用接口技术.北京航空航天大学出版,[M]1993[7]李广弟,朱月秀.单片机基础[M].北京:北京航空航天大学出版社,2007.6[8]张义和,王敏男等.例说51单片机[M].北京:人民邮电出版社,2008.4[9]陈明荧.8051单片机课程设计实训教材[M](第一版).北京:清华大学出版社,2004附录附录1源程序#include<reg51.h>#defineucharunsignedchar#defineucharunsignedchar#defineuintunsignedint#defineLCDPORTP0ucharcodetab[]="Presskey";ucharcodetab1[]="Selectsong";ucharcodetab2[]="FirstSong";ucharcodetab3[]="butterfly";ucharcodetab4[]="SecondSong" ;ucharcodetab5[]="Jinglebell";ucharcodetab6[]="ThirdSong";ucharcodetab7[]="Yesterday";ucharcodetab8[]="ForthSong";ucharcodetab9[]="YouthLeague";sbitLCDE=P2^2;sbitLCDRW=P2^1;sbitLCDRS=P2^0;#defineSYSTEM_OSC 12000000 //定义晶振频率12000000HZ#defineSOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔sbitBeepIO= P3^7; //定义输出管脚sbit K1=P1^7;unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11}; //1~7在频率表中的位置unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64}; unsignedcharSound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存unsignedcharSound_Temp_TH1,Sound_Temp_TL1; unsignedcharcodeMusic_Girl[]={0x1B,0x02,0x1A,0x02,0x1B,0x02,0x19,0x66,0x1A,0x03,0x18,0x02,0x17,0x02,0x16,0x0D,0x17,0x03,0x18,0x0D,0x17,0x03,0x19,0x66,0x17,0x03,0x16,0x0D,0x17,0x03,0x19,0x0D,0x16,0x03,0x17,0x0D,0x18,0x03,0x17,0x0D,0x16,0x03,0x15,0x00,0x19,0x02,0x11,0x02,0x16,0x02,0x10,0x02,0x15,0x02,0x0F,0x00,0x10,0x03,0x15,0x03,0x0F,0x00,0x0D,0x01,0x0F,0x66,0x10,0x03,0x15,0x66,0x16,0x03,0x10,0x0D,0x15,0x03,0x0F,0x03,0x19,0x66,0x1F,0x03,0x1A,0x0D,0x19,0x03,0x17,0x03,0x19,0x03,0x16,0x00,0x16,0x66,0x17,0x03,0x11,0x0C,0x10,0x02,0x19,0x66,0x10,0x03,0x15,0x02,0x16,0x02,0x0D,0x02,0x15,0x02,0x10,0x0D,0x0F,0x03,0x10,0x0D,0x15,0x03,0x0F,0x00,0x17,0x66,0x19,0x03,0x11,0x02,0x16,0x02,0x10,0x0D,0x15,0x03,0x0F,0x15,0x0D,0x03,0x0F,0x02,0x0D,0x03,0x0F,0x0D,0x10,0x03,0x11,0x0D,0x16,0x03,0x10,0x00,0x0F,0x0D,0x10,0x03,0x15,0x66,0x16,0x03,0x19,0x02,0x17,0x02,0x16,0x02,0x17,0x0D,0x16,0x03,0x15,0x02,0x10,0x0D,0x0F,0x03,0x0D,0x01,0x15,0x01,0x10,0x03,0x15,0x04,0x10,0x0D,0x0F,0x03,0x0D,0x0D,0x0F,0x03,0x10,0x0D,0x15,0x03,0x0F,0x00,0x17,0x0D,0x19,0x03,0x16,0x0D,0x17,0x03,0x16,0x0D,0x15,0x03,0x11,0x02,0x10,0x02,0x0F,0x00,0x00,0x00};unsignedcharcodeMusic_Jingle[]={0x0F,0x03,0x0F,0x03,0x17,0x03,0x16,0x03,0x15,0x03,0x0F,0x66,0x19,0x04,0x19,0x04,0x0F,0x03,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x02,0x10,0x03,0x10,0x03,0x18,0x03,0x17,0x03,0x16,0x03,0x10,0x66,0x10,0x03,0x19,0x03,0x19,0x03,0x18,0x03,0x16,0x03,0x17,0x02,0x15,0x03,0x0F,0x03,0x0F,0x03,0x17,0x03,0x16,0x03,0x15,0x03,0x0F,0x66,0x0F,0x03,0x0F,0x03,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x66,0x10,0x03,0x10,0x03,0x18,0x03,0x17,0x03,0x16,0x03,0x19,0x03,0x19,0x03,0x19,0x03,0x19,0x03,0x1A,0x03,0x19,0x03,0x18,0x03,0x16,0x03,0x15,0x66,0x17,0x03,0x17,0x03,0x17,0x02,0x17,0x03,0x17,0x03,0x17,0x02,0x17,0x03,0x19,0x03,0x15,0x03,0x16,0x03,0x17,0x01,0x18,0x03,0x18,0x03,0x18,0x67,0x18,0x04,0x18,0x03,0x17,0x03,0x17,0x03,0x17,0x04,0x17,0x04,0x17,0x03,0x16,0x03,0x16,0x03,0x15,0x03,0x16,0x03,0x19,0x66,0x19,0x03,0x19,0x03,0x18,0x03,0x16,0x03,0x15,0x02,0x00,0x00};unsignedcharcodeMusic_Two[]={0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x19,0x03,0x19,0x01,0x19,0x03,0x1A,0x03,0x19,0x03,0x17,0x01,0x16,0x03,0x16,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,0x10,0x0D,0x15,0x00,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x0D,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x02,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x17,0x0D,0x16,0x03,0x17,0x03,0x19,0x01,0x19,0x03,0x19,0x03,0x1A,0x03,0x1F,0x03,0x1B,0x03,0x1B,0x03,0x1A,0x03,0x17,0x0D,0x16,0x03,0x16,0x03,0x16,0x03,0x17,0x01,0x17,0x03,0x17,0x03,0x19,0x03,0x1A,0x02,0x1A,0x02,0x10,0x03,0x17,0x0D,0x16,0x03,0x16,0x01,0x17,0x03,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x03,0x1F,0x02,0x1B,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x02,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x17,0x16,0x1A,0x03,0x1A,0x03,0x1A,0x0E,0x1B,0x04,0x1A,0x03,0x19,0x03,0x17,0x03,0x16,0x03,0x0F,0x02,0x10,0x03,0x15,0x00,0x00,0x00};unsignedcharcodeMusic_Yesterday[]={0x15,0x03,0x15,0x03,0x16,0x03,0x17,0x02,0x19,0x02,0x19,0x03,0x17,0x03,0x19,0x03,0x17,0x03,0x1A,0x02,0x19,0x66,0x17,0x02,0x17,0x03,0x19,0x03,0x1A,0x02,0x16,0x02,0x17,0x03,0x19,0x02,0x1A,0x15,0x17,0x03,0x19,0x03,0x1A,0x02,0x21,0x02,0x20,0x03,0x1F,0x02,0x1B,0x03,0x1B,0x66,0x19,0x03,0x17,0x03,0x19,0x02,0x17,0x02,0x16,0x14,0x15,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x19,0x02,0x19,0x03,0x19,0x03,0x17,0x03,0x19,0x03,0x17,0x03,0x1A,0x03,0x19,0x02,0x17,0x03,0x17,0x02,0x17,0x03,0x19,0x03,0x1A,0x02,0x1B,0x02,0x17,0x03,0x19,0x02,0x1A,0x03,0x1A,0x01,0x1B,0x02,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1A,0x66,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x02,0x1A,0x66,0x1A,0x03,0x1B,0x03,0x1F,0x02,0x1F,0x02,0x1A,0x03,0x1F,0x02,0x20,0x03,0x20,0x16,0x1F,0x02,0x20,0x02,0x21,0x03,0x21,0x03,0x21,0x03,0x21,0x02,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1A,0x66,0x17,0x03,0x19,0x03,0x19,0x14,0x1F,0x03,0x20,0x03,0x21,0x03,0x21,0x03,0x21,0x03,0x21,0x03,0x21,0x02,0x20,0x03,0x1F,0x03,0x1F,0x03,0x1B,0x03,0x1A,0x66,0x17,0x03,0x19,0x03,0x19,0x14,0x1A,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x20,0x66,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x02,0x1F,0x03,0x20,0x66,0x1F,0x03,0x20,0x03,0x21,0x02,0x21,0x02,0x20,0x03,0x1F,0x02,0x1A,0x03,0x1A,0x02,0x17,0x02,0x17,0x03,0x1A,0x03,0x17,0x03,0x19,0x03,0x19,0x14,0x17,0x03,0x17,0x03,0x16,0x04,0x15,0x04,0x15,0x03,0x16,0x03,0x17,0x01,0x17,0x03,0x18,0x02,0x16,0x03,0x16,0x14,0x17,0x03,0x17,0x03,0x17,0x03,0x18,0x02,0x16,0x03,0x16,0x16,0x15,0x03,0x16,0x03,0x17,0x03,0x16,0x01,0x1F,0x02,0x20,0x02,0x21,0x03,0x21,0x03,0x21,0x03,0x21,0x02,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1A,0x03,0x1A,0x02,0x17,0x03,0x19,0x03,0x19,0x14,0x1F,0x02,0x20,0x02,0x21,0x03,0x21,0x03,0x21,0x03,0x21,0x66,0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x03,0x1B,0x03,0x1A,0x66,0x17,0x03,0x19,0x03,0x19,0x00,0x00,0x00};uchark;voiddelay1(void)//延时程序{ uchari,j; for(i=20;i>0;i--) for(j=248;j>0;j--);}voidGetch(){ucharX,Y,Z; P1=0xff; P1=0xf3;//先对P0置数行扫描 if(P1!=0xf3)//判断是否有键按下 { delay1();//延时,软件去干扰 if(P1!=0xf3)//确认按键按下X=P3; { X=P1;//保存行扫描时有键按下时状态 P1=0xfc;//列扫描 Y=P1;//保存列扫描时有键按下时状态 Z=X|Y;//取出键值 switch(Z)//判断键值(那一个键按下) { case0xf9:k=0;break;//对键值赋值 case0xf5:k=1;break; case0xfa:k=2;break; case0xf6:k=3;break; } } } } voidDelay(){ uintuiCount; for(uiCount=0;uiCount<250;uiCount++);}voidWriteCMD(ucharCommond)//LCD写指令函数{Delay();//先延时。LCDE=1;//然后把LCD改为写入命令状态。LCDRS=0;LCDRW=0;LCDPORT=Commond;//再输出命令。LCDE=0;//最后执行命令。}voidWriteData(uchardat)//LCD写数据函数{Delay();//先延时。LCDE=1;//然后把LCD改为写入数据状态。LCDRS=1;LCDRW=0;LCDPORT=dat;//再输出数据。LCDE=0;//最后显示数据。}voidinit(){ LCDRW=0;LCDE=0; WriteCMD(0x38); WriteCMD(0x0c); WriteCMD(0x06); WriteCMD(0x01); WriteCMD(0x80);}voidmydelay(intx){inti,j;for(i=x;i>0;i--)for(j=255;j>0;j--);}voidInitialSound(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; ET0=1; ET1 =0; TR0 =0; TR1=0; EA=1;}voidBeepTimer0(void)interrupt1 //音符发生中断{ BeepIO=!BeepIO; TH0=Sound_Temp_TH0; TL0=Sound_Temp_TL0;}voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed){ unsignedintNewFreTab[12]; //新的频率表 unsignedchari,j; unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) //根据调号及升降八度来生成新的频率表 { j=i+Signature; if(j>11) { j=j-12; NewFreTab[i]=FreTab[j]*2; } else NewFreTab[i]=FreTab[j]; if(Octachord==1) NewFreTab[i]>>=2; elseif(Octachord==3) NewFreTab[i]<<=2; } SoundLength=0; while(Sound[SoundLength]!=0x00) //计算歌曲长度 { SoundLength+=2; } Point=0; Tone=Sound[Point]; Length=Sound[Point+1]; //读出第一个音符和它时时值 LDiv0=12000/Speed; //算出1分音符的长度(几个10ms) LDiv4=LDiv0/4; //算出4分音符的长度 LDiv4=LDiv4-LDiv4*SOUND_SPACE; //普通音最长间隔标准 TR0 =0; TR1=1; while(Point<SoundLength&&K1==1) //歌曲代码未放完且暂停键未被按下 { SL=Tone%10; //计算出音符 SM=Tone/10%10; //计算出高低音 SH=Tone/100; //计算出是否升半 CurrentFre=NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 if(SL!=0) { if(SM==1)CurrentFre>>=2; //

温馨提示

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

评论

0/150

提交评论