曲阜师范大学 单片机原理与应用 课程设计报告
题 目 电子音乐盒的设计 姓 名
武迪2013416901 许艳军2013416907
薛玉梅2013416908
院 系 物理工程学院 专 业 通信工程(物联网) 指导教师 张明强 职 称 讲师
2015年 月 日
单片机原理与应用课程设计任务书
课程设计题目 院(系) 指导教师 电子音乐盒的设计 专 业 职 称 年 级 2013 2013 2013 学 号 2013416901 2013416907 2013416908 软件设计 硬件焊接 整理实验报告 通信工程(物联网) 讲师 承担任务 物理工程学院 张明强 姓 名 武迪 设计组成员 许艳军 薛玉梅 一、课程设计内容及任务 1.查阅资料了解单片机控制单音喇叭发声原理 2.设计基于单片机的电子音乐盒 3.通过按键可选择不同音乐 4.其他功能 二、拟达到的设计要求或主要技术指标 1.以单片机为核心设计一个电子音乐盒 2.利用I/O口产生一定频率的方波,驱动蜂鸣器或喇叭,发出不同音调,从而演奏乐曲(最少3首乐曲,每首不少于30秒) 3.采用LCD显示信息a.开机有英文欢迎提示字符,播放时显示歌曲序号(或名称)b.可通过功能键选择乐曲.暂停.播放。 三、课程设计总体方案与进度安排 本次设计是基于AT89C52系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译设计制作一个多功能音乐盒 第一.二周,根据选题进行系统预设计,所需原件列表,主要器件购买等准备工作 第三周,用Proteus设计电路软件仿真并开始硬件电路板的设计焊接 第四周,调试电路,撰写课程设计报告 学生签名: 年 月 日 四、指导教师意见 指导教师签名: 年 月 日
单片机原理与应用课程设计评阅表
评分项 设计 过程 评 价 内 容 1. 任务分工的合理性和对待课程设计的态度 2. 团队协作能力和分析解决问题的能力 3. 系统仿真电路设计的合理性与可行性 4.软件编程与仿真结果的正确性 5. 系统板制作的难度 6. 元器件布局的合理性及焊接的规范性 7. 系统功能演示、完成程度及创新性 8. 知识掌握程度与回答问题的正确性 9. 系统设计的合理性与内容的科学性、创新性 10. 文字表达水平、文章的逻辑性与写作规范 合 计 一、指导教师评语: 二、课程设计等级 注:课程设计等级:优秀(90-100),良好(80-89),中等(70-79),及格(60-69),不及格(60分以下)。
满分 5 5 10 15 10 15 15 5 10 10 100 得分 软件 仿真 系统 制作 验收 答辩 设计 报告
目 录
摘要 . ........................................................................................................................................................ 1 关键词 ........................................................................................................................................................ 1 Abstract ....................................................................................................................................................... 1 Key words ................................................................................................................................................. 1 1 设计目的和要求 ........................................................................................................................................ 2 1.1 设计目的 ........................................................................................................................................ 2 1.2设计要求 ......................................................................................................................................... 2 2 硬件电路设计 ............................................................................................................................................ 2 2.1总体方案设计.................................................................................................................................. 2 2.2器件选择 ......................................................................................................................................... 3
2.2.1单片机的选择 ...................................................................................................................... 3 2.2.2 LCD1602简介 ...................................................................................................................... 3 2.3 单元电路设计............................................................................................................................... 6
2.3.1晶振电路.............................................................................................................................. 6 2.3.2复位电路.............................................................................................................................. 6 2.3.3键盘部分.............................................................................................................................. 6 2.3.4 LCD显示电路 ................................................................................................................. 7 2.3.5蜂鸣器部分 .......................................................................................................................... 7 2.4整体电路 ......................................................................................................................................... 8 3 软件设计 .................................................................................................................................................... 9 3.1 主程序流程图............................................................................................................................... 9 3.2音乐播放程序流程图 .................................................................................................................... 10 4 系统调试 .................................................................................................................................................. 10 4.1 原理图的绘制............................................................................................................................... 10 4.2仿真结果 ........................................................................................................................................11 5 实物图 .......................................................................................................................................................11 总结
…………………………………………………………………………..………………………..12
参考文献 ...................................................................................................................................................... 12 附录
……………………………………………………………………………………………………13
电子音乐盒的设计
通信工程(物联网)专业学生 学生姓名 武迪 许艳军 薛玉梅
指导教师 张明强
摘要
本设计采用了蜂鸣器发声来实现歌曲的播放,能保持基本音调不变,流畅播放出歌曲。现选用AT89S52单片机。主要设计模块包括数码管显示部分,功能键盘部分,蜂鸣器发声部分,彩灯部分。数码管采用共阳极数码管,通过单片机P1口控制,实现歌曲序号的显示;功能键盘采用按键开关,通过单片机P3口控制,实现歌曲播放顺序的调换和暂停播放功能;蜂鸣器由单片机的P2口控制,实现歌曲播放;主要工作过程是通过按下功能键实现上一首和下一首及暂停播放,同时有数码管显示当前播放歌曲的序号,蜂鸣器播放出音乐。此次设计要利用单片机及KeilC51编程软件编程和PROTEUS单片机仿真软件和电子电工等方面知识,用KeilC51编程软件编程,用PROTEUS单片机仿真软件仿真。最后制作实物,将程序下载到单片机中,利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲。 关键词 AT89S51单片机;方波; 音调
The Design of The Electronic Music Box
Student majoring in Communication Engineering Name WuDi XuYanJun
XueYuMei
Tutor Name ZhangMingQiang
Abstract
We used to achieve audible buzzer songs to play, to maintain the same basic tone, smooth playback of songs. Single-chip AT89S52 is optional. The main design module includes a digital display of the keyboard function of the audible buzzer of some lantern.LED digital tube using a total of anode, through the P1 port single-chip control, the realization of the show the serial number songs; functions using the keyboard button switches, single-chip P3 through population control, to achieve the change the order of songs to play and pause functions; buzz P2 is controlled by MCU port control, the realization of music playback; The main process is to achieve by pressing function keys on the first one and the next, and suspension of play, while the digital display the serial number of the currently playing song, the music player buzzer. The use of single-chip design and programming software KeilC51 programming and simulation software PROTEUS single chip , such as electrical and electronic knowledge, with KeilC51 programming software programming, and simulation software PROTEUS single-chip simulation. Finally, the production in kind, will be downloaded to a single-chip process, A certain frequency of square wave generated by the I/O to drive the buzzer , the issue of different tones, which play music. Key words AT89S51 microcontroller; square; tone
1
1 设计目的和要求
1.1 设计目的
(1) 通过设计,查阅相关资料,掌握如何利用单片机设计产品,同时了解与单片机有关的软件模拟器的使用及取字模块软件的使用方法。
(2) 通过本课程设计巩固并扩展单片机课程的基本概念、基本理论、分析方法和实现方法。结合Proteus和Keil软件等,学习单片机产品的设计方法,有效地将理论和实际紧密结合,培养创新思维和设计能力,增强软件编程实现能力和解决实际问题的能力。
(3) 学习Proteus软件,掌握Proteus中各种芯片的功能以及模拟。由于Proteus提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养实践精神、创造精神的平台。
1.2设计要求
(1) 利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演乐曲(内存四首乐曲);
(2) 用LCD显示歌曲序号和歌曲名字;
(3) 可通过功能键进行选择歌曲和暂停的操作。
2 硬件电路设计
2.1总体方案设计
晶振电路LCDAT89C51复位电路键盘电路蜂鸣器
图2-1 总体方案图
以AT89C51为核心,通过单片机的定时器产生一定长度的方波,方波脉冲驱动蜂鸣器发声。要产生音频脉冲,只需算出某一音频的周期(1/音频),然后取半周期的时间定时。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲。当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。同时在LCD显示歌曲序号和歌曲名称。
2
2.2器件选择 2.2.1单片机的选择
单片机型号的选择是根据控制系统的目标、功能、可靠性、性价比、精度和速度等来决定的。根据本课题的实际情况,单片机型号的选择主要从以下两点考虑;一是要有较强的抗干扰能力。二是要有较高的性价比。由于51系列在我国使用最广,且该系列的资料和能够兼容的外围芯片也比较多,特别是ATMEL公司89C系列单片机,其典型产品AT89C51单片机,具有较高的性能价格比。故本系统采用ATMEL公司生产的AT89C51单片机作为电子音乐盒的核心部件,AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机可提供许多高性价比的应用场合,可灵活应用于各种控制领域。
2.2.2 LCD1602简介
LCD液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16×1,16×2,20×2和40×2行等的模块。LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图2-2所示:
图2 -2 LCD尺寸图
1602LCD主要技术参数: 显示容量:16×2个字符; 芯片工作电压:4.5—5.5V; 工作电流:2.0mA(5.0V); 模块最佳工作电压:5.0V; 字符尺寸:2.95×4.35(W×H)mm。 引脚功能说明
3
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表1所示。
表1 引脚接口说明表
1 2 3 4 5 6 7 8 符号 VSS VDD VO RS R/W E D0 D1 引脚说明 接地 电源正极 接地 数据/命令选择 读/写选择 使能信号 数据 数据 编号 9 10 11 12 13 14 15 16 符号 D2 D3 D4 D5 D6 D7 A K 引脚说明 数据 数据 数据 数据 数据 数据 接电源 接地 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VO接地。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:接地。
1602液晶模块内部的控制器共有11条控制指令,如表2所示:
表2 控制命令表
序号 指令 1 2 3 4
清显示 光标返回 置输入模式 显示开/关控制
RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
0 0 1 D
0 1
1 *
I/D S C
B
4
5 6 7 8 9 10 11
光标或字符移位 置功能
0 0
0 0 0 0 1 0 1
0 0 0 1
0 0 1
0 1
1 S/C R/L *
F
*
* *
DL N
置字符发生存贮器地址 0 置数据存贮器地址 读忙标志或地址
0 0
字符发生存贮器地址
显示数据存贮器地址
BF 计数器地址 要写的数据内容 读出的数据内容
写数到CGRAM或DDRAM)1 从CGRAM或DDRAM读数 1
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:
1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。 指令11:读数据。
与HD44780相兼容的芯片时序表如下:
表 3 芯片时序图
读状态 输入 RS=L,R/W=H,E=H
输出 D0—D7=状态字
写指令 输入 RS=L,R/W=L,D0—D7=指令码,E=高脉输出 无
冲 读数据 输入 RS=H,R/W=H,E=H
5
输出 D0—D7=数据
写数据 输入 RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 无 2.3 单元电路设计 2.3.1晶振电路
单片机需要一个时间基准来为各种操作提供秩序,此电路叫时钟电路,采用不同的接线方式可以获得不同时钟电路,有内部时钟电路和外部时钟电路,如图4.3所示,外部时钟电路会使电路复杂,故采用的是内部时钟电路。时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器.本系统采用的为12MHz的晶振,一个机器周期为1us,C1,C2为30uF。
2.3.2复位电路
复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
复位电路分为上电自动复位和按键手动复位,如图2-3所示。RST引脚是复位信号的输入端,复位信号是高电平有效.这次采用的是手动复位,复位通过电容C3,C4和电阻R1,R2来实现,按键手动复位是图中复位键来实现的。
图 2-3 晶振与复位电路
2.3.3键盘部分
键盘是由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。
1.编码键盘通过硬件电路产生被按按键的键码,这种键盘所需程序简单,但硬件电路复杂、价格昂贵通常不被单片机系统采用。
2.非编码键盘常用一些按键排列成行列矩阵,其硬件逻辑与按键编码不存在严格的对应关系,而要由所用的程序来决定。非编码键盘的硬件接口简单,但是要占用较多的CPU时间,通常采用可编程键盘管理芯片来克服这个缺点。本设计使用两种按键,一种是按键式非编码键盘和轻触式非编码开关,如图2-4所示。
6
图 2-4 键盘电路
2.3.4 LCD显示电路
LCD的8根数据线与P1口相连,RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。R/W为读写信号线,RS与P2.0相连,由P2.0控制LCD的写指令或写数据操作。R/W与P2.1相连,由P2.1决定是读操作还是写操作。E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。E端与P2.2相连,如图2-5所示。
图2-5 LCD显示电路
2.3.5蜂鸣器部分
一般所指的蜂鸣器是以压电陶瓷为主要元件的。压电陶瓷是一类有将压力与电流相互转换能力的特殊陶瓷。这种能力缘于其特殊的晶体结构。当压电陶瓷在一定方向上受到一个压力使其晶体结构发生形变时,它就会在内部产生一个电流,并且电流的变化与压力的变化密切相关。反之亦然。所以利用这一特性,在压电陶瓷上通过一定频率的电流,就会引起压电陶瓷微小形变,这一形变带动空气发生振动,如果频率适当,就可以被人耳所听见,也就是产生了蜂鸣声。
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O 口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了,如图2-6所示。
7
图2-6 蜂鸣器电路
2.4整体电路
图2- 7 整体电路
8
3 软件设计
3.1 主程序流程图
开始系统初始化扫描键盘得到键值判断键值停止放音LCD显示选择的歌曲蜂鸣器发音扫描键盘暂停键是否按下否继续放音结束图 3-1 主程序流程图
9
3.2音乐播放程序流程图
开始创建新的频率表计算歌曲长度读音符根据音符对应求出发音长度否蜂鸣器发声判断音符是否读完或暂停键是否按下是蜂鸣器停止发音结束
图3-2 音乐播放程序流程图
4 系统调试
4.1 原理图的绘制
仿真平台为Proteus软件,Proteus软件是世界上著名的EDA工具(仿真软件),能完成原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,是目前最好的仿真单片机及外围器件的工具。
PROTEUS电路设计是在PROTEUS ISIS环境中绘制的,该编辑环境具有良好的人机交互界面,功能强大极易上手。首先通过桌面进入主程序,绘制原来图的主要任务是从元件库中选取绘制电路所需要的元件。可以通过点击选择器顶端左侧的“P”或者通过命令打开,我们常用的是按钮;在查找到并放置完所有需要的器件后,我们需要接着连接元件,即在PROTEUS ISIS的编辑窗口布线。PROTEUS ISIS中没有布线模式,但用户可以在任意时刻放置连线和编辑连线。在完成绘制所需的电路图前,用户需要放置并连接断轴。在电路原理图中放置两种通用的端子,一种是接地端子一种是电源端子。当在PROTEUS ISIS编辑窗口放置元件时,每一元件都有唯一的元件标号及元件值与之对应。原件号是PROTEUS ISIS的实时注释功能自动标注的,这一功能可在菜单中设置选择是否开启。PROTEUS ISIS中也支持块操作,当用户需要对电路中的某一部分进行操作时,可以使用该功能。系统共支持块移动、块复制、块旋转、块删除等实用功能,充分利用这些功能可以极大的提高我们绘图的效率。我们绘制完所有的元件后,最后进行统一标注,PROTEUS ISIS支持注释功能,可以把我们所绘制的原理图中的器件根据我们的需要
10
添加上特殊的注释,以表示特定的含义。根据设计电路绘制完后的电路图如图4-1所示。
4.2仿真结果
图 4-1 仿真图
通过Protues仿真结果,这次课程设计的要求已全部满足。
5 实物图
11
总结
音乐盒设计是一项趣味性很强的设计,能激发我的浓厚兴趣。同时要求我从程序编程,调试,软件仿真和绘制开始,到硬件的焊接和调试,再到修改程序,在这期间我了解到了单片机开发的大致流程。
通过这次毕业设计,也让我学习到了很多新的东西,这些都让我受益匪浅。单片机的定时器功能,LED的数码显示,功能键盘的设计,这些内容都颇为丰富。有以前学习过的旧知识,也有很多未曾注意到得新知识,这些都曾使我的设计出错,通过自己的努力,老师指导和同学的帮助,终于克服了一个一个的困难,把硬件实物顺利做好,把软件调试顺利完成。
最后,衷心感谢这次对我的毕业设计提供无私帮助的所有老师和同学!
参考文献
[1] 阎石.数字电子技术基础(第四版)[M].高等教育出版社.1998.11 [2] 张毅刚等.MCS-51单片机应用设计.哈尔滨工业电子出版社,1996 [3] 何立民.单片机应用技术选编.北京航空航天大学出版社,2000 [4] 张友德等.单片微型机原理应用与实验,复旦大学出版社,1996 [5] 邬宽明.单片机外围器件实用手册.北京航空航天大学出版社,1998
[6] 陈海宴.51单片机原理及应用(第二版)—基于Keil C与Proteus.北京航空航天大学出版社,2014
12
附录
#include #define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ #define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔 #define LCDPORT P0 #define uchar unsigned char #define uint unsigned int void WriteCMD(uchar Commond); void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed); void init(void); void InitialSound(void); void WriteData(uchar dat); void Getch (void); void delay1(void); void Delay(void); void Delay1ms(int y); void mydelay(int x); 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; //音长定时器初值暂存 uchar k; uchar code tab[]=\"WELCOME\"; uchar code tab1[]=\"Select song\"; uchar code tab2[]=\"First Song\"; uchar code tab3[]=\"Music_Girl\"; uchar code tab4[]=\"Second Song\"; uchar code tab5[]=\"Music_Jingle\"; uchar code tab6[]=\"Third Song\"; uchar code tab7[]=\"Music_Two\"; uchar code tab8[]=\"Forth Song\"; uchar code tab9[]=\"Music_Yesterday\"; //梁祝 unsigned char code Music_Girl[]= { 0x1B,0x02, 0x1A,0x02, 0x1B,0x02, 0x19,0x66, 0x1A,0x03, 13 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 }; //铃儿响叮当 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, 14 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, 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, 15 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 }; sbit LCDE=P2^2; sbit LCDRW=P2^1; sbit LCDRS=P2^0; 16 sbit BeepIO=P3^7; //定义输出管脚 sbit K1=P1^7; void delay1(void) //延时程序 { uchar i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } void Delay(void) { uint uiCount; for(uiCount=0;uiCount<250;uiCount++); } void mydelay(int x) { int i,j; for(i=x;i>0;i--) for(j=255;j>0;j--); } void Delay1ms(int y) { int i,j; for(i=y;i>0;i--) for(j=500;j>0;j--); } void Getch (void) { 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; //取出键值 17 switch ( Z ) //判断键值(那一个键按下) { case 0xf9: k=0; break; //对键值赋值 case 0xf5: k=1; break; case 0xfa: k=2; break; case 0xf6: k=3; break; } } } } 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; //最后显示数据。 } { LCDRW=0; LCDE=0; WriteCMD(0x38); WriteCMD(0x0c); WriteCMD(0x06); WriteCMD(0x01); WriteCMD(0x80); } void init(void) 18 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; 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; } 19 因篇幅问题不能全部显示,请点此查看更多更全内容