版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于日历时钟ds1302的时钟设计东 北 石 油 大 学 课 程 设 计 课 程 单片机课程设计 题 目 基于日历时钟ds1302的时钟设计 院 系 电气信息工程学院测控系 专业班级 测控技术与仪器二10-2 学生姓名 李超 学生学号 100601220214 指导教师 段志伟 宋金波 2012年 3月 30日1东北石油大学课程设计任务书课程 单片机课程设计 题目 基于日历时钟ds1302的时钟设计 专业 测控技术与仪器 姓名 李超 学号 100601220214 一、任务设计一款基于ds1302,可以显示年月日时分秒及周信息,具有可调整日期和时间功能的电子万年历。二、设计要求1 自动计时,显
2、示年、月、日、时、分、秒。2 时间显示可调整。3 写出详细的设计报告。4 给出全部电路和源程序。三、参考资料1 陈景初.单片机应用系统设计与实践m.北京:航空航天大学出版社,2006.2 陈正振.电子电路设计与制作.广西:交通职业技术学院信息工程系,2007.3 杨子文.单片机原理及应用.西安:电子科技大学出版社,2006.4 刘勇.数字电路.北京:电子工业出版社,2004.5 黄明强.ds1302在单片机系统中的应用.保定:师范学校学报,2004, (2).完成期限 2012.3.19至2012.3.30 指导教师 段志伟 宋金波 专业负责人 曹广华 2012年 3月 16 日目录第1章 绪
3、论31.1 ds1302简介31.2 ds1302的性能特性31.3 ds1302数据操作原理31.4 ds1302 的应用41.5 本设计任务4第2 章 总体方案论证与设计52.1 单片机芯片的选择方案和论证52.2 显示模块选择方案和论证52.3 时钟芯片的选择方案和论证52.4 总体硬件组成框图6第3章 系统硬件设计73.1 单片机主控制模块的设计73.2 时钟电路模块的设计83.3 电路原理及说明93.4 显示模块的设计10第4章 系统的软件设计124.1 主程序设计124.2 液晶驱动程序13第5章 系统调试与测试结果分析145.1 硬件测试145.2 软件测试145.3 测试结果1
4、4结 论16参考文献17附录1 程序18附录2 仿真效果图26第1章 绪论随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活中。日历是人们不可或缺的日常用品。但一般日历都为纸制用品,使用不便,寿命不长。电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式led数码管显示的日历钟逐渐受到人们的欢迎。1.1 ds1302简介ds1302是美国dallas公司推出的一种高性能、低功耗、带ram的实时时钟芯片,
5、它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5v。时钟可工作在24小时格式或12小时(am/pm)格式。ds1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个31×8的用于临时性存放数据的ram寄存器。ds1302是ds1202的升级产品,与ds1202兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。1.2 ds1302的性能特性·实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计
6、数;·用于高速数据暂存的31×8位ram;·最少引脚的串行i/o;·2.55.5v 电压工作范围;·2.5v时耗电小于300na;·用于时钟或ram数据读/写的单字节或多字节数据传送方式;·简单的3线接口;·可选的慢速充电(至vcc1)的能力。1.3 ds1302数据操作原理ds1302在任何数据传送时必须先初始化,把rst脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在sclk的上升沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后
7、,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。如果在传送过程中置rst为低电平,则会终止本次数据传送,并且i/o引脚变为高阻态。上电运行时,在vcc >=2.5v之前,rst脚必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。1.4 ds1302 的应用实时时钟芯片ds1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,也可以关闭充电功能,芯片采用32768hz晶振。要特别说明的是,备用电源bt1可以用电池或超级电容(10万f以上)。虽然ds1302在主电源掉电后
8、耗电很小,但如果要长时间保证时钟正常,最好选用小型充电电池。如果断电时间较短(几小时或几天),可以用漏电较小的普通电解电容代替(100f就可以保证1小时的正常走时)。ds1302在第一次加电后,需进行初始化操作。初始化后就可以按正常方法调整时间及闹铃。1.5 本设计任务本设计的电子万年历属于小型智能家用电子产品。利用单片机进行控制,实时时钟芯片进行记时,外加掉电存储电路和显示电路,可实现时间的调整和显示。电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。因而,此设计具有相当重要的现实意义和实用价值。本设计以at89s5
9、2单片机为核心,构成单片机控制电路,结合ds1302时钟芯片和24c02flash存储器,显示阳历年、月、日、星期、时、分、秒和阴历年、月、日,在显示阴历时间时,能标明是否闰月,同时完成对它们的自动调整和掉电保护,全部信息用液晶显示。第2 章 总体方案论证与设计由于电子万年历的种类比较多,因此方案选择在设计中是至关重要的。正确地选择方案可以减小开发难度,缩短开发周期,降低成本,更快地将产品推向市场。2.1 单片机芯片的选择方案和论证方案一: 采用89c51芯片作为硬件核心,采用flash rom,内部具有4kb rom 存储空间,能于3v的超低压工作,而且与mcs-51系列单片机完全兼容,但是
10、运用于电路设计中时由于不具备isp在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:采用at89s52,片内rom全都采用flash rom;能以3v的超底压工作;同时也与mcs-51系列单片机完全该芯片内部存储器为8kb rom 存储空间,同样具有89c51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用at89s52作为主控制系统。2.2 显示模块选择方案和论证方案一:采用led数码管动
11、态扫描,led数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案三:采用lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,并且我做的最小系统上带一个ts1620-1,和at89s52已经接好,省了很多麻烦,所以在设计中采用lc此d液晶显示屏。2.3 时钟芯片的选择方案和论证方案一:直接采用单片机定时计数器提
12、供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二:采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na。综上各方案所述,对此次作品的方案选定: 采用at89s52作为主控制系统; ds1302提供时钟;lcd液晶显示屏作为显示。2.4 总体硬件组成框图lcd液晶显示屏显示模块at89s52主控制模 块键盘模块ds1302时钟模块图2-
13、1 总体硬件组成框图第3章 系统硬件设计本电路是由at89s52单片机为控制核心,具有在线编程功能,低功耗,能在3v超低压工作;时钟电路由ds1302提供,它是一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5v5.5v。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个31*8的用于临时性存放数据的ram寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示部份由lcd液晶显示屏显示。3.1 单片机主
14、控制模块的设计at89s52单片机为40引脚双列直插芯片,有四个i/o口p0,p1,p2,p3, mcs-51单片机共有4个8位的i/o口(p0、p1、p2、p3),每一条i/o线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,xtal1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,xtal2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。如图3-1 所示: 图3-1 主控制系统3.2 时钟电路模块的设计图3-2示出ds1302的引脚
15、排列,其中vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大者供电。当vcc2大于vcc1+0.2v时,vcc2给ds1302供电。当vcc2小于vcc1时,ds1302由vcc1供电。x1和x2是振荡源,外接32.768khz晶振。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过
16、程中rsts置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电运行时,在vcc大于等于2.5v之前,rst必须保持低电平。只有在sclk 为低电平时,才能将rst置为高电平,i/o为串行数据输入端(双向)。sclk始终是输入端。 图3-2 ds1302的引脚图3.3 电路原理及说明3.3.1 时钟芯片ds1302的工作原理ds1302在每次进行读、写程序前都必须初始化,先把sclk端置 “0”,接着把rst端置“1”,最后才给予sclk脉冲。ds1302的控制字的位7必须置1,若为0则不能把对ds1302进行读写数据。对于位6,若对程序进行读/写时ram=1,对时间进行读/写时,ck
17、=0,位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。日历、时间寄存器内容:“ch”是时钟暂停标志位,当该位为1时,时钟振荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,wp必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。3.3.2 ds1302的控制字节ds1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位
18、1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。3.3.3 数据输入输出(i/o)在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。3.3.4 ds1302的寄存器 ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可
19、一次性顺序读写除充电寄存器外的所有寄存器内容。ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。 3.4 显示模块的设计采用lcd显示,lcd显示具有丰富多样性,灵活性,电路简单、易于控制而且功耗小,对于信息量多的系统,是比较适合的,lcd液晶显示模块采用lcd1602型号,具有很低的功耗,正常工作室电流仅2.0ma/5.0v。通过编程实现总动关闭屏幕能够更有效地
20、降低功耗。lcd1602分两行显示,每行可现实多达16个字符,其内部的字符发生器已经存储了160个不同的点阵字符图形,通过内部指令可实现对其显示多样的控制。图3-3 lcd液晶显示屏显示模块第4章 系统的软件设计4.1 主程序设计at89c52中有一个用于构成内部振荡器的高增益反相放大器,引脚xtal1和xtal2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体一起构成自激振荡器。外接石英晶体及电容c1和c2接在放大器的反馈回路中构成并联振荡电路。对外接电容c1和c2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度
21、稳定性,如果使用石英晶体,在这里电容使用22pf。开始初始化 读日期、时间、温度 写日期、时间、温度 显示子程序 时间修改子程序 日期修改子程序显示结果返回 开关控制子程序图4.1 主程序流程图4.2 液晶驱动程序lcd使用之前须对它进行初始初始化可通过复位完成,也可在复位后完成,初始化过程如下:(1) 清屏。将显示缓冲区ddram的内容全部写入空格(ascii20h)。(2) 功能设置。(3) 开/关显示设置。控制显示的开关,当d=1时显示,d=0时不显示。控制光标开关,当c=1时光标显示,c=0时光标不显示。控制字符是否闪烁,当b=0时字符闪烁,b=0时字符不闪烁。(4) 输入方式设置。初
22、始化过程:(1)延时15ms;(2)写指令38h(不检测忙信号);(3)延时5 ms;(4)写指令38h(不检测忙信号);(5)延时5 ms;(6)写指令38h(不检测忙信号);(7)以后每次写指令、读/写数据操作之前均需检测忙信号;(8)写指令38h:显示模式设置;(9)写指令08h:显示关闭;(10)写指令01h:显示清屏;(11)写指令06h:显示光标移动设置;(12)写指令0ch:显示开及光标设置。第5章 系统调试与测试结果分析5.1 硬件测试电子万年历的电路系统较大,对于焊接方面更是不可轻视,庞大的电路系统中只要出于一处的错误,则会对检测造成很大的不便,而且电路的交线较多,对于各种锋
23、利的引脚要注意处理,否则会刺被带有包皮的导线,则会对电路造成短路现象。在本成电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:(1)lcd液晶显示屏显示部分已经连在最小系统上,节省了不少时间和精力。(2)对万年历修改时间或日期时,有时lcd液晶显示屏被屏蔽掉,造成不亮现象。解决:根据仪器的测试,发现电路的驱动能力不足,最后在ds1302时钟芯片的/cs、sclk、ret端接入5.1k的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。5.2 软件测试电子成年历是多功能的数字型,可以看当前日期,时间。电子成年历功能很多,所以对于它的程序也较为
24、复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中遇到的主要问题是:烧入程序后,lcd液晶显示屏显示亮度不好。解决:一遍旋转10k欧的滑动变阻器,一遍观看lcd显示屏,知道看到合适的亮度为止。5.3 测试结果在测试中遇到lcd液晶显示屏为不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏,滑动变阻器器没有调好:查看烧写的程序是否正确无误,对程序进行认真修改。测试结论:经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到
25、更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。结 论本设计利用单片机at89s52控制串行实时时钟芯片ds1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片ds1302带有后备电池,具备对后背电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟占用单片机资源多以及计时不可靠等缺点。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的精确性和可靠性有较高要求的场合,提供较好的实时时钟。但是,由于ds1302易受环境影响,会使该电路出现时钟精度不高、时钟混乱等问题,还有待继续
26、研究和改进。在对芯片的管脚功能和用法有充分的了解后,根据设计要求设计硬件电路,包括单片机控制电路、时钟电路、显示电路。然后通过软件编程,实现了对年、月、日、时、分、秒、星期、闰年和阴历的自动调整,用按键进行控制,用液晶模块进行显示。 电子万年历可以正常显示时间并进行时间调整,基本完成了预期要实现的目标。参考文献1 沈庆阳.8051单片机实践与应用.北京:清华大学出版社.2003.12,26-38.2 陈景初.单片机应用系统设计与实践m.北京:航空航天大学出版社.2006.3 李宏,张家田.液晶显示器件应用技术.北京:机械工业出版社.2004:156-183.4 陈正振.电子电路设计与制作.广西
27、:交通职业技术学院信息工程系.2007.5 黄明强.ds1302在单片机系统中的应用.保定:师范专科学校学报.2004:17(2).6 赵海兰,朱剑,赵祥伟.ds1302实时显示时间的原理与应用.电子技术.2002,(1).7 孙安青.at89s51单片机实验及实践教程.8 刘勇,数字电路.电子工业出版社.2004.9 徐爱钧,彭秀华.单片机高级语言编程与uvision2应用实践.北京:电子工业出版社.2004.10 杨子文.单片机原理及应用.西安:电子科技大学出版社. 2006.附录1 程序#include <reg51.h>#include <intrins.h>/
28、#include "lcd1602.h"/#include "ds1302.h"#define uint unsigned int#define uchar unsigned charsbit ds1302_clk = p17; /实时时钟时钟线引脚 sbit ds1302_io = p16; /实时时钟数据线引脚 sbit ds1302_rst = p15; /实时时钟复位线引脚sbit acc0 = acc0;sbit acc7 = acc7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hi
29、de_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit set = p20; /模式切换键sbit up = p21; /加法按钮sbit down = p22; /减法按钮sbit out = p23; /立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag;uchar tempbuffer5,week_value2;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/port definitions*sbit lcdrs= p25;sbit lcdrw= p26;sbit lc
30、den = p27;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0xa0,p3=0xb0.数据端口/内部等待函数*unsigned char lcd_wait(void)lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();lcden=0;return dbport;/向lcd写入命令或数据*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光标返回原点void
31、lcd_write(bit style, unsigned char input)lcden=0;lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意顺序lcden=1;_nop_();/注意顺序lcden=0;_nop_();lcd_wait();/设置显示模式*#define lcd_show0x04 /显示开#define lcd_hide0x00 /显示关 #define lcd_cursor0x02 /显示光标#define lcd_no_cursor0x00 /无光标 #define lcd_flash0x01 /光标闪动#def
32、ine lcd_no_flash0x00 /光标不闪动void lcd_setdisplay(unsigned char displaymode)lcd_write(lcd_command, 0x08|displaymode);/设置输入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 画面可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command,
33、 0x04|inputmode);/初始化lcd*void lcd_initial()lcden=0;lcd_write(lcd_command,0x38); /8位数据端口,2行显示,5*7点阵lcd_write(lcd_command,0x38);lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_setinput(lcd_ac_up|lcd_no_move); /ac递增, 画面不动/液晶字符输入的位置*void gotoxy(unsigned
34、char x, unsigned char y)if(y=0)lcd_write(lcd_command,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);/将字符输出到液晶显示void print(unsigned char *str)while(*str!='0')lcd_write(lcd_data,*str);str+;/*ds1302时钟部分子程序*/typedef struct _systemtime_unsigned char second;unsigned char minute;unsigned char h
35、our;unsigned char week;unsigned char day;unsigned char month;unsigned char year;unsigned char datestring11;unsigned char timestring9;systemtime;/定义的时间类型systemtime currenttime;#define am(x)x#define pm(x)(x+12) / 转成24小时制#define ds1302_second0x80 /时钟芯片的寄存器位置,存放时间#define ds1302_minute0x82#define ds1302_
36、hour0x84 #define ds1302_week0x8a#define ds1302_day0x86#define ds1302_month0x88#define ds1302_year0x8c void ds1302inputbyte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i;acc = d; for(i=8; i>0; i-) ds1302_io = acc0; /相当于汇编中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc >> 1; unsigned cha
37、r ds1302outputbyte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i>0; i-) acc = acc >>1; /相当于汇编中的 rrc acc7 = ds1302_io; ds1302_clk = 1;ds1302_clk = 0; return(acc); void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要写的数据 ds1302_rst = 0; ds1302_clk = 0; ds1
38、302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 写1byte数据 ds1302_clk = 1; ds1302_rst = 0; unsigned char read1302(unsigned char ucaddr)/读取ds1302某地址的数据 unsigned char ucdata; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0x01); / 地址,命令 ucdata = ds1302outpu
39、tbyte(); / 读1byte数据 ds1302_clk = 1; ds1302_rst = 0; return(ucdata);void ds1302_gettime(systemtime *time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char readvalue;readvalue = read1302(ds1302_second);time->second = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_minute);ti
40、me->minute = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_hour);time->hour = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_day);time->day = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = rea
41、d1302(ds1302_week);time->week = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_month);time->month = (readvalue&0x70)>>4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_year);time->year = (readvalue&0x70)>>4)*10 + (readvalue&am
42、p;0x0f);void datetostr(systemtime *time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里datestring if(hide_year<2) /这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22 time->datestring0 = '2' time->datestring1 = '0' time->datestring2 = time->year/10 + '0' time->datestr
43、ing3 = time->year%10 + '0' else time->datestring0 = ' ' time->datestring1 = ' ' time->datestring2 = ' ' time->datestring3 = ' 'time->datestring4 = '/'if(hide_month<2)time->datestring5 = time->month/10 + '0' time->d
44、atestring6 = time->month%10 + '0' else time->datestring5 = ' ' time->datestring6 = ' 'time->datestring7 = '/'if(hide_day<2)time->datestring8 = time->day/10 + '0' time->datestring9 = time->day%10 + '0' elsetime->datestring8
45、 = ' 'time->datestring9 = ' ' if(hide_week<2) week_value0 = time->week%10 + '0' /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ' ' week_value1 = '0'time->datestring10 = '0' /字符串末尾加 '0' ,判断结束字符void timetostr(syst
46、emtime *time) /将时,分,秒数据转换成液晶显示字符放到数组 timestring; if(hide_hour<2) time->timestring0 = time->hour/10 + '0' time->timestring1 = time->hour%10 + '0' else time->timestring0 = ' 'time->timestring1 = ' 'time->timestring2 = ':'if(hide_min<2)
47、 time->timestring3 = time->minute/10 + '0' time->timestring4 = time->minute%10 + '0' else time->timestring3 = ' 'time->timestring4 = ' ' time->timestring5 = ':' if(hide_sec<2) time->timestring6 = time->second/10 + '0' time
48、->timestring7 = time->second%10 + '0' elsetime->timestring6 = ' 'time->timestring7 = ' ' time->datestring8 = '0'void initial_ds1302(void) /时钟芯片初始化 unsigned char second=read1302(ds1302_second);if(second&0x80) /判断时钟芯片是否关闭 write1302(0x8e,0x00); /写入允许wr
49、ite1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55write1302(0x88,0x07);write1302(0x86,0x25);write1302(0x8a,0x07);write1302(0x84,0x23);write1302(0x82,0x59);write1302(0x80,0x55);write1302(0x8e,0x80); /禁止写入void delay1ms(unsigned int count)unsigned int i,j;for(i=0;i<count;i+)for(j=0;j<120;j+);/*延时子程序*/void mdelay(uint delay)uint i;for(;delay>0;delay-)for(i=0;i<62;i+) /1ms延时.;void outkey() /跳出调整模式,返回默
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1-Heptadecanol-Standard-生命科学试剂-MCE
- 医联体内疼痛多学科诊疗资源配置标准化
- 呼吸机护理中的沟通技巧
- 医疗辐射防护的精准化防护方案评价
- 医疗资源区域协同
- 护理延伸服务中的康复护理指导
- 护理伦理道德课件设计
- 2025年安全用电操作培训
- 呼吸系统疾病护理中的特色技术
- 2026上海中医药大学附属岳阳中西医结合医院财务处科员岗位公开招聘考试参考题库及答案解析
- 2026年山东铝业职业学院单招综合素质考试必刷测试卷带答案解析
- 物流园区规划与设计课件
- 直播销售工作计划与时间表
- 2025年内蒙历年单招题库及答案
- 2025下半年教师资格考试(初中信息技术)新版真题卷附答案
- 《滩海陆岸石油设施检验技术规范》
- 《脓毒症标准化动物模型》
- 厂区驾驶员安全培训试题及答案解析
- 液压升降机设计技术说明书
- 2025年及未来5年中国高压开关制造行业发展监测及投资方向研究报告
- 美发店股份合伙协议书
评论
0/150
提交评论