可控LCD数字音乐盒设计

上传人:博****1 文档编号:574426815 上传时间:2024-08-16 格式:PDF 页数:34 大小:2.26MB
返回 下载 相关 举报
可控LCD数字音乐盒设计_第1页
第1页 / 共34页
可控LCD数字音乐盒设计_第2页
第2页 / 共34页
可控LCD数字音乐盒设计_第3页
第3页 / 共34页
可控LCD数字音乐盒设计_第4页
第4页 / 共34页
可控LCD数字音乐盒设计_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《可控LCD数字音乐盒设计》由会员分享,可在线阅读,更多相关《可控LCD数字音乐盒设计(34页珍藏版)》请在金锄头文库上搜索。

1、 摘要 本设计的数字音乐盒以 AT89C51 单片机为核心,用 C 语言编写。利用单片机的定时器产生不同频率的声波,由 I/O 口输出,继而启动蜂鸣器发出音乐。通过外部中断进行歌曲切换,通过按键控制播放/暂停。实现几首乐谱的循环播放,同时 LCD 1602 显示自定义字符“”、正在播放曲谱编号、曲谱总数、曲谱名滚动。 关键词:AT89C51;LCD;数字音乐盒 Controllable LCD Digital Music Box ABSTRACT This digital music box is designed with AT89C51 microcontroller as the cor

2、e, the program written in the C language. The music box produces different frequency square waves from the I/O port by controlling the MCU internal timer, afterwards activates the buzzer to sound. Switch songs through external interrupt, pushing the key to control the music play or pause. Achieving

3、some music loops, while LCD1602 shows a custom character , the number of the playing music, the total number of music, and the song name scrolls. Key words:AT89C51; LCD; Digital music box 目录 1. 绪 论 . 1 1.1 设计的背景与意义 . 1 1.2 国内外的研究现状 . 2 2. 设计原理及总体方案 . 3 2.1 设计要求 . 3 2.2 音乐的产生原理 . 3 2.3 总体方案 . 5 3. 硬件

4、电路设计 . 6 3.1 AT89C51 芯片简介 . 6 3.2 时钟振荡电路 . 7 3.3 LCD 显示电路 . 7 3.4 功能键与蜂鸣器电路 . 8 3.5 LCD1602 使用说明 . 8 4. 软件设计 . 12 4.1 程序流程图 . 12 4.2 部分程序解析 . 12 4.3 系统仿真与分析 . 14 总 结 . 17 参考文献 . 18 附录 A 完整系统电路仿真图 . 19 附录 B Bill Of Materials . 20 附录 C 系统源程序 . 21 致 谢 . 31 1 基于单片机的可控 LCD 数字音乐盒的设计 1. 绪 论 设计的背景与意义 音乐是无国界

5、的,它是世界各国交流的通用语言,它能表达人们的不同情感,又给人们美妙的艺术享受。如今,音乐已遍布世界各个角落,音乐已得到飞速发展,与此同时各种形式的音乐盒也应运而生。虽然已无法考证音乐到底在什么时期产生的,但可追溯到音乐盒的起源, 是中古时代 (约476年西罗马帝国灭亡1640年英国资产阶级革命为时限)欧洲文艺复兴时期。当时产生的音乐盒就是所谓的传统音乐盒,是机械式的,他们往往比较笨重,发音易受外界干扰,发出的音乐过于单调,不够悦耳动听,不能够给人们美妙的精神享受。故传统的机械式音乐盒早已不能满足人们今天的需求。 在今天这个时代,人们早已不满足于过去机械式音乐盒仅仅作为制造音乐的单一声源功能。

6、人们在享受美妙的音乐的同时,还希望能够将这美妙的音乐存储起来,以便在需要的时候可随时听到自己想要的歌曲。更进一步的,人们还期盼随时向音乐盒中存储音乐,更新音乐。有需求,便有了产物,一种新型的音乐盒电子音乐盒便产生了。当今这个信息时代是一个数字时代,数字信号相较模拟信号通用性强,抗干扰,精度高,便于长期存储等诸多优势。正是这些优势满足了人们的需求,得以应用到了音乐盒身上。基于单片机的音乐盒便是一种简单的数字音乐盒,在很多方面都有应用,如更成熟的音频播放器MP3、音视频播放器 MP4,音乐门禁,音乐喷泉等。以往的发音单一、笨重的机械音乐盒已经不够令人满意。本设计以单片机为核心的数字音乐盒体积小,轻

7、便,可以演奏多首音乐,带有 LCD 显示功能,可变换多种显示花样,容易使用。虽然当下更为完美的音乐播放器已经诞生,但本设计的音乐盒工艺简单、成本低核心部件单片机 3 元左右,LCD 显示屏 7 元左右;再有,很多地方并不要求音乐盒十分完美,所以该音乐盒还是值得开发。这种音乐盒可以做成不同的样式,可以设计成精美的艺术品,颇受热爱收藏的音乐爱好这青睐。 另外, 对于热爱 DIY 的人们来说, 单片机音乐盒也有很多用处, 他们可以利用它 DIY出精美的礼品,经过添加一些其他元素来设计出具有创意性的物品,值得收藏。如今嵌入式的应用十分广泛,发展前景十分可观,做为嵌入式的基础,利用单片机设计一些东西是

8、2 很有意义的。我们可以利用单片机音乐盒设以嵌入式计成一些产品,增添产品的特色。本设计的音乐盒是音乐播放器的基础,有必要了解其基本原理,为以后探究更完美的产品做铺垫,具有一定的研究价值。 国内外的研究现状 现今,单片机技术已经很成熟,其应用也更加广泛,在各个领域中单片机所起的重要作用更是不必多说。特别是此刻嵌入式体系蓬勃发展,其成长空间极其广漠。数码时期,信息时期让嵌入式产品有了非常泛博的成长机缘,嵌入式的成长前途非常可观。而嵌入式体系便是基于单片机这类微处理器的,故而这就为单片机的成长提供了更阔的空间。单片机实质上也是一种计算机,结合了控制功能和计算机结构,利用大规模集成电路技术集成在一个芯

9、片上1。 现在, 电子音乐的利用已非常普遍, 其花样也很不少。 简单的音乐卡片,高保真的 CD,流行的 MP3 都是电子音乐的范畴。在音质已经得到保证的今天,音乐盒正朝着迷你化,更加轻便,简单易用的方向发展。人们正在研究设计出更加精美、炫酷的音乐播放器,追求在娱乐的同时享受音乐的美妙。联合嵌入式将音乐盒设计成不同形式,像现在的智能手机中的音乐播放器,车载音乐播放器等。这都是为了人们更便利地利用。所以,现在音乐盒的研究归根结底还是向着简洁,易用,携带方便,功能更强,娱乐性更强的方向发展。 3 2. 设计原理及总体方案 要设计一个基于单片机的可控并带有显示特性的数字音乐盒,就得了解音乐的原理,显示

10、载体等问题。了解到这些之后,便可制定出一个完整的可行方案,完成音乐盒的设计了。 设计要求 1) 设计一个数字音乐盒,能播出几首乐曲。 2) 具有显示功能,如正在播放乐曲的名字,乐曲数目。 3) 可以按键操控,能中途控制乐曲的暂停/播放,具备选曲功能。 音乐的产生原理 简而言之,音乐的产生有两个要素:音调和节拍。固然,现实动听的音乐更复杂,但单片机通常处理的是单音音频,无相对应振幅的谐波频率,因此表达不出多种音色。故对单片机来说,只需明确节拍和音调两个定义方可,它们构成一个音符,多个音符组成一首音乐。 1) 音调和节拍 常见的简谱 1、2、3、4、5、6、7 是音乐的 7 个基本音调,不同的发音

11、实质是音调的频率不同所决定的2。使用单片机可方便地在输入/输出口生成不同频率的脉冲以获得不同音调。 让定时器轮回计时某音频周期的一半时间,每当计时到后变换输出脉冲的高低电平,便获取此音频。 若定时器选取方式 0 工作,晶振频率12MHz=fOSC,定时初始计数值 N 与音符频率 F的关系为: ()OSCf12N-8192=2F1 (2-1) 即 2F10-8192=6 (2-2) 假设频率 523Hz,1046Hz,587Hz 的计数初始值为1N,2N,3N,则。 7341=587210-8192=N7712=1046210-8192=N7236=523210-8192=N636261, 本文

12、采用 12MHz 晶振,定时器 0 在方式 0 下工作,所涉及的音符频率对应于计数初 4 值关系均可由公式(2-2)得到。 节拍(Beat)表示音调持续时间的长短,用拍数表示,见表 2-1。音乐的旋律变化便是用节拍来调节各个音的快慢实现的。1 拍持续的时间,非硬性规定,同一首乐谱可以有多种基准的节奏,只要设定延迟时间就可求得拍数。设 1/4 拍为 t, 则 1 拍应为 4t, 以此类推。于是,求得 1/4 拍的延时 t,其余的节拍就是 t 的倍数,即 4t拍数3。 表 2-1 节拍的定义 音符名称 写法 拍数 全音符 5 四拍 二分音符 5 二拍 四分音符 5 一拍 八分音符 5 半拍 十六分

13、音符 5 四分之一拍 三十二分音符 5 = 八分之一拍 2) 音调和节拍的编码 DoSi 分别编码为 17,重音 DoSi 分别编为 8E。节拍以十六分音符为基准编为 1,4 个十六分音符为四分音符即是一拍,编为 4。同理,可得其余节拍的编码。这里,一个音符编为一字节码,高 4 位是音调,而低 4 位作为节拍,曲子结束标志为 0xff。比如:音调Fa 发音长度为 1 拍,即四分音符,编码为 0x44;半个节拍长度发音 Si 为八分音符记为0x72。见表 2-2 音调与节拍的编码。 将乐谱的各个音符编码后,存放在一个无符号字符型数组中,便得到了该乐谱的代码表。要播放该曲,只需从数组中依次取出一个

14、元素,再截取高 4 位得到音调,继而获取对应的计数初始值传递给定时器 0,进而定时器 0 工作启动蜂鸣器发出该音;截取余下的低4 位,获得延时长度,接着通过延时函数完成节拍延迟。如此循环,便将一首完整的曲子演奏了出来。 5 表 2-2 音调与节拍的编码 简谱 发音 简谱码 简谱 发音 简谱码 节拍码 节拍数 5 低音 So 1 1 高音Do B 1 1/4 拍 6 低音 La 2 2 高音 Re C 2 2/4 拍 7 低音 Ti 3 3 高音 Mi D 3 3/4 拍 1 中音 Do 4 4 高音 Fa E 4 1 拍 2 中音 Re 5 5 高音 So F 5 1 又 1/4 拍 3 中音

15、 Mi 6 6 1 又 1/2 拍 4 中音 Fa 7 8 2 拍 5 中音 So 8 A 2 又 1/2 拍 6 中音 La 9 C 3 拍 7 中音 Ti A F 3 又 3/4 拍 总体方案 前面了解了音乐的简单原理, 也就找到了突破口音调的产生与节拍的延时。 这里,选用的核心芯片是 AT89C51 单片机,利用定时器 0 在工作方式 1 下产生方波,利用延时函数实现节拍。 本设计信息的显示是利用 1602 液晶显示屏。播放/暂停按键连接一个 I/O 口,通过每周期查询一次 I/O 口状态的方式确定是否有按键动作,进而控制播放和暂停。通过单片机的两个外部中断分别实现上一曲和下一曲的选曲功

16、能。总体设计框图见图 2-1 。 功能键 时钟与复位电路 显示模块LCD1602 蜂鸣器 AT89C51 图 2-1 总体设计框图 6 3. 硬件电路设计 由总体设计框图(图 2-1 ) ,分别设计各模块电路。 AT89C51 芯片简介 AT89C51 芯片内部 ROM 共 4K 字节,能进行上千次擦写,内部 RAM 共 256 字节,这其中包括可供用户使用低 128 单元和高 128 单元的专用寄存器, 两个 16 位定时器和 4 个 8位 I/O 口,俗称单片机4。如图 3-1 、图 3-2 所示。 图 3-1 AT89C51 单片机引脚图 图 3-2 AT89C51 单片机实物图 部分芯

17、片引脚介绍: 1) 输入/输出口线 AT89C51 有 4 个 I/O 口线:P0、P1、P2、P3,均为 8 位并行 I/O 口5。其中 P0 口内部没有提供上位电阻,故不能提供高电平,仅有低电平和悬空状态。在使用该口时,若要输出高电平,必须人为在外部通过上位电阻与电源连接。P1P3 口内置了上位电阻,自身可提供高、低两种电平,无需再外接上为电阻。 2) P3 口除了普通 I/O 口的功能外还有第二功能,平时用的多的就是它的第二功能,其详细说明见表 3-1 。 7 表 3-1 P3 口线的第二功能 口线 第二功能信号 第二功能信号名称 P3.0 RXD 串行数据接受 P3.1 TXD 串行数

18、据发送 P3.2 INT0 外部中断 0 申请 P3.3 INT1 外部中断 1 申请 P3.4 T0 定时器/计数器 0 计数输入 P3.5 T1 定时器/计数器 1 计数输入 P3.6 WR 外部数据存储器(RAM)写选通 P3.7 RD 外部数据存储器(RAM)读选通 3) EAROM 选择控制信号,低电平时,程序从外部 ROM(0000HFFFFH)开始执行;高电平时,从内部 0000H0FFF 共 4K 字节 ROM 开始,超出 4K 字节范围后便转向外部 ROM6。 时钟振荡电路 AT89C51 是用三点式电容振荡电路作为时钟振荡电路的,其具体原理可参考相关“三点式电容振荡电路”的

19、资料7。时钟振荡电路连接如图 3-3 所示。为计算方便,这里晶振频率选用 12MHz。 该三点式电容振荡电路中, 晶振 X1 为感性元件, 相当于一个电感, 与 C1、C2 形成谐振,产生 180的相移,为此,根据参考资料电容 C1、C2 取值 22pF。 图 3-3 时钟振荡电路 LCD 显示电路 本设计采用液晶显示器 1602(仿真中用的 LM016l 与 LCD1602 原理相同,区别在于Proteus 中 LM016L 无 15、16 引脚,故没有背光)进行显示,接于P0 口。由于 P0 口是 8 8 位漏级开路双向 I/O 口,只有低电平和悬空状态,不能提供高电平,所以当向 LCD

20、输出指令字节时或显示数据时,要外接上拉电阻 RP18。采用模拟口线方式将 LM016L 的控制信号 RS、RW、E 分别接到单片机的 P2.0、P2.1、P2.2,如图 3-4 所示。 图 3-4 LCD 显示电路 功能键与蜂鸣器电路 音乐盒设有 3 个功能键:播放/暂停、上一首、下一首,均采用轻触式,即按下按键再弹起有效,也就是脉冲触发方式。播放/暂停键接 P1.0 口,程序每周期查询一次 P1.0 口的状态, 每改变一次状态就切换一下播放和暂停。 选曲功能采用中断方式, 上一首按键接 INT0,下一首按键接 INT1, 按下任一按键便发出与之对应的外部中断申请, 进而响应中断以实现选曲。

21、这里选择无源蜂鸣器作为发声装置,接于 P3.7 口。是利用 I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。 图 3-5 功能键和蜂鸣器电路 LCD1602 使用说明 9 常见的 1602 LCD 有 16 个引脚,少数 LCD 有 14 个,没有 15、16 背光引脚9。1602的各个引脚说明见表 3-2。 表 3-2 1602 引脚功能说明 符号 引脚说明 符号 引脚说明 VSS 电源地 D2 Data I/O VDD 电源正极 D3 Data I/O VL 液晶显示偏压信号 D4 Data I/O RS 数据/命令选择(H/L) D5 Data I/O R/W 读/写选择(H/L) D

22、6 Data I/O E 使能信号 D7 Data I/O D0 Data I/O BLA 背光源正极 D1 Data I/O BLK 背光源负极 1602 LCD 的显示功能都是有指令完成的,共有 11 条控制指令,如表 3-3 所示。 表 3-3 1602 指令表 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0

23、 0 0 1 S/C R/L * * 6 置功能 0 0 0 0 1 DL N F * * 7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 10 写数据到 RAM 1 0 要写的数据内容 11 从 RAM 中读数据 1 1 读出的数据内容 1602 液晶的指令需要用到四种基本操作:读状态、写指令、读数据、写数据10。具体操作规则如表 3-4 所示。 10 表 3-4 1602 LCD 的 4 种基本操作 操作 输入 输出 读状态 RS=L、RW=H、E=H D0D7=状态字 写指令

24、 RS=RW=L、D0D7=指令码、E=下降沿 无 读数据 RS=H、RW=H、E=H D0D7=数据 写数据 RS=H、RW=L、D0D7=数据、E=下降沿 无 实际操作中先根据四种基本操作对 RS、 R/W、 E 进行相应设置, 再将指令码送入 D7D0即可。部分指令说明如下: 1) 光标和显示模式: I/D为光标移动方向标志。 I/D=0, 操作后光标向左移 1字符; ID=1,操作后光标自动右移。S=0,禁止画面滚动;S=1,允许11。 按照我们一般的习惯,即显示一个字符后光标自动移动到下一个位置,就像 word 那样输入一个字符后不必手动设定下一个位置,以方便我们连续显示字符。这时只

25、要将指令码 06H 送入 D7D0 即可。 2) 显示开关控制:常用指令码 0CH,即 D=1 ,C=B=0显示屏开,不闪烁光标;指令码 08H,即 D= C = B=0,关闭显示屏,也不闪烁光标。 3) 置功能:常用指令码 038H,即 DL=1,D7D0 有效,N=1,F=02 行显示,57点阵字符体;指令码 03CH,即 DL=1,8位数据线,N=1,F=12 行,511 点阵12。 4) 置数据存贮器地址:设置显存位址,第一行:80HA7H,其中 80H8FH 与 LCD显示区域一一对应;第二行:C0HE7H,其中 C0HCFH 与显示区域一一对应13。 由此,我们可自定义字符首先设置

26、 CGRAM 起始地址,再将自定义字符代码写进CGRAM。这样自定义字符便和 1602 内置的字符一样,有自己的显示代码了,要显示自定义字符,只需把该字符的代码写入 DDRAM 即可。0x000x3F 为 6 位 CGRAM 有效地址,共 64 字节,可定义 8 个 58 或 4 个 511 点阵字符。仅使用每个 CGRAM 存储单元低 5 位作为字符代码数据14。具体字符代码与 CGRAM 的关系见表 3-5。 11 表 3-5 字符代码与 CGRAM 地址对应关系 58 点阵字符 511 点阵字符 字符代码 CGRAM 地址 字符代码 CGRAM 地址 0x00(0x08) 0x000x0

27、7 0x00(0x08) 0x000x0F 0x01(0x09) 0x080x0F 0x01(0x09) 0x100x1F 0x02(0x0A) 0x100x17 0x02(0x0A) 0x200x2F 0x03(0x0B) 0x180x1F 0x03(0x0B) 0x300x3F 0x04(0x0C) 0x200x27 0x05(0x0D) 0x280x2F 0x06(0x0E) 0x300x37 0x07(0x0F) 0x380x3F 如图 3-6 所示自定义字符“月”的字符代码数据存储在 00H07H 单元中, 所以字符代码为 0x00。 图 3-6 “月”字的 58 点阵字模数据 12

28、 4. 软件设计 本程序设计包含两个文件:Music Box.c 和 LCD1602.h,前者为本设计的主文件,后者是 LCD1602 的驱动头文件,被包含在主文件中。编译环境为 Keil C51 uV4。 音乐盒通电后,LCD 第一行显示“ 1/3”(1/3 表示曲号/乐曲总数),第二行显示乐曲名;按下播放/暂停键,乐曲名从右端开始滚动,到达左端时又返回右端继续滚动,这样循环直到本首结束或切换乐曲。当一首结束或按下选曲键, LCD 第一行曲号相应变化,其他不变;第二行曲名也相应切换,亮约 1 秒后开始滚动。播放/暂停键循环切换播放和暂停的状态。若切换至暂停,乐曲停止播放,LCD 保留画面;再

29、次切换为播放时,乐曲从上次暂停处继续播放,LCD 画面也继续滚动。 程序流程图 图 4-1 为程序流程图,完整程序见附录 C 。 部分程序解析 真 (一直循环) 一首乐曲结束 -x,更新显示位置 调用 DSY_string()显示歌名 输入空格,擦上帧残留 是 否 停顿一会儿 申请 INT1 开 T0 中断(播放) 节拍延时 Note_Index+(下一音符) 关 T0 中断(停止) x=16 clr_Line(1)清除歌名 x=0 否 是 !pause=1 否 是 播放/暂停键是否按下 初始化(LCD、定时器等) LCD 初始画面 是 否 按键未释放(K1=0) pause=!pause 图

30、 4-1 N-S 流程图 13 1) 头文件“LCD1602.h”用来驱动 1602 LCD,完整程序见附录 C 。 延时函数 delay_ms(),参数:整型变量 ms;作用:产生 ms1 毫秒的延时时间。见下方程序,若 ms=1,则执行 120 次循环,循环体中没有任何指令操作,仅改变循环变量的值和循环条件的判断。经过反汇编可根据每条指令执行时间算出循环的总时间;在晶振12MHz下,经 Keil 测试得出该循环时间接近 1 毫秒(ms=1 时) 。值得提出的是,该函数产生的延时并非准确;当然,无论什么方法产生的延时都不会精确无误,但在多数情况下不需十分精确,如人耳很难分辨出声音细微的差别,

31、故可用该延时确定节拍。 void delay_ms(uint ms) uchar t; while(ms-) for(t=0;t4提取音符的高 4 位即可。 5) main 函数部分说明 音调已通过定时 0 中断产生,这里就来实现节拍延时和歌名滚动。节拍是音符的低 4位,分离出节拍再调用延时函数 delay_ms 即可完成节拍延时。对于一个字节长度的变量,与 0FH 按位与便可得到低 4 位。 故执行语句 SongSong_PointerNote_Index&0x0F;便可得到节拍。 要实现歌名的滚动,只要每次改变一下歌名的显示位置即可。unsigned char 类型变量x 为歌名显示位置,

32、x 自减一次便更新一次显示位置,歌名也就向左滚动以字符。滚动后歌名末尾会有上次留下的显示数据,要擦出残留以免与系数据混叠。方式是没滚动一字符就在末尾写入一空格,即执行 write( ,1);语句。 系统仿真与分析 系统设计出来后必然要检验其是否能正常工作,用仿真软件来模拟仿真可方便、有效的做前期验证。所以仿真是系统设计的一个很重要环节。程序的编写与调试的通过是系统软件设计成功与否的关键,而仿真的通过则是整个系统成功与否关键。 15 程序编译成功之后,如果直接连接硬件,做到完美无错符合预期结果,一般是做不到的。 若出错则需要重新改写程序, 再烧进硬件, 这样很是麻烦且耗费时间长, 硬件成本大。通

33、过软件仿真,不仅可以方便的运用各种硬件,而且可以多次调试,修改程序,迅速的确定方案的可行性,最终达到预期效果,之后再进行硬件的连接。 程序经过 Keil C51 uV4编译成功, 并调试无误后, 生成 .hex 类型的目标文件。 在 Proteus软件的 ISIS 环境中画好电路图,导入目标文件 Music Box.hex15。点击“开始”,系统即通电,程序启动;然后,通过功能键操控音乐盒,查看现象,与预期效果对比。 1) 点击“开始”,程序运行,LCD 画面第一行第 1216 位置显示“ 1/3”,第二行第 1 位置起显示“Labor glorious”,即第一首乐谱名。保持该状态直到有其他

34、操作,如图 4-2。 图 4-2 初始画面 2) 按下按键“K1”, 乐谱开始播放, 同时乐谱名变换到第二行最右端开始向左滚动。当到达最左端后又返回到最右端继续向左滚动。当一首播放完毕后,下一首又开始播放,同时乐谱名更新,先在最左端显示一下,随即跳到最右端开始向左滚动,如图4-3 所示。当最后一首播放完毕后,切换到第一首。播放中途按下“K1”,即在原处暂停,再次按下“K1”又继续播放,如图 4-4 所示。如此循环下去,直到遇到其他操作。 图 4-3 K1 按下时画面帧选 16 图 4-4 中途按下 K1 暂停后再次按 K1 画面变化情况 3) 按下按键“K2”、“K3”,不管一曲是否播放完毕,

35、都切换乐谱,接着播放新的乐谱,对应曲名滚动。如图 4-5 所示,为当正在播放第二首时按下 K2 切换至第一首,马上又连续按下 K2 两次 LCD 画面的变化过程。图4-6 所示展示了播放第一首时 K3 按下切换到下一首的画面转变。由上述仿真测试可知该设计完成了设计要求。 图 4-5 K2 连续按下切到上一首 图 4-6 K3 按下时的切换画面 完整系统电路图即仿真结果见附录 A 。 17 总 结 完成本设计的任务要求确实需要联系到很多知识,巩固了所学知识,是一次可贵的实践。设计过程中一直投以认真的态度。至此,该设计已完成,达到了预期的效果。但本设计的音乐盒还需很多改进。首先,它只是一个数字式的

36、音乐盒,不能播放出实际那样美妙的模拟信号的音乐;其次,该音乐盒的音质一般,播放过程中会有杂音,音不够准确,不同曲风的音乐不能进行不同的语速处理;再次,音乐盒的控制不够灵敏,按键的抖动消除的不够好。当然,还有很多不足,这都是需要今后努力改进的。所以还要不断努力,争取解决上述不足问题,甚至实现随意点曲功能,一步步向更完善的音乐盒看齐。 18 参考文献1 欧伟明. 单片机原理与应用系统设计M. 北京:电子工业出版社, 2010. 2 周复三. 音乐基础理论教程M. 山东:山东大学出版社, 1991. 3 李重光. 基本乐理M. 湖南:湖南文艺出版社, 2009. 4 陈卫兵. 单片机技术与应用基础M

37、. 北京:人民邮电出版社, 2010. 5 张毅刚,彭喜元. 单片机原理及接口技术M. 北京:人民邮电出版社, 2008. 6 李光弟, 朱月秀, 冷祖祁. 单片机基础M. 北京:北京航空航天大学出版社, 2007. 7 刘凤格. MCS-51 单片机的时钟电路J. 菏泽师范专科学校学报,2003,02:87-89 8 陈享成,耿长青. 基于单片机的 LCD 显示终端设计J. 电力自动化设备,2007,09:110-112. 9 彭伟. 单片机 C 语言程序设计实训 100 例:基于 8051+Proteus 仿真M. 北京:电子工业出版社, 2009. 10 赵亮. 跟我学 51 单片机(七

38、)LCD1602 液晶显示模块J. 电子制作,2011,07:74-77. 11 林嘉. 基于 89S52 的 LCD1602 程序设计J. 电脑知识与技术,2012,26:6376-6378. 12 张芝贤,王明贺等. LCD 显示模块并行接口驱动程序设计J. 国外电子测量技术,2009 ,10:64-68. 13 陈素华,王国志. 基于单片机的 LCD 显示系统的设计与实现J. 许昌学院学报, 2010,05:75-78. 14 王震, 谢丁龙. 点阵 LCD 显示模块通用驱动程序的开发J. 许昌学院学报, 2005,05:84-87. 15 刘心红,郭福田等. Proteus 仿真技术在

39、单片机教学中的应用J. 实验技术与管理,2007,03:96-98. 19 附录 A 完整系统电路仿真图 图 4-7 完整系统电路仿真图 20 附录 B Bill Of Materials Design: 可控 LCD 数字音乐盒 Created: 14/04/25 Modified: 14/04/25 表 4-1 元件清单 Quantity References Value 1 Resistors 1 R1 10k 3 Capacitors 2 C1, C2 22pF 1 C3 10uF 1 Integrated Circuits 1 U1 AT89C51 8 Miscellaneous 3

40、 K1-K3 1 LCD LM016L 1 LS1 SOUNDER 1 RP1 220 1 RV1 10k 1 X1 12M 21 附录 C 系统源程序 1) Music Box.c 源程序文件 /*可控 LCD 数字音乐盒* 标题:Music Box.c 功能:实现几首乐谱的循环播放,同时 LCD1602 显示正在播放乐谱序号、 乐谱总数、乐谱名滚动;可通过按键控制启停、选曲。 说明:MCU 为 AT89C51,编译环境为 Keil C51 uV4 ,与 LCD1602 连接关系为 RSP2.0, RWP2.1, EP2.2, P2D0D7 按键 端口 操作 - K1 P1.0 播放/暂停

41、K2 P3.2 (中断) 上一曲 K3 P3.3 (中断) 下一曲。 包含文件 LCD1602.h 版本:1.1 修改:2014/04/16 14:24,修正了 LCD 滚动显示混叠问题 2014/04/17 19:40,新增自定义乐符的显示 BY mdc9 */ #include #include #include #define uchar unsigned char 22 #define uint unsigned int #define Song_size 3 sbit K1=P10; /播放和暂键 sbit SPK=P37; /蜂鸣器 uchar x=0; uchar Song_Po

42、inter=0,Note_Index=0,pause=1; /*当前音乐段索引, 音符索引, 暂停标志*/ /标准音符频率对应的延时表 uchar code HI_LIST=0,226,229,232,233,236,238,240,241,242,244,245,246,247,248; uchar code LO_LIST=0,4,13,10,20,3,8,6,2,23,5,26,1,4,3; uchar code glyph_code= 0x01,0x01,0x01,0x0f,0x1f,0x1f,0x0e,0, 0x1f,0x01,0x0f,0x1f,0x1f,0x0e,0,0 ; /自

43、定义字符 /乐谱名指针数组 uchar code *Song_name=Labor glorious,Happy Birthday,Summer & Fall; /劳动最光荣 uchar code a= 0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x32,0x52,0x12,0x32,0x28, 0x52,0x84,0x52,0x62,0x62,0x54,0x52,0x81,0xA1,0x92,0x52,0x88,0x83,0x91,0x82, 0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x12,0x32,0x24,0x12,0

44、x11,0x21,0x32, 0x51,0x51,0x62,0x52,0x84,0x82,0x51,0x61,0x84,0xA4,0x92,0x52,0x86,0x02,0x52, 0x81,0x81,0x82,0x52,0x62,0x61,0x81,0x54,0x32,0x51,0x61,0x53,0x31,0x12,0x32, 0x24,0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x51,0x61,0x81,0xA1,0x92,0x52,0x88, 0x83,0x91,0x82,0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x

45、12,0x32,0x24,0x12, 0x11,0x21,0x32,0x52,0x82,0x52,0x68,0x52,0x61,0x61,0x84,0xA4,0x92,0x52,0x84,0xff ; /Happy Birthday uchar code b= 0x52,0x52,0x63,0x53,0x83,0x73, 0x52,0x52,0x63,0x53,0x93,0x83, 0x52,0x52,0xc3,0xa3,0x83,0x71,0x61, 0xb2,0xb3,0xa3,0x83,0x93,0xa3,0xff ; 23 /一个像夏天一个像秋天 uchar code c= 0x52,

46、0x82,0x92,0xa2,0x92,0x82,0x72,0x62,0x72,0x62,0x32,0x34, 0x52,0x82,0x92,0xa2,0x92,0x92,0x82,0x92,0x92,0xa2,0x92, 0xa2,0x92,0x81,0x62,0x62,0xa2,0x92,0x92,0x82,0x82,0x54,0x62,0x82, 0xa2,0x92,0x82,0x64,0xa2,0xa2,0xb2,0xa4,0x92,0x81,0x96, 0xa2,0xc4,0xc2,0xc2,0xc4,0x82,0x92,0xc4,0xc2,0xc2,0xc4,0x92, 0xa2,

47、0xb2,0xa2,0x92,0x84,0x72,0x62,0x82,0x92,0x82, 0x82,0x82,0x62,0x54,0x62,0x82,0xa2,0x62,0x62,0x52,0x62,0x82,0xa2, 0xa2,0xa2,0xb2,0xc4,0xc2,0x82,0x84,0x82,0x82,0xc2,0xa2,0x82,0x92,0x94, 0xa2,0xc4,0xc2,0xc2,0xc4,0x82,0x92,0xc4,0xc2,0xc2,0xc4,0x92, 0xa2,0xb2,0xa2,0x92,0x84,0x72,0x62,0x82,0x92,0x82, 0x82,

48、0x82,0x62,0x54,0x62,0x82,0xa2,0x62,0x62,0x52,0x62,0x82,0xa2, 0xa2,0xa2,0xb2,0xc4,0xc2,0x82,0xa2,0xa2,0x91,0xa3,0x86, 0x92,0x92,0x82,0x92,0xa2,0x92,0x82,0x62,0x62,0xa2,0x92, 0xa2,0x92,0x82,0x71,0x82,0x72,0x82,0x72,0x32,0x72,0x62,0x64, 0x92,0x92,0x82,0x92,0xa2,0x92,0x82,0x62,0x62,0xa2,0x92, 0x92,0x92,

49、0x82,0xb4,0xb2,0xa2,0xb2,0xa2,0xb2,0xd2,0xd6,0xff ; uchar code *Song=a,b,c; /乐谱指针数组,指向各个乐谱 /延时 /*- #ifndef delay_ms void delay_ms(uint ms) uchar t; while(ms-) for(t=0;t4; TH0=HI_LISTSongSong_PointerNote_Index4; SPK=SPK; void main() uchar i=0; /while(K1=1); /未按键等待 SPK=0; TMOD=0x10; /T0、T1 方式 0 IE=0x8

50、F; /开外部中断,定时中断 IT0=1; /外部中断设为脉冲触发方式 IT1=1; IP=0x05; /切换优先级设为最高 init(); /初始化 LCD DSY_string(13,0,1/); 26 DSY_dat(15,0,0x30|Song_size); DSY_string(0,1,Song_nameSong_Pointer); write( 0x40,0 ); /设定 CGRAM 地址 while(i16) write(glyph_codei+,1); DSY_dat(10,0,0x00); /显示音符符号左半部分 DSY_dat(11,0,0x01); /显示音符符号右半部分

51、 while(1) if(K1=0) /检测是否按下播放/暂停键 while(K1=0); /等待释放 pause=!pause; /切换开始/暂停状态 if(!pause) /判断是否为播放状态 if(x=0) x=16; /循环滚动 clr_Line(1); /清除歌名 DSY_string(-x,1,Song_nameSong_Pointer);/显示歌名,左滚动 write( ,1); /紧跟字符串后输入空格,以擦出上一帧残留 if(SongSong_PointerNote_Index=0xFF) /一首音乐是否结束 27 delay_ms(2000); /一首音乐播放结束后停顿一会儿

52、 IE1=1; /触发外部中断 1,切换音乐 continue; /继续播放下一首 TR0=1; /开始播放 /*播放延时(节拍音符的低 4 位)*/ delay_ms(100*(SongSong_PointerNote_Index&0x0F); Note_Index+; /当前音乐的下一音符索引 TR0=0; /停止播放 2) LCD1602.h 源程序文件 #include #define uchar unsigned char #define uint unsigned int sbit RS=P20; sbit RW=P21; sbit E =P22; /延时函数 void delay

53、_ms(uint ms) uchar t; while(ms-) for(t=0;t120;t+); /读忙函数 28 uchar Busy_Check() uchar LCD_Status; RS = 0; RW = 1; E = 1; delay_ms(1); LCD_Status = P0; E = 0; return LCD_Status; /*= *写指令/写数据函数 *参数:cmd_dat控制字/带显示数据,r_s0/1 =*/ void write(uchar cmd_dat,bit r_s) while(Busy_Check()&0x80); RS=r_s; /r_s=0,写指

54、令;r_s=1,写数据 RW=0; P0=cmd_dat; E=1; delay_ms(1); E=0; /LCD 清屏 void LCD_cls() 29 RS=0; RW=0; P0=1; E=1; E=0; /LCD1602 初始化函数 void init() write(0x38,0); /8 位总线,2 行显示,57 点阵/字符 write(0x06,0); /置输入模式:光标右移,显示屏不移动 write(0x0c,0); /开显示,无光标,不闪烁 /write(0x01,0); /显示单个字符时会闪动,改用 LCD_cls()请屏 LCD_cls(); /*= *显示单个字符函数

55、 *参数:x=015(起始列) ,y=0,1(起始行) , * dat待显示的字符 =*/ void DSY_dat(uchar x,uchar y,uchar dat) if(0=y) write(0x80|x,0); if(1=y) write(0xc0|x,0); write(dat,1); /*= 30 *显示字符串函数 *参数:x=015(起始列) ,y=0,1(起始行) , * str待显示的字符串 =*/ void DSY_string(uchar x,uchar y,uchar *str) if(0=y) write(0x80|x,0); if(1=y) write(0xc0|

56、x,0); while(*str) /*str!=0,则逐位显示 write(*str+,1); /*= *函数名:clr_Line *功 能:清 LCD 的一行显示 *参 数:y=0,1(要清的行) =*/ void clr_Line(uchar y) DSY_string(0,y, ); 31 致 谢 本设计是在老师的精心指导下完成的。从选题、方案的确定、程序的编写及仿真调试,到文档的整理,其中每一个环节,我都受到了老师的耐心指导。老师尽可能多的抽出时间,尽可能多的给予我指导。她专业知识丰富、态度和蔼,我能够完成本设计是与她认真负责的指导和督促分不开的。 在此,由衷感谢老师对我毕业设计的指导和修改!同时,向所有关心和帮助我的老师、同学表示衷心的谢意!衷心感谢在百忙之中评阅论文和参加答辩的各位专家、教授。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号