智能时钟课程设计说明书_第1页
智能时钟课程设计说明书_第2页
智能时钟课程设计说明书_第3页
智能时钟课程设计说明书_第4页
智能时钟课程设计说明书_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计说明书课程名称:2011级机电专业课程设计题 目 智能电子钟(LCD显示)学 院:机电工程学院系:机电专业:机械设计制造及其自动化班级:机制XXX班学号:XXXXXXXXX学生姓名: XXXXX起讫日期:指导教师: xxxxxx 职称: 系分管主任:审核日期:摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、 界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和 工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。本设计主要为 实现一款可正常显示时钟 / 日历、带有定时闹铃的多功能电子时钟。本文对当前电子钟开发手段进行了比较和分析,最

2、终确定了采用单片机技术实现 多功能电子时钟。本设计应用 AT89C51芯片作为核心,使用 DS1302实时时钟日历 芯片完成时钟 / 日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时 性好,时间精确,操作简单,编程容易。该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加 新功能,从而给人们的生活和工作带来更多的方便。关键词:电子时钟;多功能; AT89C51;DS1302第 1章 总体设计方案1.1 方案设计实时时钟芯片具备年、月、日、时、分、秒计时功能和多点计时功能,计时数据的更 新每秒自动进行一次,不需程序干预。计算机可通过中断或查询方式读取计时数据进行显 示

3、,因此计时功能的实现无需占用 CPU 的时间,程序简单。此外,实时时钟芯片多数带有 锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测 控系统的采样信号等;有的实时时钟芯片内部还带有非易失性 RAM ,可用来存放需长期 保存但有时也需变更的数据,由于功能完善,精度高,软件程序设计相对简单,且计时不 占用 CPU 时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。利用单片机内部的定时 / 计数器进行中断定时,配合软件延时实现时、分、秒的计时 及秒表计时。 该方案节省硬件成本, 且能使设计者对单片机的指令系统能有更深入的了解, 从而掌握单片机应用技

4、术 MCS-51 汇编语言程序设计方法,因此,本系统设计采用此种软 件控制方法来实现计时。 而由于 Atmel 公司的 AT89C51 是一种自带 4KB Flash 存储器的 低电压、高性能的 CMOS 8 位微处理器。该器件采用 Atmel 高密度非易失存储器制造 技术制造,与工业标准的 MCS-51 指令集和输出引脚相兼容。它的功能强大,而且也比 较容易购买,故本设计中所选的单片机为 AT89C51 单片机。1.2 系统框图按照系统设计功能的要求,初步确定系统由主控模块、时控模块、及显示模块和键盘 接口模块共 4 个模块组成。主控芯片使用 51 系列 AT89C51 单片机,时钟芯片使用

5、美国 DALLAS公司推出的一种高性能、低功耗、带 RAM的实时时钟DS1302。采用DS1302作 为计时芯片,可以做到计时准确。更重要的是,DS1302可以在很小电流的后备电源(2.5 5.5V电源,再2.5V时耗电小于300nA),而且DS1302可以编程选择多种充电电流来为后 备电源进行慢速充电,可以保证后备电源基本不耗电。显示模块采用普通的液晶显示屏(LCD),设计框图如图1所示图1 设计方案框图第2章核心芯片简介2.1 DS1302 简介DS1302是美国DALLAS公司推出的一种高性能、低功耗、带 RAM的实时时钟芯片, 它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补

6、偿功能,工作电压宽达 2.55.5V。时钟可工作在24小时格式或12小时(AM/PM )格式。DS1302与单片机的接口 使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传 送多个字节的时钟信号或RAM数据。DS1302内部有一个31 8的用于临时性存放数据的 RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源 双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。2.1.1 DS1302引脚功能与内部结构DS1302的引脚功能如表1所示,外形及内部结构如图2所示:表1 DS1302引脚功能表引脚号引脚名称功能1VCC

7、2主电源2、3X1、X2振荡源,外接32768Hz晶振4GND地线5RST复位/片选线6I/O串行数据输入/输出端(双向)7SCLK串行时钟输入端8VCC1后备电源 M电源控制k 一VcVcG1/SCRSV18J VcCCX27 scX匚36J I/2G4532X2X1振荡器与分频器实时时钟31x8RAMAD命令与控 制逻辑输入移位寄 存器图2 DS1302管脚图及内部结构图2.1.2 DS1302 控制字DS1302的控制字节如表2所示:表2 DS1302控制字节的含义765432101ram/ CKA4A3A2A1A0控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到

8、DS1302 中。位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操 作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制 字节总是从最低位开始输出。2.1.3 DS1302复位引脚通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,Rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302 进行操作。如果在传送过程中置 RST为低电平,则会终止此次数据传送,并且I/O引脚变 为高阻态。上电运行时,在 V

9、cc2.5V之前,RST必须保持低电平。只有在 SCLK为低电 平时,才能将RST置为高电平。2.1.4 DS1302数据的输入与输出在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302 的数据,读出数据时从低位0位至高位7,数据读写时序如图3所示:SCLKRSTI/Onnnnnnnnnnnnnntzz1101234567014567R/WA0A1A2A3A4R/C1DATA I/O BYTE1DATA I/O BYTE2图3数据读写时序2.1.5 DS1302 寄存器DS1

10、302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。其日历、时间寄存器及其控制字见表 3。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器的内 容。DS1302与RAM相关的寄存器分为两类,一类是单个 RAM单元,共31个,每个单 元组态为一个8位的字节,其命令控制字为 C0H-FDH,其中奇数为读操作,偶数为写操 作;再一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的 RAM的31个字 节,命令控制字为FEH (写)、FFH (读)。表3 D

11、S1302的日历、时钟寄存器及其控制字寄存器名命令字取值范围各位内容写操作读操作765432 1 0秒寄存器80H81H00-59CH10SECSEC分寄存器82H83H00-59010MINMIN时寄存器84H85H01-12 或00-2312/24010HRHR日寄存器86H87H01-28,29,30,310010DATEDATE月寄存器88H89H01-1200010MMONTH周寄存器8AH8BH01-0700000DAY年寄存器8CH8DH00-9910YEARYEAR2.2AT89C51 简介AT89C51 是一种带 4K 字节 FLASH 存储器(FPEROM Flash Pr

12、ogrammable andErasable Read Only Memory)的低电压、高性能 CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只 读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造, 与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组 合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简 版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。2.2.1 AT89C51芯片引

13、脚及特点AT89S51芯片的引脚结构如图4所示:345678厂 910111213141516171819201P1.0VCCPL1POOP1.2P0.1P1.3P0.2P1.4P1 5P0.4P1.6P0.5P1.7P0.6RESAPDP0.7P3.0RXDEA-TODP3.1TXDALETROGP3.2 INTOPSENP3.3.NfTP2.7P2.6P3.5/TIP2,5P3.6WRP2.4P3.7.TOP2.3XTALlP2,2XTAL2P2.1GNDP2.0STCS9C?!393373635别3332j302726252423222140图4 AT89C51芯片的引脚结构图(1)功能

14、特性概括:AT89C51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes 的随机存取数据存储器(RAM )、32个外部双向输入/输出(I/O ) 口、5个中断优先级2 层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、 看门狗(WDT)电路、片内振荡器及时钟电路。此外, AT89C51可降至0Hz的静态逻辑 操作,并支持两种软件可选的节电工作模式。空闲模式下,CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。掉电模式冻结振荡器而保存 RAM的数据, 停止芯片其它功能直至外中断激活或硬件复位。同时

15、该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。(2)管脚说明:VCC :供电电压。GND :接地。P0 口: P0 口为一个8位漏级开路双向I/O 口,也即地址/数据总线复用口。作为输出 口用时,能驱动8个TTL逻辑门电路。对端口写“ 1”时,被定义为高阻输入在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要 求外接上拉电阻。P1 口 :P1 口是一个带内部上拉电阻的 8位双向I/O 口 ,P1 口的输出缓冲级可驱动(吸收

16、 或输出电流)4个TTL逻辑门电路。对端口写“T ,通过内部的上拉电阻把端口拉到高电平, 此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会 输出一个电流(I)。在Flash编程和程序校验期间,P1接收低8位地址。部分端口还有第二功能,如表4所示表4 P1 口部分引脚第二功能端口引脚第二功能P1.5MOSI(用于ISP编程)P1.6MISO(用于ISP编程)P1.7SCK (用于ISP编程)P2 口 :P2 口是一个带有内部上拉电阻的8位双向I/O 口 , P2 口的输出缓冲级可驱动(吸 收或输出电流)4个TTL逻辑门电路。对端口写“ 1”,通过内部的上拉电阻把端

17、口拉到高电 平此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时 会输出一个电流(I il )。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVXDPTR指令) 时,P2 口送出高8位地址数据。在访问8位地址的外部数据寄存器(例如执行MOVXRi 指令)时,P2 口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期 间不改变。在Flash编程或校验时,P2亦接收高位地址和其它控制信号。P3 口 : P3 口是一个带有内部上拉电阻的双向 8位I/O 口 , P3 口的输出缓冲级可驱动(吸 收或输出电流)4个TTL逻辑门电路。对

18、P3 口写“ 1”时,它们被内部的上拉电阻拉高并可 作为输入端口。作输入口使用时,被外部信号拉低的P3 口将用上拉电阻输出电流(I)。P3 口除了作为一般的I/O 口线外,更重要的用途是它的第二功能,如表5所示: P3 口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。表5 P3 口引脚第二功能端口引脚第二功能P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2INT 0(外中断0)P3.3INT 1(外中断1)P3.4T0(定时/计数器0)P3.5T1(定时/计数器1)P3.6WR (外部数据存储器写选通)P3.7RD (外部数据存储器读选通)RST:复位输入。当振荡

19、器工作时,RST引脚出现两个机器周期以上的高电平时间将 使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH) 可打开或关闭该功能。DISRTO位缺省为RESET输出高电平打开状态。ALE/ PROG :当访问外部存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁 存地址的低8位字节。即使不访问外部寄存器,ALE仍以时钟振荡频率的1/6输出固定的正 脉冲信号,因此它可对外输出时钟或用于定时目的。值得注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲 (PROG)o如有必要,可通过对特殊功

20、能寄存器(SFR)区中的8EH单元的DO位置位,可禁止ALE 操作。该位置位后,只要一条MOVX和MOVC指令才会激活ALE。此外,该引脚会被微弱 拉高,单片机执行外部程序时,应设置ALE无效。PSEN :程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外 部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外 部数据存储器时,没有两次有效的PSEN信号。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH), EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA

21、 端状态。如EA端保持高电平(接VCC端),CPU则执行内部程序存储器中的指令。Flash存储器编程期间,该引脚用于施加 +12V编程电压(VPP)。XTAL1 :反向振荡放大器的输入及内部时钟工作电路的输入端。XTAL2 :反向振荡放大器器的输出端。(3)晶体振荡器特性:AT89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。这个反向放大器与作为反馈元件的片外石英晶体或 陶瓷谐振器一起构成自激振荡器。外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电 路。对外接电容C1、C2虽然没有十分严格的要求

22、,但电容容量的大小会轻微影响振荡频率 的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。如果使用石英晶体,电容应该使用 30pF_10pF。还可以使用外部时钟。这种情况下,外部时钟脉冲接XTAL1端,即内部时钟发生器的输 入端,XTAL2应悬空。由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以外部时钟信号 的占空比没有特殊要求,但最小高电平持续时间和最大低电平持续时间应符合产品技术条 件的要求。2.2.2 AT89C51的主要性能参数:(1)与MCS-51产品指令系统完全兼容。(2)4K字节在系统可编程(ISP)Flash闪速存储器。(3)1000次擦写周期。(4)4.0

23、 5.5V的工作电压范围。(5)全静态工作模式:0Hz-33Hz。(6)三级程序加密。(7)128x8字节的内部RAM。(8)32个双向可编程I/O 口线。(9)2个16位可编程定时/计数器。(10)6个中断源。(11)全双工UART串行通道。(12)低功耗空闲和掉电模式。(13)中断可从空闲模式唤醒系统。(14)看门狗(WDT )及双数据指针。15)掉电标识和快速编程特性。(16)灵活的在系统编程(ISP-字节或页写模式)第3章 智能电子钟软硬件电路的设计3.1 时钟电路使用串行接口时钟芯片DS1302设计时钟电路。该设计方案以单片机 AT89S51为主控芯 片,以串行时钟芯片DS1302为

24、核心计时芯片,组成数字时钟电路。该电路不但能准确地计 时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信 息。该设计方案的接口电路如图5所示:21I-GXD图5DS1302接口电路3.2硬件设计该设计的硬件电路由主控部分(单片机AT89C51)、计时部分(实时时钟芯片DS1302)、D1602LCD、电源部分(三端稳压器7805)4个部分组成。各部分之间相互协作,构成一个统一的有机整体,实现数字时钟的功能。各部分的硬件电路设计如下。设计总电路图见附3.2.1 单片机AT89C51外围电路设计单片机AT89S51作为主控芯片,控制整个电路的运行。单片机外围需要一个复位

25、电路, 复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。为 可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分 合过程中引起的抖动而影响复位。该设计采用含有二极管的复位电路,复位电路可以有效 的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时 可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。复位电路的设计图如图 6所示:VCC0ChOKM-“Sm414SR110K图6单片机复位电路图AT89S51具有在系统可编程功能,可以很方便的改写单片机存储器内的程序不需要把 芯片中从工作环境中剥离,把AT89S I

26、SP下载口接入电路,可使电路实现该功能。AT89S51 需要接入一个普通12MHz晶振,为其提供稳定的时钟脉冲。该设计中有6个八段数码显示管LED,所以,在单片机AT89S51外围需要接入6个三极管来驱动数码显示管。此外, 单片机外围需要接入3个开关,用来调整时钟。单片机外围电路的设计图如图7示:3.2.2 DS1302 与单片机的接口设计时钟芯片DS1302与单片机AT89S51的接口是由3条线来完成的,单片机 AT89S51 的P1.0与时钟芯片的数据传输端相连,P1.1用来作为DS1302输入时钟SCLK控制端,P1.2 控制DS1302的复位输入端。DS1302接标准32.768KHZ

27、石英晶振。DS1302与单片机的接 口电路如图8所示:vcc|*DS1302 与 AT89C51 连接图EC1R3円円plAT89S53.2.4电源设计VCCl VCC2XSCLKX2I/OGNDRSTDS 202时钟芯片DS1302有很宽的工作电压范围,其工作电压为 2.55.5V。单片机AT89S51 的工作电压范围相对较窄,为4.05.5V,所以本设计中,给电路接入三端稳压器 7805,禾U 用它的稳压功能给电路提供稳定的+5V电压,使电路的工作保持很高的可靠性。在电路中 接入一个发光二极管作为指示灯,可以很方便地指示电源与电路是否接通。该设计的电源 部分如图10所示:QiJ1尹2+刃|

28、 VinVoul+ ci个m1000*1041000104104图10电源电路图IK325按键开关去抖设计前誥畀动定岸沿再动b) 捷动按键开关在电路中的连接如图所示。 按键未按下时,A点电位为高电平5V;按键按下 时,A点电位为低电平。A点电位就用于向CPU传递按键的开关状态。但是由于按键的结 构为机械弹性开关,在按键按下和断开时,触点在闭合和断开瞬间还会接触不稳定,引起 A点电平不稳定,如图11所示,键盘的抖动时间一般为 510ms,抖动现象会引起CPU 对一次键操作进行多次处理,从而可能产生错误。因此必须设法消除抖动的不良后果。+5V RPo I I 才%图11键操作和键抖动消除抖动的不良

29、后果的方法有硬、软件两种。为了节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而是用软 件消除抖动的方法。根据抖动特性,在第一次检测到按键按下后,执行一段延时510ms让前延抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。当检测到按键释放后,也要给 510ms的延时,待后延抖动消失后才转入该键处理程序。3.3软件设计电子时钟的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计 数,二是利用按键进行时间的调整, 三是单片机中读取DS1302中的数据驱动LED数码管 显示时间。STC89C52RC单片机主要I/O 口的分配:P10、P11、

30、P12分别接时钟芯片的 SCLK、 I/O、RST引脚,P13、P14接两个独立按键。图12时间调整程序流程图4.1总原理图第4章protues仿真与调试利用keil软件编写源程序。在protues中画好其电路图如下图14所示:C1I1U1G 1Q18丄 C6-C2卜10kC3DIlOuC7|xivcci VCC2JystalrstSCLK X21/D&S13027J76a6RP1St1D*XTAL1PO.CWAM ro.1/A01A A Lirwru.O/jR.KJnjIP2.0/P2.2M10PS EHP2.3JA11ALEP2.4I加2FTP2.5dfAl3EJM1IP2.&/A14P2

31、.7/A15尸T .P1.1rj.Q/lMAlJrJ.l/| AUP1.2P3 SHINTOP1.3rj.JrllN 11Pl.4F1.SP34/T0F3.4/T1r 1 it?P1.7rjiWllVnP3.7/RF1213AT购国XICRYSTAL图13 电路板的原理图4.2电路板的仿真Time: 17-03-37Date? 29-12-14DSliO? Clock-U1回XTAL1XTAL2PO.O/ADOR0.1/AD1R0.2/AD2R0.3/AD3PQ.4/AD4P0.5/AD5PQ.EWADBFiO.7/AD7LMD1BL2914/12/29 Meek2趕善m SZSS1SRSTF

32、SEN ALE EA亦3B范22RP1XI VCC1VCC2824B57JSe8fSTALR$T SCLK X2 1/D門.0P1.1P1J:P1.3P1.4P1j5P-1.0PI.7F2.Q/A0P2.1WP2.2/A10P2.3/A11P2.4/A12P2.5/A13P2JB/A.14F27/A15P3.CMRXD P3.1/IXD P3.2/HT0 P3.3/IMT1F34T0P3.5TT1 PG.BjWR- P3.7/RLTZ1茁二.2728 10211*13個追ATS0C5-1RES PACK-6源程序#include #include #include lcd.h#include

33、1302.h#define uint unsigned int #define uchar unsigned charsbit Set = P3A0;sbit Up =卩3人3;sbit Down = P3A6;sbit out = P3A1;/模式切换键/加法按钮/减法按钮/立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag; void show_time();/液晶显示程序void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+) for(j=0;j0;de

34、lay-) for(i=0;i0x59)up_flag=1; / 数据调整后更新标志 /超过 59 秒 ,清零temp=0;break;case 2:temp=temp+1;/分数加if(temp0x59)temp=0; break;case 3:temp=Read1302(DS1302_MINUTE);1up_flag=1;/超过 59 分,清零/读取分数temp=temp+1;if(temp0x23)temp=0; break;case 4:temp=Read1302(DS1302_HOUR);/小时数加 1up_flag=1;/超过 23小时 ,清零/读取小时数temp=temp+1;/

35、星期数加temp=Read1302(DS1302_WEEK);1/读取星期数up_flag=1;if(temp0x7)temp=1; break;case 5:temp=Read1302(DS1302_DAY);/读取日数temp=temp+1;/日数加 1up_flag=1;if(temp0x31)temp=1; break;case 6:temp=Read1302(DS1302_MONTH); / 读取月数temp=temp+1;/月数加 1up_flag=1;if(temp0x12)temp=1;break;case 7: temp=Read1302(DS1302_YEAR); / 读取

36、年数 temp=temp+1; /年数加 1up_flag=1;if(temp0x85)temp=0;break; default:break;while(Up=0);/void Downkey()/ 降序按键Down=1;if(Down=0)mdelay(8); switch(count)case 1: temp=Read1302(DS1302_SECOND); / 读取秒数 temp=temp-1;/ 秒数减 1down_flag=1; /数据调整后更新标志 if(temp=0x7f)/小于 0 秒,返回 59 秒temp=0x59;break;case 2: temp=Read1302(

37、DS1302_MINUTE); / 读取分数 temp=temp-1; /分数减 1down_flag=1;if(temp=-1)temp=0x59;/小于 0 秒 ,返回 59 秒break;case 3: temp=Read1302(DS1302_HOUR); / 读取小时数 temp=temp-1; /小时数减 1down_flag=1;if(temp=-1) temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); / 读取星期数 temp=temp-1; /星期数减 1down_flag=1;if(temp=0)temp=0x7;break

38、;case 5:temp=Read1302(DS1302_DAY); / 读取日数temp=temp-1; /日数减 1 down_flag=1;if(temp=0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); / 读取月数temp=temp-1; /月数减 1 down_flag=1;if(temp=0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); / 读取年数temp=temp-1; /年数减 1 down_flag=1;if(temp=-1)temp=0x85;break; defa

39、ult:break;while(Down=0);void Setkey()/ 模式选择按键Set=1;if(Set=0) mdelay(8);count=count+1; /Setkey 按一次 ,count 就加 1 done=1;/进入调整模式while(Set=0);void keydone()/ 按键功能执行 uchar Second;if(flag=0)/关闭时钟 ,停止计时 Write1302(0x8e,0x00); / 写入允许 temp=Read1302(0x80); Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); / 禁止写入f

40、lag=1;Setkey();/扫描模式切换按键switch(count)case 1:do /count=1, 调整秒outkey();/扫描跳出按钮Upkey();/扫描加按钮Downkey();/扫描减按钮if(up_flag=1|down_flag=1) / 数据更新,重新写入新的数据 Write1302(0x8e,0x00); / 写入允许 Write1302(0x80,temp|0x80); / 写入新的秒数 Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0; hide_sec+;/位闪计数if(hide_sec3)hide_se

41、c=0; show_time(); /液晶显示数据 while(count=2);break;case 2:do /count=2, 调整分 hide_sec=0; outkey(); Upkey(); Downkey(); if(temp0x60) temp=0;if(up_flag=1|down_flag=1)Write1302(0x8e,0x00); / 写入允许Write1302(0x82,temp); / 写入新的分数Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0;hide_min+;if(hide_min3)hide_min=0

42、;show_time();while(count=3);break;case 3:do/count=3, 调整小时hide_min=0;outkey();Upkey();Downkey();if(up_flag=1|down_flag=1)Write1302(0x8e,0x00); / 写入允许Write1302(0x84,temp); / 写入新的小时数Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0;hide_hour+;if(hide_hour3)hide_hour=0;show_time();while(count=4);break;

43、case 4:do/count=4, 调整星期hide_hour=0;outkey();Upkey();Downkey();if(up_flag=1|down_flag=1)Write1302(0x8e,0x00); / 写入允许Write1302(0x8a,temp); / 写入新的星期数Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0;hide_week+;if(hide_week3)hide_week=0;show_time();while(count=5);break;case 5:do/count=5, 调整日hide_week=0

44、;outkey();Upkey();Downkey(); if(up_flag=1|down_flag=1) Write1302(0x8e,0x00); / 写入允许Write1302(0x86,temp); / 写入新的日数Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0;hide_day+;if(hide_day3)hide_day=0;show_time();while(count=6);break;case 6:do/count=6, 调整月hide_day=0;outkey();Upkey();Downkey(); if(up_fl

45、ag=1|down_flag=1) Write1302(0x8e,0x00); / 写入允许Write1302(0x88,temp); / 写入新的月数Write1302(0x8e,0x80); / 禁止写入 up_flag=0;down_flag=0;hide_month+;if(hide_month3)hide_month=0;show_time();while(count=7);break;case 7:do/count=7, 调整年hide_month=0;outkey();Upkey();Downkey();if(up_flag=1|down_flag=1)Write1302(0x8

46、e,0x00); / 写入允许Write1302(0x8c,temp); / 写入新的年数Write1302(0x8e,0x80); / 禁止写入up_flag=0;down_flag=0;hide_year+;if(hide_year3)hide_year=0;show_time();while(count=8);break;case 8: count=0;hide_year=0; /count8, 跳出调整模式 ,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); / 写入允许Write1302(0x80,Second&

47、0x7f);Write1302(0x8E,0x80);/ 禁止写入done=0;break; /count=7, 开启中断 ,标志位置 0 并退出default:break;void show_time()/ 液晶显示程序DS1302_GetTime(&CurrentTime); /获取时钟芯片的时间数据TimeToStr(&CurrentTime);/ 时间数据转换液晶字符DateToStr(&CurrentTime);/ 日期数据转换液晶字符GotoXY(0,1);Print(CurrentTime.TimeString); / 显示时间GotoXY(0,0);Print(CurrentTime.DateString); / 显示日期GotoXY(15,0);Print(week_value);/显示星期GotoXY(1

温馨提示

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

评论

0/150

提交评论