




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉理工大学单片机原理与应用课程设计课程设计基于51单片机电子闹钟或万年历的设计目录目录11.项目背景31.1 项目研究的目的和意义31.2课题研究的内容32.方案的选择和和论证42.1 单片机型号的选择42.2 按键的选择42.3 显示器的选择42.4 计时部分的选择52.5 发音部分的设计52.6电路设计最终方案53. at89c52单片机简介63.1单片机基本特性63.2单片机内部结构图63.3 单片机i/o引脚结构63.3.1 p0口63.3.2 p1口73.3.3 p2口73.3.4 p3口73.4单片机最小系统板84. 数字电子钟的设计原理和方法94.1 设计原理94.2 硬件电路的设计94.2.1 ds1302时钟芯片94.2.2 1602 液晶简介114.2.3 蜂鸣器驱动电路124.2.4 独立键盘电路135.软件部分的设计145.1程序流程图145.1.1 系统总流程图145.1.2 ds1302时钟程序流程图155.1.3 lcd显示程序流程图165.2程序的设计175.2.1 ds1302读写程序175.2.2液晶显示程序177.心得体会20参考文献21附录一 系统原理图22附录二 系统程序231.项目背景1.1 项目研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。 时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。而钟表的数字化给人们生产生活带来了极大的方便。数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。1.2课题研究的内容本论文主要研究基于单片机的万年历设计。当程序执行后,lcd显示即时时间、年月日、星期。设置4个操作键:k1,时间调整键;k2,上调键;k3,下调键;k4,闹钟设置键本设计的主要内容:1、了解单片机技术的发展现状,熟悉万年历各模块的工作原理;2、选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;3、熟悉单片机使用方法和c语言的编程规则,编写出相应模块的应用程序。设计目标:使基于at89c52单片机的万年历实现以下三个功能:a.具有年、月、日、星期、时、分、秒等功能;b.具备年、月、日、星期、时、分、秒校准功能;2.方案的选择和和论证2.1 单片机型号的选择通过对多种单片机性能的分析,最终认为at89c52是最理想的电子时钟开发芯片。at89c51是一种带4k字节闪烁可编程可擦除只读存储器的低电压,高性能cmos8位微处理器,器件采用atmel高密度非易失存储器制造技术制造,与工业标准的mcs-51指令集和输出管脚相兼容。由于将多功能8位cpu和闪烁存储器组合在单个芯片中,atmel的at89c52是一种高效微控制器,而且它与mcs-51兼容,且具有4k字节可编程序存储器和1000次擦写循环,数据保留时间为10年,是最好的选择。2.2 按键的选择方案一:44矩阵式键盘。如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。 方案二:独立式按键。如果设置过多按键,将会占用较多i/o口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。 由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二。2.3 显示器的选择方案一:采用led数码管动态扫描,led数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,若采用在显示数字显得太浪费,且价格也相对较高,所以在此也不用此种作为显示。方案三:采用1602液晶显示屏,该液晶显示屏的显示功能强大,内置192种字符,可显示大量符号、数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。所以在此设计中采用1602液晶显示屏。2.4 计时部分的选择方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二:采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na。所以本设计采用ds1302时钟芯片。2.5 发音部分的设计通过三极管放大后驱动蜂鸣器工作,再通过软件产生的时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。2.6电路设计最终方案综上各方案所述,对此次作品的方案选定: 采用at89c52作为主控制芯片,ds1302时钟芯片计时,lcd1602作为显示模块。3. at89c52单片机简介3.1单片机基本特性n 8 位的 cpu, 片内有振荡器和时钟电路,工作频率为024mhzn 片内有 256字节 数据存储器 ramn 片内有 8k字节 程序存储器 n rom4个8位的并行i/o口(p0、p1、p2、p3)n 1个 全双工串行通讯口n 3个16位 定时器/计数器(t0、t1、t2)n 可处理 6个中断源,两级中断优先级3.2单片机内部结构图图3-1 单片机内部结构图3.3 单片机i/o引脚结构3.3.1 p0口p0 口是一组8 位漏极开路型双向i/o 口, 也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8 个ttl逻辑门电路,对端口p0 写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8 位)和数据总线复用,在访问期间激活内部上拉电阻。在flash编程时,p0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。3.3.2 p1口p1 是一个带内部上拉电阻的8 位双向i/o 口, p1 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。与at89c51 不同之处是,p1.0 和p1.1 还可分别作为定时/计数器2 的外部计数输(p1.0/t2)和输入(p1.1/t2ex),flash 编程和程序校验期间,p1 接收低8 位地址。3.3.3 p2口p2 是一个带有内部上拉电阻的8 位双向i/o 口,p2 的输出缓冲级可驱动(吸收或输出电流)4 个ttl 逻辑门电路。对端口p2 写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(iil)。在访问外部程序存储器或16 位地址的外部数据存储器(例如执行movx dptr 指令)时,p2 口送出高8 位地址数据。在访问8 位地址的外部数据存储器(如执行movxri 指令)时,p2 口输出p2锁存器的内容。flash编程或校验时,p2亦接收高位地址和一些控制信号。3.3.4 p3口p3 口是一组带有内部上拉电阻的8 位双向i/o 口。p3 口输出缓冲级可驱动(吸收或输出电流)4 个ttl逻辑门电路。对p3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的p3 口将用上拉电阻输出电流(iil)。p3 口除了作为一般的i/o 口线外,更重要的用途是它的第二功能p3 口还接收一些用于flash闪速存储器编程和程序校验的控制信号。3.4单片机最小系统板仅仅一个单片机是没有办法工作的,要想使单片机正常功能,单片机需要有电源电路、复位电路、晶振。电源电路给单片机提供电源,复位电路使得单片机具备复位功能,晶振的作用产生原始的时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。单片机最小系统是保证单片机正常工作的最基本单位。图3-2单片机最小系统板4. 数字电子钟的设计原理和方法4.1 设计原理根据上述方案设计出系统整体框图如下所示 图4-1 系统原理图为使时钟走时与标准时间一致,校时电路是必不可少的,键盘模块用来校正液晶上显示的时间;at89c52单片机通过输出各种电脉冲信号来驱动控制各部分正常工作;而系统的时间数据则最终通过液晶模块显示出来。4.2 硬件电路的设计4.2.1 ds1302时钟芯片ds1302是dallas公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态ram,通过简单的串行接口与单片机进行通信。图4.5所示为ds1302的引脚排列,其中vcc1为后备电源,vcc2为主电源。所以在主电源关闭的情况下,也能保持时钟的连续运行。dsx1和dsx2是振荡源,外接32.768khz晶振用来为芯片提供计时脉冲。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中rst置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电行动时,在vcc大于等于2.5v之前,rst必须保持低电平。在sclk为低电平时,才能将rst置为高电平,i/o为串行数据输入端(双向)。sclk始终是输入端。图4-2 ds1302时钟芯片电路时钟芯片ds1302的工作原理:(1) ds1302的控制字节ds1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(2) 数据输入输出(i/o)在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。(3) ds1302的寄存器ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。“ch”是时钟暂停标志位,当该位为1时,时钟振荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,“wp”必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。4.2.2 1602 液晶简介本设计中由于要对时间进行显示,所以选择液晶显示屏1602模块作为输出。1602字符型lcd通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线。它可以显示两行,每行16个字符,采用单+5v电源供电,外围电路配置简单,价格便宜,具有很高的性价比。1602液晶模块内部的字符发生存储器(cgrom)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码.管脚功能如表4-1所示:lcd1602主要管脚介绍: rs为寄存器选择端,高电平时选择数据寄存器,低电平时选择指令寄存器。r/w为读写信号线端,高电平时进行读操作,低电平时进行写操作。当rs和r/w共同为低电平时可以写入指令或者显示地址;当rs为高电平r/w 为低电平时可以写入数据。e为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。将l1602的rs端和p2.0,r/w端和p2.1, e 端和p2.2相连,当rs=0时,对lcd1602写入指令;当rs=1时,对lcd1602写入数据。当r/w端接高电平时芯片处于读数据状态,反之处于写数据状态,e端为使能信号端。当r/w为高电平,e端也为高电平,rs为低电平时,液晶显示屏显示需要显示的示数。图4-3为1602液晶。图4-3 1602液晶电路4.2.3 蜂鸣器驱动电路发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。图4-4 蜂鸣器驱动电路4.2.4 独立键盘电路实现键盘控制的方法有多种,在本系统中,我们采用了at89c52单片机来进行控制,因为单片机可以很好的解决键抖动。由若干个按键组成一个键盘,其电路结构可分为独立式键盘和矩阵式键盘两种。本设计采用的是独立式键盘。键盘的工作方式可分为编程控制方式和中断控制方式。cpu在一个工作周期内,利用完成其他任务的空余时间,调用键盘扫描子程序,经程序查询,若无键操作,则返回;若有键操作,则进而判断是哪个键,并执行相应的键处理程序。这种方式为编程扫描方式。由于单片机在正常应用过程中,可能会经常进行键操作,因而编程控制方式使cpu经常处于工作状态, 在进行本次设计中,涉及到了调整时间、设置闹钟、上调、下调四个功能。因此采用独立式键盘。如下图所示:图4-5独立键盘电路5.软件部分的设计5.1程序流程图5.1.1 系统总流程图系统总流程图如图5-1所示。流程图分析:首先系统初始化,系统开始运行,当有设置键按下时进入修改时间模式,无按键按下时读取时间等数据送入液晶屏显示;在修改时间模式下设置时间完成后再送数据到液晶屏显示。图5-1系统总流程图5.1.2 ds1302时钟程序流程图时钟流程图如图5-2所示。流程图分析:ds1302开始计时时,首先进行初始化,当有中断信号时,读取时钟芯片的数据送入液晶屏显示。这时若有设置键按下时,进行时间修改,完成后将数据送入时钟芯片;若没有按键按下,则直接存入eprom,送入液晶屏显示。图5-2 时钟流程图5.1.3 lcd显示程序流程图显示程序流程图如图5-3。流程图分析:首先对1602显示屏进行初始化(初始化大约持续10ms左右),然后检查忙信号,若bf=0,则获得显示ram的地址,写入相应的数据显示;若bf=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到bf=0为止。图5-3 lcd显示程序流程图5.2程序的设计5.2.1 ds1302读写程序ds1302是spi总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与ds1302通信,首先要先了解ds1302的控制字。ds1302的控制字如图5-4所示。图5-4 ds1302的控制字控制字总是从最低位开始输出。在控制字指令输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个sclk脉冲的下降沿,读出ds1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图5-5、5-6所示。图5-5 单字节读图5-6 单字节写5.2.2液晶显示程序1602通过d0d7的8位数据端传输数据和指令,其模块内的控制器有11条控制指令。当液晶显示屏的接口电路与单片机系统i/o按照并行数据传输方式连接完成以后,即可以对at89c52单片机进行编程。在液晶屏完成显示之前首先要对液晶进行初始化。程序见附录二。6.实验结果此电子闹钟设计是利用proteus仿真软件进行仿真,基本上实现了课程设计要求实现的功能。硬件部分设置了的三个按键k1、k2、k3、k4。k1键为调整时间功能键,k4为设置闹钟功能键,k2、k3分别为上调和下调键。当按键k4第一次按下时,停止计时进入闹钟1的时设置,当按键k4第二、第三次按下时,分别进入闹钟1的分设置和秒设置,当按k4第四次按下时,退出闹钟设置,正常显示当前时间。当按下k1键时进入时间调整模式,k1按下第一次进入年调整,k1按下第二次进入月调整,k1按下第三次进入日调整;当k1按下第四、五、六次时,分别进入时、分、秒调整,k1按下第七次时时间调整完毕,退出时间调整功能,显示器正常显示时间。下面是程序运行结果截图图6-1 初始时间显示图图6-2 调整时间后显示图图6-3 闹钟设置后显示图上图6-1表示程序启动时将时间初始化为2015年01月10日00时00分00秒;之后进行了调整,将时间调整为操作的当前时间如图6-2所示,2015年01月10日11时59分15秒;图6-3表示是将闹钟设置为13时00分29秒。7.心得体会通过自己的不懈努力,我终于完成了毕业设计任务书上的任务要求。功能上基本达标:时钟的显示、调时功能、闹铃功能。其精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷;校时功能保证了时钟准确和可靠性。硬件设施合乎要求,软件设计可以配合硬件实现要求的功能。但是由于时间比较短,前期设计出现部分不足:如位选闪烁功能不能实现、闹钟的开启与关闭、间断蜂鸣声等。这些只是软件设计时相应功能部分还不完善造成。不过经仔细思考和程序的完善,最终将软件设计改进,并完全可以很好实现所有要求的功能。可见技术在不断进步,机械式时钟已经被淘汰,取而代之的是具有高度准确性和直观性且无机械装置,具有更长的使用寿命等优点的数字时钟。数字时钟更具人性化,更能提高人们的生活质量,更受人们欢迎。 无可否认机械时代已经过去,电子时代已经到来。做为新时代的我们,更应该提高自身能力,适应新时代的发展。知识来自实践,多去生活中探询所需要的。对于上述所提到的研究课题,我们应尽量考虑到人的因素,增强时钟的实用性和操作性,为使用者提供切实的方便,营造一种舒适的生活氛围。所以,在设计的时候,应该从多方面、多角度去考虑问题,而且应该进一步提高时钟的质量。另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编程的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。参考文献1 张友德,赵志英,涂时亮.单片微型机原理、应用与实验m.上海:复旦大学出版社,2008.2 赵亮,侯国锐.单片机c语言编程与实例m.北京:人民邮电出版社,2003.3 高鹏,安涛,寇怀成.电路设计与制版protel99入门与提高m.北京:人民邮电出版社,2006.4 谭浩强.c程序设计(第三版)m.北京:清华大学出版社,2005.5 李朝青.单片机原理及接口技术m.北京:北京航空航天大学出版社,2004. 6 康光华,电子技术基础模拟部分(第五版)m.北京:高等教育出版社,2005.附录一 系统原理图附录二 系统程序38#include /包含单片机寄存器的头文件#include /包含_nop_()函数定义的头文件unsigned char code digit10=0123456789; /定义字符数组显示数字sbit sclk=p10; /位定义1302芯片的接口,时钟输出端口定义在p1.0引脚sbit data=p11; /位定义1302芯片的接口,数据输出端定义在p1.1引脚sbit rst=p12; /位定义1302芯片的接口,复位端口定义在p1.2引脚sbit k1=p32; /定义按键1触发中断0,调整时间按钮sbit k4=p33; /定义按键1触发中断1,设置闹钟按钮sbit k2=p14; /定义按键2,+sbit k3=p15; /定义按键3,-sbit beep=p36; /蜂鸣器unsigned char miao,fen,shi,tian,yue,nian;/分别储存苗、分、小时,日,月,年unsigned char settime=0;unsigned char setclock=0;unsigned char clock_hour,clock_min,clock_sec;/*函数功能:延时若干微秒入口参数:n*/ void delaynus(unsigned char n) unsigned char i; for(i=0;in;i+);/*函数功能:向1302写一个字节数据入口参数:x*/ void write1302(unsigned char dat) unsigned char i; sclk=0; /拉低sclk,为脉冲上升沿写入数据做好准备 delaynus(10); /稍微等待,使硬件做好准备 for(i=0;i=1; /将dat的各数据位右移1位,准备写入下一个数据位 /*函数功能:根据命令字,向1302写一个字节数据入口参数:cmd,储存命令字;dat,储存待写的数据*/ void writeset1302(unsigned char cmd,unsigned char dat) rst=0; /禁止数据传递 sclk=0; /确保写数居前sclk被拉低 rst=1; /启动数据传输 delaynus(10); /稍微等待,使硬件做好准备 write1302(cmd); /写入命令字 write1302(dat); /写数据 sclk=1; /将时钟电平置于高电平状态 rst=0; /禁止数据传递 /*函数功能:从1302读一个字节数据入口参数:x*/ unsigned char read1302(void) unsigned char i,dat;delaynus(10); /稍微等待,使硬件做好准备for(i=0;i=1; if(data=1) /如果读出的数据是1 dat|=0x80; /将1取出,写在dat的最高位 sclk=1; /将sclk置于高电平,为下降沿读出 delaynus(10); /稍微等待 sclk=0; /拉低sclk,形成脉冲下降沿 delaynus(10); /稍微等待 return dat; /将读出的数据返回 /*函数功能:根据命令字,从1302读取一个字节数据入口参数:cmd*/ unsigned char readset1302(unsigned char cmd) unsigned char dat; rst=0; /拉低rst sclk=0; /确保写数居前sclk被拉低 rst=1; /启动数据传输 write1302(cmd); /写入命令字 dat=read1302(); /读出数据 sclk=1; /将时钟电平置于已知状态 rst=0; /禁止数据传递 return dat; /将读出的数据返回/*函数功能: 1302进行初始化设置*/ void init_ds1302(unsigned char year,unsigned char mon,unsigned char dt,unsigned char hour,unsigned char min,unsigned char sec)/* unsigned char flag; flag= readset1302(0x81);if(flag&0x80) /判断时钟芯片是否关闭 writeset1302(0x8e,0x00); /根据写状态寄存器命令字,写入不保护指令 writeset1302(0x80,(55/10)4|(55%10); /根据写秒寄存器命令字,写入秒的初始值writeset1302(0x82,(59/10)4|(59%10); /根据写分寄存器命令字,写入分的初始值writeset1302(0x84,(23/10)4|(23%10); /根据写小时寄存器命令字,写入小时的初始值writeset1302(0x86,(18/10)4|(18%10); /根据写日寄存器命令字,写入日的初始值writeset1302(0x88,(6/10)4|(6%10); /根据写月寄存器命令字,写入月的初始值writeset1302(0x8c,(14/10)4|(9%10); /根据写年寄存器命令字,写入年的初始值writeset1302(0x90,0xa5); /打开充电功能 选择2k电阻充电方式writeset1302(0x8e,0x80); /根据写状态寄存器命令字,写入保护指令 */ /如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用上面的语句 /*-这是每次都初始化的语句-*/ /-2015-01-7 tue 22:36:55 - writeset1302(0x8e,0x00); /根据写状态寄存器命令字,写入不保护指令 writeset1302(0x80,(sec/10)4|(sec%10); /根据写秒寄存器命令字,写入秒的初始值writeset1302(0x82,(min/10)4|(min%10); /根据写分寄存器命令字,写入分的初始值writeset1302(0x84,(hour/10)4|(hour%10); /根据写小时寄存器命令字,写入小时的初始值writeset1302(0x86,(dt/10)4|(dt%10); /根据写日寄存器命令字,写入日的初始值writeset1302(0x88,(mon/10)4|(mon%10); /根据写月寄存器命令字,写入月的初始writeset1302(0x8c,(year/10)4|(year%10); /根据写年寄存器命令字,写入年的初始值writeset1302(0x90,0xa5); /打开充电功能 选择2k电阻充电方式writeset1302(0x8e,0x80); /根据写状态寄存器命令字,写入保护指令/*以下是对液晶模块的操作程序*/sbit rs=p20; /寄存器选择位,将rs位定义为p2.0引脚sbit rw=p21; /读写选择位,将rw位定义为p2.1引脚sbit e=p22; /使能信号位,将e位定义为p2.2引脚sbit bf=p07; /忙碌标志位,将bf位定义为p0.7引脚/*函数功能:延时1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/ void delaynms(unsigned char n) unsigned char i;for(i=0;in;i+) delay1ms(); /*蜂鸣器程序*/void beep()unsigned char t;for(t=0;t200;t+)beep=1;delaynus(500);beep=0;delaynus(500);/*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/bit busytest(void) bit result; rs=0; /根据规定,rs为低电平,rw为高电平时,可以读状态 rw=1; e=1; /e=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 result=bf; /将忙碌标志电平赋给result e=0; /将e恢复低电平 return result; /*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/void writeinstruction (unsigned char dictate) while(busytest()=1); /如果忙就等待 rs=0; /根据规定,rs和r/w同时为低电平时,可以写入指令 rw=0; e=0; /e置低电平,写指令时,e为高脉冲, / 就是让e从0到1发生正跳变,所以应先置0 _nop_(); _nop_(); /空操作两个机器周期,给硬件反应时间 p0=dictate; /将数据送入p0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=1; /e置高电平,写指令 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=0; /当e由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:指定字符显示的实际地址入口参数:x*/ void writeaddress(unsigned char x) writeinstruction(x|0x80); /显示位置的确定方法规定为80h+地址码x /*函数功能:将数据(字符的标准ascii码)写入液晶模块入口参数:y(为字符常量)*/ void writedata(unsigned char y) while(busytest()=1); rs=1; /rs为高电平,rw为低电平时,可以写入数据 rw=0; e=0; /e置低电平,写指令时,e为高脉冲, / 就是让e从0到1发生正跳变,所以应先置0 p0=y; /将数据送入p0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=1; /e置高电平,写数据 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 e=0; /当e由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:对lcd的显示模式进行初始化设置*/void lcdinitiate(void) delaynms(15); /延时15ms,首次写指令时应给lcd一段较长的反应时间 writeinstr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 观赏鱼养殖基地拓展创新创业项目商业计划书
- 旅游景区财务部2025年工作总结
- 广东省高考2模数学试卷
- 救助站设施升级计划
- 小学体育与营养健康课件
- 外研版九年级英语(上册)写作范文规划
- 海南中考今年数学试卷
- 2025年度消防应急救援预案演练计划
- 2025年中国大米黄酒行业市场调查研究及投资前景预测报告
- 江苏29届高考数学试卷
- 2025年月度工作日历含农历节假日电子表格版
- T-DACS 010-2023 奶牛养殖场生物安全管理规范
- 完整版项目实施保密方案
- 固定式启闭机及闸门的检修与维护规范
- 公司个人成长分享
- 人教版(2024)八年级上册物理第六章 质量与密度 单元测试卷(含答案解析)
- DB11∕T 2147-2023 连栋玻璃温室建造技术规范
- 生殖健康咨询师复习题
- 2025年高考英语复习专项突破:阅读理解之词义猜测题(解析版)
- 2024年西藏自治区中考化学试题卷(含答案)
- 常用经典日语句子大全
评论
0/150
提交评论