您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页基于单片机的音乐播放器设计毕业论文

基于单片机的音乐播放器设计毕业论文

来源:筏尚旅游网


图书分类号: 密 级:

毕业设计(论文)

基于单片机的MP3播放器设计

学生姓名 学院名称 专业名称 指导教师

汤明 信电工程学院 电子信息工程

陈豹

2012年 5月 10日

徐州工程学院毕业设计(论文)

摘要

因为单片机编写的MP3播放器具有执行效率高、频率输出稳定、易于修改、高可靠性、高性价比、低电压、低功耗等,使单片机近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、数据采集系统、智能化仪器仪表、及通讯设备、日常消费类产品、玩具等

[1]

.利用单片机设计的MP3播放器具有硬件电路简单,软件运行可靠等特点。本文介绍了

一种以 AT89S52 单片机为控制核心的MP3。该设计采用2*16个点阵液晶模块LCD1602作为显示界面,蜂鸣器作为发声元件,并利用定时器进行中断控制。

本文分析了基于单片机的MP3播放器的工作原理,详细介绍了MP3播放器的功能及其硬件设计和软件设计的方法,给出了基于MCS-51单片机的MP3播放器的具体实现方案并重点讲述了其硬件实现与软件编写,实现了单片机MP3播放器对音乐的演奏。

关键词:MP3播放器;AT89S52;LCD1602

I

徐州工程学院毕业设计(论文)

目 录

摘要 .................................................................................................................................................. I 1绪论 .............................................................................................................................................. 1 2设计综述 ...................................................................................................................................... 2 2。1单片机工作原理 ................................................................................................................. 2 2。1。1 单片机概述 ............................................................................................................... 2 2。1.2 单片机的应用领域及发展趋势 ................................................................................. 2 2.2 单片机产生音调的方法 ...................................................................................................... 3 2。3 KEIL开发系统 ................................................................................................................... 4 2.4 PROTEUS的操作 ................................................................................................................... 8 3硬件设计 ...................................................................................................................................... 9 3。1总体方案设计 ..................................................................................................................... 9 3.2 单片机最小系统电路 .......................................................................................................... 9 3.2。1 AT89S52芯片性能介绍 .............................................................................................. 9 3。2.2 电源电路 ................................................................................................................... 13 3。2.3 时钟振荡电路 ........................................................................................................... 13 3。3 键盘扫描模块 .................................................................................................................. 15 3。4 显示模块 .......................................................................................................................... 16 3.5 播放模块 ............................................................................................................................ 17 4 系统软件设计 ........................................................................................................................... 18 4。1编程原理及流程图 ........................................................................................................... 18 5 调试与仿真结果 ....................................................................................................................... 22 5.1 软件调试 ............................................................................................................................ 22 5.1.1 测试LED显示模块 ..................................................................................................... 23 5。1.2 测试键盘控制模块 ................................................................................................... 24 5.1.3 测试P3.0口输出 ....................................................................................................... 24 5.2 调试中遇到的问题及解决 ................................................................................................ 25 5.3 仿真结果 ............................................................................................................................ 25 结束语 ........................................................................................................................................... 26 致 谢 ........................................................................................................................................... 27 参考文献 ....................................................................................................................................... 28 附录 ............................................................................................................................................... 29 附录1 源程序 ........................................................................................................................... 29

II

徐州工程学院毕业设计(论文)

1绪论

几千年来,各种乐器的发声无一不是依靠琴弦、簧片、哨片引起管柱振动而作为声源的。随着现代电子工业技术的飞速发展,一种用新的声源来制造音响的新型乐器脱颖而出,这就是目前人们熟知的电子MP3播放器。目前市场上的MP3播放器形形色色,例如大家所熟悉的MP3,随着电子技术的不断发展,MP3播放器的发展也会进一步发展。

目前单片机的应用渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹.导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机.更不用说自动控制领域的机器人、智能仪表、医疗器械了。

本课题即是在这种背景下,对基于MCS-51单片机的MP3播放器的设计与实现进行了硬件及软件的设计,并给出了一套完整的解决方案,实现了单片机MP3播放器对音乐的演奏.

基于单片机的MP3播放器可应用于MP3,MP4,扩音器等很多方面,并可作为很多系统的辅助功能,作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括”Do”、”Re\"、\"Me\"——等音阶在内的各种频率声音。将各个音阶连接在一起,便可组成一支曲子或是演奏一段旋律。基于这个思想,我设计了一款特殊的”MP3播放器”,本播放器可实现播放、暂停、选曲等功能。由于时间及条件限制,本设计实现了一种简单的MP3播放器,其核心器件采用AT89S52单片机,本播放器具有电路简单,功能强大,易于拓展等特点.在此基础上,可以添加按键,LED显示屏等模块,实现切换歌曲,歌名显示,动感音乐屏等功能[2]。

1

徐州工程学院毕业设计(论文)

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 单片机的应用领域及发展趋势

单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分为如下几个范畴:

一、在智能仪器仪表的应用

单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大.例如精密的测量设备(功率计、示波器、各种分析仪).

二、在家用电器中的应用

可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在.

三、在工业控制中的应用

用单片机可以构成形式多样的控制系统、数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统

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播放器是利用单片机产生乐曲音符,再把乐曲音符翻译成计算机音乐语言,用单片机进行信息处理,再通过蜂鸣器或喇叭放出音乐.

3

徐州工程学院毕业设计(论文)

音乐的产生主要是通过单片机的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.3 KEIL开发系统

使用Keil软件建立一个工程:

Keil是目前进行51单片机开发最常用的编译软件.关于Keil的使用,有很多的资料介绍,这里只介绍其整个编译过程。在Keil里,每一个完整的程序,都是以一个工程的形式建立的。一个工程里可以有一个或多个*。c文件和*。h文件,但只可以有一个main()函数.一般的做法是将包含main()函数的C文件加入到工程中,其他文件以#include头文件的形式加到这个C文件里。这样,在编译的时候,其他的文件会被自动的导入到工程里来.

打开Keil软件后,出现(图2—3—1)所示界面。当然,如果Keil在上次关闭时有打开的工程,再一次打开时它会自动加载上一次的工程文件。

4

徐州工程学院毕业设计(论文)

图2-3-1 Keil软件主界面

首先点击Project-〉New Project…(Project->Open Project…为打开一个已经存在的工程),如图2-3-2所示。

图2—3—2 Keil软件打开新工程界面

点开后,在出现的对话框中选择工程存在路径,单击“保存\"后,出现(如图2-3—3所示)界面。在此界面上选择电路板上所用的单片机型号:Atmel AT89S51(或者是AT89S52,视开发板上具体型号而定),单击“确定”.

5

徐州工程学院毕业设计(论文)

图2-3-3 选择电路板上所用的单片机型号

设置完成后,软件会提示“是否将8051上电初始化程序添加入工程?\"如图2—3-4所示,这个一般选择“否\"。(关于STARTUP。A51的相关内容可查阅相应资料)

图2-3-4 是否将8051上电初始化程序添加入工程

这样,就建立了一个空的51工程.

接下来的事,就是在这个工程里面加入自己的程序代码。点击

,或者File

—〉New,便建立了一个空的文本框.现在,就可以开始在里面输入你的代码了.

保存时注意:如果是用C语言写的程序,则将文本保存成*.c,如果是用汇编写的程序,则将文本存成*.asm.

到目前为步,我们已经建立了一个工程,也写了一个程序代码。但现在还不能开始编译.因为还没有将程序代码添加到工程里面去。

下一步就是将写完的程序添加到工程里面,如图2—3-5所示,在左边Project Workspace里的Source Group 1上右击,选择Add Files to Group

6

徐州工程学院毕业设计(论文)

'Source Group 1’。在打开的对话框中,选择刚存的文件路径和对应的文件名.

图2-3-5 添加文件到工程中

下一步,就开始编译刚输入进去的代码。点击工具栏中的会打出下面的提示:

Build target ’Target 1’ assembling led.asm。。。 linking。..

Program Size: data=8.0 xdata=0 code=100 ”first\" - 0 Error(s), 0 Warning(s)。

按钮.接着,Keil

其中“”first” — 0 Error(s), 0 Warning(s)。”说明现在的工程编译通过,0个错误和0个警告。建立工程的时候,默认是不生成HEX文件的,得在编译做如下设置:单击

,或者在Project Workspace里Target 1上右击,选

择“Options for Target ‘Target 1’”。出现如图2-3—6所示对话框,选择“Output”按图示,将箭头所指的多选框勾上,点“确定”。

现在再点击

重新编译,系统提示:“creating hex file

from ”first\"。..\"。便会在工程所在文件夹里生成HEX文件。

7

徐州工程学院毕业设计(论文)

图2—3—6 生成HEX文件

2。4 PROTEUS的操作

1。硬件电路图的接法操作[3] (1)放置选择(删除)元器件 (2)移动元器件 (3)缩放视图 (4)连接导线 (5)仿真,调试

2。 单片机系统PROTEUS设计与仿真过程[4]

Proteus强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发和改进手段之一。全部过程都是在计算机上通过Proteus来完成的。其过程一般也可分为三步:

(1)在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等。简称Proteus电路设计。

(2)在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*。hex)。简称Proteus源程序设计和生成目标代码文件.

(3)在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简

8

徐州工程学院毕业设计(论文)

称Proteus仿真。

3硬件设计

3。1总体方案设计

以AT89S52为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称[5]。总体如图3-1所示:

键盘扫描 模块

A T 8 9 S 5 2 液晶显示 模块 蜂鸣器发声模块

图3-1 总体方案图

3。2 单片机最小系统电路

3.2.1 AT89S52芯片性能介绍

AT89S52是低电压,高性能CMOS八位单片机,片内含8K字节的可反复擦写的只读程序存储器和256字节的随机存取数据存储器,器件采用ATMEL公司的高密度、非易失存储技术生产与标准MCS—51指令系统及8052产品引脚兼容,片内置通用八位中央处理器和Flash存储单元,功能强大适合于许多较复杂控制应用场合[6]。

AT89S52主要性能参数:

 与MCS-51产品指令和引脚完全兼容

9

徐州工程学院毕业设计(论文)

 8K字节可重复擦写Flash闪速存储器  1000次擦写周期  全静态操作:0Hz—33MHz  三级加密程序存储器  256×8字节内部RAM  32个可编程I/O口线  3个16位定时/计数器  8个中断源

 全双工可编程串行UART通道  低功耗空闲和掉电模式

 掉电后中断可唤醒  看门狗定时器  双数据指针  掉电标识符  快速编程周期

 灵活ISP编程(字节和模式) 芯片如图3-2—1所示:

图3—2—1 AT89S52引脚图

功能特性概述:

AT89S52提供以下标准功能:8K字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器。一个6向量两级中断结构,一个全双工串

10

徐州工程学院毕业设计(论文)

行通信口,片内振荡器及时钟电路。同时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—1 P1。0和P1.1的第二功能表

引脚号 P1.0

功能特性

T2(定时/计数器2外部计数脉冲输入),时钟输出

P1。1 T2EX(定时/计数2捕获/重装载触发和方向控制)

P2口是一个带有内部上拉电阻的8位双向 I/O,P2的输出缓冲级可驱动吸(收或输出电流4个TTL逻辑门电路。对端口 P2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I )。IL在访问外部程序存储器或 16 位地址的外部数据存储器(例如执行 MOVX @DPTR 指令)时,P2口送出高 8 位地址数据.在访问 8 位地址的外部数据存储器(如执行 MOVX @RI 指令)时,P2口输出P2 锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。

11

徐州工程学院毕业设计(论文)

P3口是一组带有内部上拉电阻的8位双向 I/O 口。P3口输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对 P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口.此时,被外部拉低的P3口将用上拉电阻输出电流。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能.

表3—2—2 P3口第二功能表

端口引脚 P3。0 P3。1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7

第二功能 RXD(串行输入口) TXD(串行输出口)

(外中断0) (外中断1 )

T0(定时/计数器0) T1(定时/计数器1) (外部数据存储器写选通) (外部数据存储器读选通)

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 则执行内部程序存储器中的指

12

徐州工程学院毕业设计(论文)

令.Flash 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须是该器件是使用 12V 编程电压 Vpp。

XTAL1:振荡器反相放大器的及内部时钟发生器的输入端. XTAL2: 振荡器反相放大器的输出。

3。2.2 电源电路

系统直流9V或者12V电池供电,由一片LM7805将9V/12V电源稳压在5V上。5V电源给所有芯片和电路供电。在电源电路中我们使用了两个滤波电容,使用滤波电容主要目的是为了消除电源波动对系统的干扰,提高系统的抗干扰能力,其中104电容是用来滤高频杂波干扰,220uF电容是用来滤低频杂波干扰。如图3-2—2所示:

U17805C1C2220104321123GNDS11VinVout3C3104R1300C4220D2LED4562 图3—2—2 电源电路图

3.2.3 时钟振荡电路

AT89S52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。片外石英晶体或者陶瓷谐振器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。这里我们采用电容30pF,晶振采用12MHZ。电路图如图3-2—3所示:

13

徐州工程学院毕业设计(论文)

图3-2-3 时钟振荡电路

3.2。4 复位电路

复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。

复位电路采用RC充电电路组成上电复位单片机电路,当系统上电时,在上电初期,电容C充电,使复位脚持续高电平,当C充电到达一定程度复位脚电位会慢慢变低,最后被电阻R完全拉低,高电平复位的时间由充电的时间决定,充电时间又由R与C的阻值和容值之积决定。一旦单片机复位脚拉低后就一直都低电平,只有下电后再上电才重新开始复位过程。电路图如图3—2—4所示:

U112345678+5V13121514314.7UC1191891716P10/TP11/TP12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRAT89S52RXDTXDALE/PPSEN10113029P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P273938373635343332212223242526272810KR1 图3—2-4 复位电路

14

徐州工程学院毕业设计(论文)

3.3 键盘扫描模块

本方案采用独立式按键接口设计,各按键相互独立,每个按键单独占用一根I/O口线,每根I/O口线的按键工作状态不会影响其他I/O口线上的工作状态。因此,通过检测输入线的电平状态可以很容易判断哪个按键被按下。键盘工作方式采用定时扫描方式,采用定时器T0定时,通过读取输出数据,识别按键工作状态。

键盘按键所用开关为机械弹性开关,利用了机械触点的合断作用。由于机械触点的的弹性作用,一个按键开关在闭合和断开的瞬间均有一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为10~100ms。电平信号的波动,有可能令CPU误解为多次按键操作,从而引起误处理。为了确保CPU对一次按键动作只确认一次按键,必须消除抖动的影响。

按键的消抖通常有软件和硬件两种消除方法。如果按键较多,硬件消抖将无法胜任,常采用软件消抖。本设计虽然按键少但还是采用常规的软件延时的方法:在第一次检测到有键按下时,执行一段延时子程序后,再确认电平是否仍保持闭电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。

判断键盘程序流程如图3—3所示:

循环 15

NO 同一键按下? YES YES 去键盘抖动 有键按下? NO 开始 根据键值执行功能功能 徐州工程学院毕业设计(论文)

图3-3 键盘判断程序流程图

3.4 显示模块

常见的基于单片机设计的MP3播放器基本不能显示歌曲。该音乐播放系统设计上增加液晶显示器,可为使用者提供曲目信息.由于LED数码管只能显示数字而无法显示其他中英文字符,并对成本及功能考虑,因此从设计的成本及功能的角度考虑,采用LCD—1602显示模块,它可以显示每首曲目的英文名字。LCD—1602驱动电路简单,可以由单片机直接输出命令驱动.LCD各引脚功能如图表3-4所示:

表3—4 LCD引脚功能

编号 1 2 3 4 5 6 7 08

符号 VSS VDD VL RS R/W E D0 D1

引脚说明 电源地 电源正极 对比度调节 数据/命令选择 读/写选择 模块使能端 双向数据口 双向数据口

编号 9 10 11 12 13 14 15 16

符号 D2 D3 D4 D5 D6 D7 BLK BLA

引脚说明 双向数据口 双向数据口 双向数据口 双向数据口 双向数据口 双向数据口 背光源地 背光源正极

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左右.

16

徐州工程学院毕业设计(论文)

BLK: LED背光地端。

3.5 播放模块

通过蜂鸣器实现发声,当三极管基级由单片机控制变成高电平时,V1导通并工作在饱和区,由于集电极和发射极之间的电压差几乎等于0,故相当于蜂鸣器的另一个脚接地,蜂鸣器会发出蜂鸣声。当三极管基级由单片机控制变成高低电平时,V1不导通并工作在截止区,那么蜂鸣器的另一个脚接到高电平,蜂鸣器不发出蜂鸣声.可以通过改变三极管基级的开关频率来控制蜂鸣器发出各种不同频率的声音。另外,蜂鸣器需要三极管驱动,而不能由单片机口线直接驱动,因为蜂鸣器的工作电流比较大(大概100mA),故单片机口线不能承受。

U1123456781312151431191891716P10/TP11/TP12P13P14P15P16P17INT1INT0T1T0EA/VPX1X2RESETRDWRAT89S52RXDTXDALE/PPSEN10113029P00P01P02P03P04P05P06P07P20P21P22P23P24P25P26P2739383736353433322122232425262728+5VR13309015PNPUBUZZER 图3-5 蜂鸣器发声模块图

17

徐州工程学院毕业设计(论文)

4 系统软件设计

4。1编程原理及流程图

音乐发声设计原理[8]: (1)总体原理:

一首乐曲是由多个音符构成的.每个音符都对应着一个确定的频率,乐曲中不同的音符,实质就是不同频率的声音;另外每个音符会根据乐曲的要求设定一个确定的节拍。可以控制单片机产生不同频率不同节拍的脉冲信号,由蜂鸣器发出就产生了美妙和谐的乐曲。

(2) 单片机产生不同频率脉冲信号的原理:

1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。

2)利用单片机内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:

例如,频率为523Hz,其周期天/523 S=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 计算举例:

18

徐州工程学院毕业设计(论文)

设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=65059

4) 每个音符使用1个字节,字节高4位代表音符高低,低4位代表音符 节拍.假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。只要求得1/4拍的DELAY时间,其余节拍则为它的倍数,本设计取4/4调值,延时时间为125ms,其中节拍码与实际节拍对照表4—1-1。

表4-1-1简谱对应的频率、简谱码和计数初值表

简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5

发音 低音SO 低音LA 低音SI 中音DO 中音RE 中音MI 中音FA 中音SO 中音LA 中音SI 高音DO 高音RE 高音MI 高音FA 高音SO 不发音 频率(Hz) 392 440 494 523 587 659 698 784 880 988 1046 1175 1318 1397 1568 计数初值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217 简谱码 1 2 3 4 5 6 7 8 9 A B C D E F 0 表4—1-2节拍码与实际节拍对照表 节拍码 1 2 3 实际节拍 1/4拍 2/4拍 3/4拍 节拍码 5 6 8 实际节拍 1又1/4拍 1又1/2拍 2拍 节拍码 C F 实际节拍 3拍 3又3/4拍 19

徐州工程学院毕业设计(论文)

4 1拍 A 2又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所示:

20

徐州工程学院毕业设计(论文)

图4-1 主程序流程图

如图4-2所示,开始播放自定义音乐程序时,指针指向乐谱第一个字节,将第一字节拆分为高低字节,其高字节即为音符中音高对应定时器定时常数,低字节即为音符中节拍对应的1/4节拍的次数,同时启动中断定时器0工作在方式1,由定时器定时常数得到相应音高,通过延时子程序设定1/4节拍的时间,由节拍次数得到节拍,再读取下一个乐谱字节,循环下去则演奏出美妙和谐的乐曲[9]。

拆分字节的高低字节 开始程序 指向乐谱第一个字节 由高字节得音高对应定时器定时常数 21 由低字节得到节拍对应节拍次数 徐州工程学院毕业设计(论文)

图4-2 音乐播放子程序流程图

5 调试与仿真结果

5。1 软件调试

结构化软件的调试一般可以将重点放在分模块调试上,通调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,借助于软件仿真器即可;后者一般需要仿真系统的支持.在本次设计中利用的是KEIL C51软件仿真器,其评估版本可以免费获取,只是有2KB代码限制。

基于MCS-51的MP3播放器的设计与实现的调试,主要集中在对扬声器的输

22

徐州工程学院毕业设计(论文)

出音乐部分的调试以及键盘控制和LED显示部分的调试上。在编写完整的MP3播放器程序前,可以先按照如下的顺序分别调试各个功能模块的程序。

5.1。1 测试LED显示模块

(1)调试目的

使用P2口作为输出口实现LED的显示,从而检测P2口及LED显示模块是否正常工作。

(2)调试程序

MAIN: MOV TMOD, #10H ;定时器T1工作在方式1 MOV TH1, #3CH

MOV TL1, #0B0H ;T=50ms

START: MOV R1,#00H ;计数显示初始化 MOV DPTR,#TAB DISP: MOV A,R1

MOVC A,@A+DPTR ;查表得显示的字型码 MOV P2,A ;数码管显示0 ACALL DELAY1S ;延时1S INC R1 ;计数值加1

CJNE R1,#10,DISP ;秒值不到10,继续显示;否则清0 MOV R1,#00H ;计数值清0 SJMP DISP

TAB: DB 0C0H,0F9H,0A4H ;0,1,2 DB 0B0H,99H,92H ;3,4,5 DB 82H,0F8H,80H ;6,7,8 DB 90H ;9 DELAY1S: ;延时子程序

MOV R3,#14H ;置50MS计数循环初值 SETB TR1 ;启动T1

LP1: JBC TF1,LP2 ;查询计数溢出 SJMP LP1 ;未到50MS继续计数 LP2: MOV TH1,#3CH ;重新置定时器初值 MOV TL1,#0B0H

DJNZ R3,LP1 ;未到1S继续循环 RET ;返回主程序

23

徐州工程学院毕业设计(论文)

(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: MOV SP, #60H MOV TMOD, #11H MOV IE, #8AH

MOV IP, #08H ;T1中断优先于T0中断 MOV TH1, #3CH

MOV TL1, #0B0H ;以上为系统初始化,T=50ms HERE:SJMP HERE INT_T0: CLR TR0

24

徐州工程学院毕业设计(论文)

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 的高电平和地引脚接错了,这是一个常识性的错误,

25

徐州工程学院毕业设计(论文)

它给我了深刻的教训,做事情要细心认真。

(2)蜂鸣器不能正常播放音乐 在protues仿真中的蜂鸣器老是不能正常响,会断断续续地播放,经过我几天的调试,我发现应该是电平驱动的问题,是由于三极管的失真造成的。最后终于能播放音乐了。

最终仿真结果如图5—3所示:

图 5—3 仿真图

结束语

我的题目是MP3播放器软件的设计,对于我们这些工科学生来说,这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性,而不会忙无一用?这都是我们所要考虑和努力的.这次课程设计我学到很多很多的东西,学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,掌握了一种系统的研究方法,可以进行一些简单的编程。通过这次使我懂得了理

26

徐州工程学院毕业设计(论文)

论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

我设计的MP3播放器采用蜂鸣器作为MP3播放器件,若针对现在流行的WAV、MP3等音乐质量很好的系统,它就不是一个好的选择,这是本设计的不足。当然本设计也要考虑到性能和价格之比,和它驱动起来比较简单。 同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好。这次课程设计通过自己的努力,同学的帮助,还有老师的辛勤指导下,最终顺利完成了。

致 谢

经过几个月的忙碌,本次毕业论文设计已经接近尾声.,由于经验的匮乏,难免有许多考虑不到的地方,在多次的修改和研究之后才写出完成.如果没有导师的督促和指导,以及同学和朋友的支持,想要完成这个毕业论文设计是难以想像的。感谢同学和朋友的及时帮助和教导。

在论文的写作过程中,得到了陈豹老师的亲切关怀和耐心的指导。老师严谨的治学态度和科学的工作方法给了我极大的帮助和影响。从课题的选择得到毕业

27

徐州工程学院毕业设计(论文)

论文设计最终完成,老师都始终给予我细心的指导。在此谨向陈豹老师致以诚挚的谢意和崇高的敬意。同时,也要感谢各位老师,同学和朋友们给我极大的支持,对我的论文提出了宝贵的意见及建议。

感谢所有帮助我的老师、同学和朋友们,在此向他们表达我的感激之情。

参考文献

[1] 黄振杰,卢小冰。基于AT89S52的多功能音乐播放器[J]。广东:电子设计工程,2009年2月第2期

[2] 吴迅。用单片机设计音乐播放器[J].山东:电子世界,2009。6

[3] 朱清慧等。Protues教程—电子线路设计、制版与仿真[M].北京:清华大学出版社2008.9 [4] 侯玉宝, 陈忠平,,李成群. 基于Proteus的51系列单片机设计与仿真。[M]北京 电子

28

徐州工程学院毕业设计(论文)

工业出版社,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

#define uchar unsigned char #define uchar unsigned char #define uint unsigned int

附录

29

徐州工程学院毕业设计(论文)

#define LCDPORT P0

uchar code tab[]=”Press key\"; uchar code tab1[]=”Select song\"; uchar code tab2[]=\"First Song” ; uchar code tab3[]=”butterfly”; uchar code tab4[]=\"Second Song\" ; uchar code tab5[]=\"Jingle bell ”; uchar code tab6[]=”Third Song” ; uchar code tab7[]=”Yesterday\"; uchar code tab8[]=”Forth Song\" ; uchar code tab9[]=\"Youth League”; sbit LCDE=P2^2; sbit LCDRW=P2^1; sbit LCDRS=P2^0;

#define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ

#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔

sbit BeepIO = P3^7; //定义输出管脚 sbit K1=P1^7;

unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表

unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置

unsigned char code LengthTab[7]= { 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 code Music_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,

30

徐州工程学院毕业设计(论文)

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 }; unsigned char code Music_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 }; unsigned char code Music_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,

31

徐州工程学院毕业设计(论文)

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 }; unsigned char code Music_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,

32

徐州工程学院毕业设计(论文)

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 };

uchar k;

void delay1(void) //延时程序 {

uchar i,j;

for(i=20;i>0;i——)

for(j=248;j〉0;j—-); }

void Getch ( ) { uchar X,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 ) //判断键值(那一个键按下) {

case 0xf9: k=0; break; //对键值赋值 case 0xf5: k=1; break; case 0xfa: k=2; break; case 0xf6: k=3; break; } } } }

void Delay() { uint uiCount;

for(uiCount=0;uiCount〈250;uiCount++);

33

徐州工程学院毕业设计(论文)

}

void WriteCMD(uchar Commond)//LCD写指令函数 {

Delay(); //先延时。

LCDE=1; //然后把LCD改为写入命令状态。 LCDRS=0; LCDRW=0;

LCDPORT=Commond; //再输出命令。 LCDE=0; //最后执行命令。 }

void WriteData(uchar dat)//LCD写数据函数 { Delay(); //先延时。

LCDE=1; //然后把LCD改为写入数据状态。 LCDRS=1; LCDRW=0;

LCDPORT=dat; //再输出数据。 LCDE=0; //最后显示数据。 }

void init() {

LCDRW=0; LCDE=0; WriteCMD(0x38); WriteCMD(0x0c); WriteCMD(0x06); WriteCMD(0x01); WriteCMD(0x80); }

void mydelay(int x) { int i,j;

for(i=x;i〉0;i——) for(j=255;j>0;j-—); }

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应装入的初值

34

徐州工程学院毕业设计(论文)

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1; }

void BeepTimer0(void) interrupt 1 //音符发生中断 {

BeepIO = !BeepIO;

TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; }

void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) {

unsigned int NewFreTab[12]; //新的频率表 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<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; else if(Octachord == 3) NewFreTab[i]〈〈=2; }

SoundLength = 0;

35

徐州工程学院毕业设计(论文)

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; //低音 if (SM==3) CurrentFre <〈= 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是对中断延时的补偿 }

SLen=LengthTab[Length%10]; //算出是几分音符

XG=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 (SLen〈=4)

LDiv1=LDiv-LDiv4;

36

徐州工程学院毕业设计(论文)

else

LDiv1=LDiv*SOUND_SPACE; else

LDiv1=LDiv/2; //算出顿音的演奏长度 else

LDiv1=LDiv;

if(SL==0) LDiv1=0;

LDiv2=LDiv—LDiv1; //算出不发音的长度 if (SL!=0) {

TR0=1;

for(i=LDiv1;i〉0;i——) //发规定长度的音 {

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } }

if(LDiv2!=0) {

TR0=0; BeepIO=0;

for(i=LDiv2;i>0;i—-) //音符间的间隔 {

while(TF1==0);

TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } }

Point+=2;

Tone=Sound[Point]; Length=Sound[Point+1]; }

BeepIO = 0; }

main() { uint i; k=8;

37

徐州工程学院毕业设计(论文)

init(); for(i=0;i〈15;i++) {

WriteData(tab[i]); //LCD写数据函数写第一行 mydelay(50); }

mydelay(1000);

WriteCMD(0x80+0x40+2); //将指针设到第二行空两字符 for(i=0;i<6;i++) {

WriteData(tab1[i]); mydelay(50); }

InitialSound(); //发音初始化程序 while(1)

{ Getch(); //扫描键盘,获得键值 if(k==0) //若键值为0 { uint i; init();

for(i=0;i<10;i++) {

WriteData(tab2[i]); //写第一首歌序号 mydelay(50); }

mydelay(1000);

WriteCMD(0x80+0x40); //转到第二行 for(i=0;i<9;i++)

{ WriteData(tab3[i]); //写歌名 mydelay(50); }

Play(Music_Girl,0,3,360); //播放第一首歌 mydelay(500); break; }

else if (k==1) //若键值为1 { uint i; init();

for(i=0;i<11;i++)

{ WriteData(tab4[i]); //写第二首歌序号 mydelay(50); }

mydelay(1000);

38

徐州工程学院毕业设计(论文)

WriteCMD(0x80+0x40); //转到第二行 for(i=0;i<11;i++) {

WriteData(tab5[i]); //写歌名 mydelay(50); }

Play(Music_Jingle,0,3,360); //播放第二首歌 mydelay(500); break; }

else if (k==2) //若键值为2 { uint i; init();

for(i=0;i<10;i++) { WriteData(tab6[i]); //写第三首歌序号 mydelay(50); }

mydelay(1000);

//WriteCMD(0x01);

WriteCMD(0x80+0x40); //转到第二行 for(i=0;i<6;i++) {

WriteData(tab7[i]); //写歌名 mydelay(50); }

Play(Music_Two,0,3,360); //播放第三首歌 mydelay(500); break; }

else if (k==3) //若键值为3 { uint i; init();

for(i=0;i〈10;i++)

{ WriteData(tab8[i]); //写第四首歌序号 mydelay(50); }

mydelay(1000);

WriteCMD(0x80+0x40); //转到第二行 for(i=0;i〈6;i++) { WriteData(tab9[i]); //写歌名 mydelay(50); }

39

徐州工程学院毕业设计(论文)

Play(Music_Jingle,0,3,360); //播放第三首歌 mydelay(500); break; } } }

40

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务