资源描述
图书分类号:
密 级:
毕业设计(论文)
基于单片机的MP3播放器设计
学生姓名
汤明
学院名称
信电工程学院
专业名称
电子信息工程
指导教师
陈豹
2012年
5月
10日
摘要
因为单片机编写的MP3播放器具有执行效率高、频率输出稳定、易于修改、高可靠性、高性价比、低电压、低功耗等,使单片机近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、数据采集系统、智能化仪器仪表、及通讯设备、日常消费类产品、玩具等 [1] 。利用单片机设计的MP3播放器具有硬件电路简单,软件运行可靠等特点。本文介绍了一种以 AT89S52 单片机为控制核心的MP3。该设计采用2*16个点阵液晶模块LCD1602作为显示界面,蜂鸣器作为发声元件,并利用定时器进行中断控制。
本文分析了基于单片机的MP3播放器的工作原理,详细介绍了MP3播放器的功能及其硬件设计和软件设计的方法,给出了基于MCS-51单片机的MP3播放器的具体实现方案并重点讲述了其硬件实现与软件编写,实现了单片机MP3播放器对音乐的演奏。
关键词:MP3播放器;AT89S52;LCD1602
目 录
摘要 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 键盘扫描模块 14
3.4 显示模块 15
3.5 播放模块 16
4 系统软件设计 18
4.1编程原理及流程图 18
5 调试与仿真结果 22
5.1 软件调试 22
5.1.1 测试LED显示模块 22
5.1.2 测试键盘控制模块 23
5.1.3 测试P3.0口输出 23
5.2 调试中遇到的问题及解决 24
5.3 仿真结果 25
结束语 26
致 谢 27
参考文献 28
附录 29
附录1 源程序 29
1绪论
几千年来,各种乐器的发声无一不是依靠琴弦、簧片、哨片引起管柱振动而作为声源的。随着现代电子工业技术的飞速发展,一种用新的声源来制造音响的新型乐器脱颖而出,这就是目前人们熟知的电子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.3 KEIL开发系统
使用Keil软件建立一个工程:
Keil是目前进行51单片机开发最常用的编译软件。关于Keil的使用,有很多的资料介绍,这里只介绍其整个编译过程。在Keil里,每一个完整的程序,都是以一个工程的形式建立的。一个工程里可以有一个或多个*.c文件和*.h文件,但只可以有一个main()函数。一般的做法是将包含main()函数的C文件加入到工程中,其他文件以#include头文件的形式加到这个C文件里。这样,在编译的时候,其他的文件会被自动的导入到工程里来。
打开Keil软件后,出现(图2-3-1)所示界面。当然,如果Keil在上次关闭时有打开的工程,再一次打开时它会自动加载上一次的工程文件。
图2-3-1 Keil软件主界面
首先点击Project->New Project…(Project->Open Project…为打开一个已经存在的工程),如图2-3-2所示。
图2-3-2 Keil软件打开新工程界面
点开后,在出现的对话框中选择工程存在路径,单击“保存”后,出现(如图2-3-3所示)界面。在此界面上选择电路板上所用的单片机型号:Atmel AT89S51(或者是AT89S52,视开发板上具体型号而定),单击“确定”。
图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 ’Source Group 1’。在打开的对话框中,选择刚存的文件路径和对应的文件名。
图2-3-5 添加文件到工程中
下一步,就开始编译刚输入进去的代码。点击工具栏中的按钮。接着,Keil会打出下面的提示:
Build target 'Target 1'
assembling led.asm...
linking...
Program Size: data=8.0 xdata=0 code=100
"first" - 0 Error(s), 0 Warning(s).
其中“"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文件。
图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平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简称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主要性能参数:
u Ø 与MCS-51产品指令和引脚完全兼容
u Ø 8K字节可重复擦写Flash闪速存储器
u Ø 1000次擦写周期
u Ø 全静态操作:0Hz—33MHz
u Ø 三级加密程序存储器
u Ø 256×8字节内部RAM
u Ø 32个可编程I/O口线
u Ø 3个16位定时/计数器
u Ø 8个中断源
u Ø 全双工可编程串行UART通道
u Ø 低功耗空闲和掉电模式
u Ø 掉电后中断可唤醒
u Ø 看门狗定时器
u Ø 双数据指针
u Ø 掉电标识符
u Ø 快速编程周期
u Ø 灵活ISP编程(字节和模式)
芯片如图3-2-1所示:
图3-2-1 AT89S52引脚图
功能特性概述:
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-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亦接收高位地址和一些控制信号。
P3口是一组带有内部上拉电阻的8位双向 I/O 口。P3口输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对 P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能。
表3-2-2 P3口第二功能表
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外中断0)
P3.3
(外中断1 )
P3.4
T0(定时/计数器0)
P3.5
T1(定时/计数器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所示:
有键按下?
开始
去键盘抖动
同一键按下?
根据键值执行功能功能
循环
YES
NO
YES
NO
图3-3 键盘判断程序流程图
3.4 显示模块
常见的基于单片机设计的MP3播放器基本不能显示歌曲。该音乐播放系统设计上增加液晶显示器,可为使用者提供曲目信息。由于LED数码管只能显示数字而无法显示其他中英文字符,并对成本及功能考虑,因此从设计的成本及功能的角度考虑,采用LCD-1602显示模块,它可以显示每首曲目的英文名字。LCD-1602驱动电路简单,可以由单片机直接输出命令驱动。LCD各引脚功能如图表3-4所示:
表3-4 LCD引脚功能
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
双向数据口
2
VDD
电源正极
10
D3
双向数据口
3
VL
对比度调节
11
D4
双向数据口
4
RS
数据/命令选择
12
D5
双向数据口
5
R/W
读/写选择
13
D6
双向数据口
6
E
模块使能端
14
D7
双向数据口
7
D0
双向数据口
15
BLK
背光源地
08
D1
双向数据口
16
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左右。
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,其周期天/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
计算举例:
设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简谱对应的频率、简谱码和计数初值表
简谱
发音
频率(Hz)
计数初值
简谱码
5
低音SO
392
64260
1
6
低音LA
440
64400
2
7
低音SI
494
64524
3
1
中音DO
523
64580
4
2
中音RE
587
64684
5
3
中音MI
659
64777
6
4
中音FA
698
64820
7
5
中音SO
784
64898
8
6
中音LA
880
64968
9
7
中音SI
988
65030
A
1
高音DO
1046
65058
B
2
高音RE
1175
65110
C
3
高音MI
1318
65157
D
4
高音FA
1397
65178
E
5
高音SO
1568
65217
F
不发音
0
表4-1-2节拍码与实际节拍对照表
节拍码
实际节拍
节拍码
实际节拍
节拍码
实际节拍
1
1/4拍
5
1又1/4拍
C
3拍
2
2/4拍
6
1又1/2拍
F
3又3/4拍
3
3/4拍
8
2拍
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所示:
图4-1 主程序流程图
如图4-2所示,开始播放自定义音乐程序时,指针指向乐谱第一个字节,将第一字节拆分为高低字节,其高字节即为音符中音高对应定时器定时常数,低字节即为音符中节拍对应的1/4节拍的次数,同时启动中断定时器0工作在方式1,由定时器定时常数得到相应音高,通过延时子程序设定1/4节拍的时间,由节拍次数得到节拍,再读取下一个乐谱字节,循环下去则演奏出美妙和谐的乐曲[9]。
开始程序
指向乐谱第一个字节
拆分字节的高低字节
由高字节得音高对应定时器定时常数
由低字节得到节拍对应节拍次数
启动定时器0
延时节拍时间
关闭定时器0
读取下一个乐谱字节
字节是00H吗?
程序循环
YES
NO
图4-2 音乐播放子程序流程图
5 调试与仿真结果
5.1 软件调试
结构化软件的调试一般可以将重点放在分模块调试上,通调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,借助于软件仿真器即可;后者一般需要仿真系统的支持。在本次设计中利用的是KEIL C51软件仿真器,其评估版本可以免费获取,只是有2KB代码限制。
基于MCS-51的MP3播放器的设计与实现的调试,主要集中在对扬声器的输出音乐部分的调试以及键盘控制和LED显示部分的调试上。在编写完整的MP3播放器程序前,可以先按照如下的顺序分别调试各个功能模块的程序。
5.1.1 测试LED显示模块
(1)调试目的
使用P2口作为输出口实现LED的显示,从而检测P2口及LED显示模块是否正
展开阅读全文