基于AT89C51的LCD音乐盒课程设计论文.doc_第1页
基于AT89C51的LCD音乐盒课程设计论文.doc_第2页
基于AT89C51的LCD音乐盒课程设计论文.doc_第3页
基于AT89C51的LCD音乐盒课程设计论文.doc_第4页
基于AT89C51的LCD音乐盒课程设计论文.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

武夷学院单片机原理与应用课程设计报告基于AT89C51的LCD音乐盒院 系 :机电工程学院专业(班级):电子信息工程(X)姓名:XXX学号:XXXXXXXXXX指导教师:XXX职称:讲师完成日期: 2013 年 12月 20 日目 录 1 设计任务1 2 系统设计方案22.1 设计目的22.2 设计要求22.3 系统组成框图22.4 主要设计软件介绍32.4.1 PROTEUS软件简介32.4.2 KEIL简介33 系统硬件设计53.1 系统构成53.1.1 AT89C51单片机简介53.1.2 LCD 显示器63.1.3 键盘73.1.4 跑马灯电路83.1.5 播放电路的设计83.1.6 系统复位电路的设计83.1.7 时钟电路模块93.2硬件电路端口分配94 系统软件设计104.1 主模块的设计104.2 外部中断源系统设计114.3 基本显示模块设计124.4 系统初始化程序125 系统的硬件调试及软件调试146 设计心得体会15参考文献16附A:图18附B:源程序21 基于AT89C51的LCD音乐盒1 设计任务21世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。随着科学技术的进步和社会的发展,人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人们已经能够利用计算机等工具高效准确地对之进行处理,但要想将处理完的信息及时,清晰地传递给别人,还必须通过寻求更加卓越的显示技术来实现。单片机技术与液晶显示技术的结合,使信息传输交流向着智能可视化方向迅速发展。随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。小小的音乐盒可以给人们带来美好的回忆,提高人们的精神文化享受。传统音乐盒多是机械型的,体积笨重,发音单调,不能实现批量生产。本文设计的音乐盒是以单片机为核心元件的电子式音乐盒,体积小,重量轻,能演奏和旋音乐,功能多,外观效果多彩,使用方便,并具有一定的商业价值。2 系统设计方案2.1 设计目的本设计是基于单片机的数字音乐盒设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子数字音乐盒。要求利用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调并采用LCD显示信息,从而演奏乐曲(最少三首乐曲,每首不少于30秒),开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称),可通过功能键选择乐曲,暂停,播放。本设计采用4个按键,1602 LCD,跑马灯结合了视觉听觉双重效果。2.2 设计要求若该设计使用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。在开机按钮按下时有英文欢迎提示字符,播放时显示歌曲序号(或名称)。在演奏过程中可通过功能键选择乐曲,暂停,播放。课设准备中根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。2.3 系统组成框图音乐盒的系统结构以AT89C51单片机位控制核心,加上2个按键、时钟复位电路、蜂鸣器、LED模块组成。单片机负责接收按键的输入,根据输入控制音乐播放曲目和音乐花样灯的显示样式以及蜂鸣器发音。系统组成框图如图2-1所示。图2-1 系统组成框图2.4 主要设计软件介绍本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,两种软件的简介如下:2.4.1 PROTEUS软件简介Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。 2.4.2 KEIL简介单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。3 系统硬件设计3.1 系统构成3.1.1 AT89C51单片机简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。(1)主要特性:与MCS-51 兼容 4K字节可编程闪烁存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24Hz三级程序存储器锁定128*8位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源 可编程串行通道 低功耗的闲置和掉电模式片内振荡器和时钟电路 (2)管脚说明(如图3-1): VCC:供电电压。 GND:接地。 图3-1 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:管口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:/EA保持低电平时,在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。(3)振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。(4)芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。3.1.2 LCD 显示器 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。实物图如图3-2,引脚图如图3-3。 图3-2 图3-3 1602的引脚图3.1.3 键盘键盘采用四个轻触按键,一端接地一端直接连I/O口,当按下某个按键时,即向相应的I/O口输入一个低电平,I/O口再对应触发音乐和的按键功能,上一首、下一首或停止、播放。接线图如图3-4。 图 3-43.1.4 跑马灯电路 该跑马灯可以根据音乐节奏闪动LED,再实物图里可以将LED摆成心形实物图见附录3。采用八个LED,一端接1K排阻一端接P3口,由于I/O口驱动负载能力有限,所以采用灌电流输入驱动LED。原理图如图3-5。 图3-53.1.5 播放电路的设计 播放电路用一个PNP三极管进行信号放大,基极接一个200欧电阻限流,采用8欧0.5W大口径喇叭,一端接地一端接一个电位器阻值在0-200欧内可调,用以控制播放音量。具体链接电路图如图3-6。图3-63.1.6 系统复位电路的设计智能系统一般应有手动或上电复位电路。复位电路的实现通常有两种方式:RC复位电路和专用监控电路。前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。本次课程设计采用了上电按钮电平复位电路,如图3-7。 图3-73.1.7 时钟电路模块时钟电路在单片机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟是保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢。为达到振荡周期是12MHZ的要求,这里要采用12MHZ的晶振,另外有两个30PF的瓷片电容,两晶振引脚分别连到XTAL1和XTAL2振荡脉冲输入引脚。具体连接图如图3-8所示: 图3-83.2硬件电路端口分配 (1)硬件电路中用P1.0-P1.3控制按键。(2)用P0.0-P0.7,P2.5-P2.7控制LCD,其中P0.0-P0.7做LCD的8个并行数据输入端,P2.5-P2.7分别作为LCD的RW、RS、E的控制信号。 (4)用P2.0口控制喇叭。(5)用P3.0-P3.7做跑马灯输出口。 (6)电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。4 系统软件设计4.1 主模块的设计主程序开始初始化变量及LCD接口初始化数字器T0,定时器T1LCD显示英文欢迎字符等待按键,是否有按键?包括播放,暂停,停止按键歌曲号及播放时间显示在LCD按照按键码播放对应的歌曲YN主模块是系统软件的主框架。结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。它的合理与否关系到程序最终的功能的多少和性能的好坏。本系统的主模块的程序框图如下图4-1所示: 图4-14.2 外部中断源系统设计在本设计中中断源是采用外部中断0方式,其入口地址是0003H。其中断响应级别最高。(1)定时器/计数器工作方式寄存器TMOD用于选择定时器/计数器的工作方式和工作模式。其格式如下表:表4-1TMODD7D6D5D4D3D2D1D0GATEM1M0GATEM1M0T1方式字段T0方式字段 下面对TMOD各位进行说明:门控位GATE工作方式选择位M1、M0表4-2M1M0工作方式00方式0,为13位定时器/计数器01方式1,为16位定时器/计数器10方式2,8位的常数自动重新装载的定时器/计数器11方式3,仅适用于T0 其中,在本设计中采用方式1的16位定时器/计数器。计数器模式和定时器模式选择位=0,为定时器模式。=1,为计数模式。定时器/计数器控制寄存器TCON,其格式如下:表4-3TCOND7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0ITO 其各位的功能如下:TF1、TF0计数溢出标志位当计数器溢出时,该位置1。TR1、TR0计数运行控制位4.3 基本显示模块设计基本显示模块设计的重点是由单片机定时计数器进行播放计时,通过LCD显示器显示歌曲名及播放时间,达到精确计时且直观,同时可以从播放时间是否在跳动判断歌曲是否在播放。 4.4 系统初始化程序/* 40- - *1602初始化*/ void LCD1602_init() LCD1602_write_cmd(0x38); /8位数据,双列显示,5*7字形 LCD1602_write_cmd(0x0c); /开显示,关光标,光标不闪烁 LCD1602_write_cmd(0x01); /清屏/* *定时器2初始化函数*/void init_timer2() T2CON=0; T2MOD=0; RCAP2H=(65536-50000)/256; /定时初值50ms RCAP2L=(65536-50000)%256; TH2=(65536-50000)/256; TL2=(65536-50000)%256; EA = 1; ET2 = 1; TR2 = 1;5 系统的硬件调试及软件调试本次课程设计所采用的程序调试软件为wave6000集成调试软件,所采用的仿真软件为protus 6 professional软件。本次试验的效果图如下所示:图5-1按键功能说明: A:上一首歌曲 B:下一首歌曲 C:停止歌曲 D:播放歌曲开机时有英文欢迎提示字符,播放时显示歌曲序号(或名称)可通过功能键选择乐曲,停止,播放。选作内容:显示乐曲播放时间或剩余时间.结构化软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次课设,采用Keil uVision 4软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。仿真部分采用protus 7.5 professional软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。首先打开protus 7.5 professional软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再载入Keil uVision 4已经编译好生成的*.hex文件,选择运行,观察显示结果,根据显示的结果和课设的要求再修改程序,再运行查,直到满足要求。6 设计心得体会单片机是一门应用性很强的学科,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对我们实际工作能力的具体训练和考察过程。虽然在做课程设计以前已经系统的把单片机课本认真的学习了一下,但是在刚拿到设计任务书时还是有点一头雾水,不知道该从哪里下手。令人欣慰的是经过一周的学习,虽然过程很艰辛,但是总算实现了定时闹钟的功能,所有的努力都很值得。这一周的大部分时间都在研究程序怎么处理,在这个过程中加深了我对汇编语言命令的应用,而且也更加了解到软硬件配套的重要性。在设计的过程中不仅巩固了以前所学过的知识,加深了我对所学知识的理解,而且学到了很多在书本上所没有的知识。通过这次课程设计使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能提高自己的实际动手能力和独立思考的能力。总之,通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我具有了撰写科研报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,一切的辛苦和艰难都是值得的。参 考 文 献1 杨刚,周群.电子系统设计与实践.电子工业出版社,2004:18-23 341-347 118-1222 何立民.单片机高级教程(应用与设计).北京航空航天大学出版社,2000:53983 涂时亮,张友德.单片微机控制技术.清华大学出版社,1994:86-87 146-1474 融会贯通 Protel99电路设计 弘道工作室 北京 人民交通出版社,2000.5 单片机原理及接口技术实验 朱定华 北京 北方交通大学出版社,2002.11.附A:图附A-a系统原理图附A-b 播放效果图附A-c 总视图附A-d最小系统附B:源程序#include#include#define uint unsigned int#define uchar unsigned char#define LCD1602_DATA P0 /1602液晶数据口#define lamp_data P3 /跑马灯数据口sbit LCD1602_RS=P27; /1602液晶写命令/数据sbit LCD1602_RW=P26; /1602液晶读/写控制 sbit LCD1602_EN=P25; /1602液晶使能控制sbit BeepIO = P20 ; /蜂鸣器sbit esc=P12; /取消播放音乐sbit up=P10;sbit down=P13;sbit play=P11;char number; /歌曲编号bit flag; /播放标志char t;uchar ms50; /跑马灯用char count,sec,min; /歌曲时间显示char code song17= 1.Fairy Tale ,2.Love Transfer ,3.Girl With Wing, 4.The Same Song ,5.Two Butterfly ,6.Coral Sea ;char code singer12= Guang liang,Chen yixun ,Rong zuer , Liu chang ,Pang long ,Zhou jielun;uchar code lamp=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/以下为播放音乐的设置#define SYSTEM_OSC 12000000#define SOUND_SPACE 4/5uint code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表uchar code SignTab7 = 0,2,4,5,7,9,11 ; /17在频率表中的位置uchar code LengthTab7= 1,2,4,8,16,32,64 ; uchar Sound_Temp_TH0,Sound_Temp_TL0; /音符定时器初值暂存 uchar Sound_Temp_TH1,Sound_Temp_TL1; /音长定时器初值暂存bit stop;/*延时函数(单位ms)*/ void delay(uint z) uint x; uchar y; for(x=z;x0;x-) for(y=112;y0;y-);/* *LCD1602驱动程序*/*忙检测*/ void LCD1602_check_busy() LCD1602_DATA = 0xff; LCD1602_RS = 0 ; LCD1602_RW = 1 ; LCD1602_EN = 1 ; while(LCD1602_DATA & 0x80) ; LCD1602_EN = 0 ; /*写指令 */ void LCD1602_write_cmd(uchar cmd) LCD1602_check_busy(); LCD1602_RS = 0 ; LCD1602_RW = 0 ; LCD1602_DATA = cmd ; LCD1602_EN = 1 ; _nop_(); LCD1602_EN = 0 ;/*写数据*/ void LCD1602_write_data(uchar dat) LCD1602_check_busy(); LCD1602_RS = 1 ; LCD1602_RW = 0 ; LCD1602_DATA = dat ; LCD1602_EN = 1 ; _nop_(); LCD1602_EN = 0 ;/*1602初始化*/ void LCD1602_init() LCD1602_write_cmd(0x38); /8位数据,双列显示,5*7字形 LCD1602_write_cmd(0x0c); /开显示,关光标,光标不闪烁 LCD1602_write_cmd(0x01); /清屏/*设置显示坐标*/ void LCD1602_set_postion(uchar x , uchar y)if(!y)LCD1602_write_cmd(0x80+x) ;else if(y)LCD1602_write_cmd(0xc0+x) ;/*指定位置写字符*/ void LCD1602_write_char(uchar x , uchar y , uchar chardata) LCD1602_set_postion(x,y) ; LCD1602_write_data(chardata) ;/*指定位置写字符串*/ void LCD1602_write_string(uchar x , uchar y , uchar *string) LCD1602_set_postion(x,y) ; while(*string) != 0) LCD1602_write_data(*string) ; string+ ; /* *播放音乐函数*/void InitialSound() 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() interrupt 1 /音符发生中断 if(esc=0) delay(5); if(esc=0) stop=1; while(!esc); / 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 NewFreTab12; /新的频率表 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 11) j = j-12; NewFreTabi = FreTabj*2; else NewFreTabi = FreTabj; if(Octachord = 1) NewFreTabi=2; else if(Octachord = 3) NewFreTabi=2; SoundLength = 0; while(SoundSoundLength != 0x00) /计算歌曲长度 SoundLength+=2; Point = 0; Tone = SoundPoint; Length = SoundPoint+1; / 读出第一个音符和它时时值 LDiv0 = 12000/Speed; / 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最长间隔标准 TR0 = 0; TR1 = 1; while(Point = 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=LengthTabLength%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 (SLen0;i-) /发规定长度的音 while(TF1=0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; if(LDiv2!=0) TR0=0;BeepIO=0; for(i=LDiv2;i0;i-) /音符间的间隔 while(TF1=0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; / if(stop) Point=SoundLength; / Point+=2; Tone=SoundPoint; Length=SoundPoint+1; / stop=0; BeepIO=1; ET0 = 0; ET1 = 0; TR0 = 0; TR1 = 0; EA = 0;/歌曲童话uchar code fairy_tale= 0x0F,0x67, 0x19,0x03, 0x18,0x03, 0x17,0

温馨提示

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

评论

0/150

提交评论