您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页基于DS1302数字时钟电路的设计 论文

基于DS1302数字时钟电路的设计 论文

来源:好走旅游网
基于DS1302数字时钟电路的设计

1 引 言

从古代的滴漏更鼓到近代的机械钟,从电子表到目前的数字时钟,为了准确的测量和记录时间,人们一直在努力改进着计时工具。钟表的数字化,大力推动了计时的精确性和可靠性。在单片机构成的装置中,实时时钟是必不可少的部件。目前常用的实时时钟,很多采用单片机的中断服务来实现,这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且某些测控系统可能不允许;有的则使用并行接口的时钟芯片,如MC146818、DS12887等,它们虽然能满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂,占用地址、数据总线多,芯片体积大,占用空间多,给其它设计带来诸多不便。本设计选取串行接口时钟芯片DS1302与单片机同步通信构成数字时钟电路。其简单的三线接口能为单片机节省大量资源,DS1302的后背电源及对后背电源进行涓细电流充电的能力保证电路断电后仍能保存时间和数据信息等。这些优点解决了目前常用的实时时钟所无法解决的问题。该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高要求的场合,具有很高的使用价值。

1.1 多功能数字钟的起源

1350年6月6日意大利人乔万尼•德•党笛制造了世界上第一台结构简单的机械打点

多功能数字钟。1657年,荷兰人惠更斯首先把重力摆引入机械钟,从而创立了摆钟。

到了20世纪,随着电子工业的迅速发展,电池驱动钟、交流电钟、电机械表、指针式石英电子钟表、数字显示式石英钟表相继问世,多功能数字钟的日差已小于0.5秒。特别是原子钟的出现,它是原子的振动来控制,是目前世界上最精确的钟,即使经过100万年,其偏差也不会超过1秒钟。

多功能数字钟最早起源于欧洲中世纪的教堂,是完全机械式结构,动力使用重锤,打点钟声完全使用人工撞击铸钟,因此当时一个多功能数字钟工程在建筑和机械结构方面是相当复杂的。进入电子时代后,电子多功能数字钟也相应出现。我国电子多功能数字钟行业从80年代起逐渐成长壮大起来,目前在技术及应用水平上已经达到世界同类水平。

1.2 国内外研究现状、发展动态

随着人类科技文明的发展,人们对于时钟的要求在不断地提高。时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现更多其它的功能。高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。

1

核心芯片简介

1.3 多种多样实现多功能数字钟的技术

数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,已得到广泛的使用。数字钟的设计方法有许多种,例如,可用中小规模集成电路组成电子钟;也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟;还可以利用单片机来实现电子钟等等。这些方法都各有其特点

1.4产品领域下面将主要的性能指标作一综合

实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力

31 8 位暂存数据存储RAM

串行I/O 口方式使得管脚数量最少 宽范围工作电压2.0 5.5V 工作电流2.0V 时,小于300nA

读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式 8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配 简单3 线接口 与TTL 兼容Vcc=5V

可选工业级温度范围-40 +85 与DS1202 兼容

在DS1202 基础上增加的特性 对Vcc1 有可选的涓流充电能力 双电源管用于主电源和备份电源供应 备份电源管脚可由电池或大容量电容输入

2

基于DS1302数字时钟电路的设计

2 核心芯片简介

2.1 DS1302简介

DS1302

[1]

是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,

它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。时钟可工作在24小时格式或12小时(AM/PM)格式。 DS1302与单片机的接口使用同步串行通信,仅用3条线与之相连接。可采用一次传送一个字节或突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。 2.1.1 DS1302引脚功能与内部结构

[2]

DS1302的引脚功能如表1所示,外形及内部结构如图1所示

引脚号 1 2、3 4 5 6 7 8 引脚名称 VCC2 X1、X2 GND RST I/O SCLK VCC1 功能 :

主电源 振荡源,外接32768Hz晶振 地线 复位/片选线 串行数据输入/输出端(双向) 串行时钟输入端 后备电源 表1 DS1302引脚功能表

3

核心芯片简介

图1 DS1302管脚图及内部结构图

2.1.2 DS1302的控制字

DS1302的控制字节如图2所示:

7 6 5 4 3 2 1 0

RAM RAM A4 CK 1 A3 A2 A1 A0 K 图2 DS1302控制字节的含义

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 2.1.3 DS1302的复位引脚

4

基于DS1302数字时钟电路的设计

通过把RST输入驱动置高电平来启动所有的数据传送。 RST输入有两种功能:首先,

RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供了终止单字节

或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中置RST为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。 2.1.4 DS1302的数据输入输出

在控制指令字输入后的下一个SCLK时钟的上升沿时数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位至高位7,数据读写时序如图3所示:

SCLKRST0I/O1234567014567R/WA0A1A2A3A4R/C1DATA I/O BYTE1DATA I/O BYTE2图3 数据读写时序

2.1.5 DS1302的寄存器

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见表2。

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

5

核心芯片简介

寄存器名 命令字 写操作 读操作 81H 83H 85H 87H 89H 8BH 8DH 取值范围 00--59 00--59 各位内容 7 CH 0 0 0 0 0 6 5 10SEC 10MIN 10 HR 4 3 2 SEC MIN HR DATE MONTH 0 DAY YEAR 1 0 秒寄存器 80H 分寄存器 时寄存器 日寄存器 月寄存器 周寄存器 年寄存器 82H 84H 86H 88H 8AH 8CH 01-12或00-23 12/24 01-28,29,30,31 01--12 01--07 00--99 0 0 0 10DATE 0 0 10M 0 10YEAR 表2 DS1302的日历、时钟寄存器及其控制字

2.1.6 DS1302 涓流充电时钟保持芯片的原理与应用

摘要本文概括介绍了DS1302 时钟芯片的特点和基本组成通过实例详细说明了有关功能的应用

软件关于 DS1302 各寄存器的详细位控功能请参考DALLAS 达拉斯公司的相应产品资料 概述

DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简

单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天

数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之

间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK

串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很

低保持数据和时钟信息时功率小于1mW

DS1302 是由DS1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1 为可

编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等

2.1.7 DS1302 与微控制器的接口软件及功能应用举例

下面首先给出基本的接口软件然后举例说明各种功能的应用 1 写保护寄存器操作

当写保护寄存器的最高位为0 时允许数据写入寄存器写保护寄存器可以通过命令字节8E 8F 来

规定禁止写入/读出写保护位不能在多字节传送模式下写入

6

基于DS1302数字时钟电路的设计

Write_Enable:

MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#00h 数据内容为0 写入允许

ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处

当写保护寄存器的最高位为1 时禁止数据写入寄存器 Write_Disable:

MOV Command,#8Eh ;命令字节为8E MOV ByteCnt,#1 ;单字节传送模式 MOV R0,#XmtDat 数据地址覆给R0

MOV XmtDat,#80h 数据内容为80h 禁止写入 ACALL Send_Byte 调用写入数据子程序 RET 返回调用本子程序处

以上程序调用了基本数据发送(Send_Byte)模块及一些内存单元定义,

2.2 AT89S51简介

AT89S51

[3]

美国ATMEL公司生产的低

功耗,高性能CMOS 8位单片机,片内含4K Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元。单片机AT89S51强大的功能可为许多嵌入式控制应用系统提供高性价比的解决方案。

2.2.1 AT89S51芯片的引脚及特点 图4 AT89S51引脚图

AT89S51芯片的引脚结构如图4所示: (1)功能特性概括:

AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2

7

核心芯片简介

层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及时钟电路。此外,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲模式下,CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。 (2)管脚说明:

VCC:供电电压。 GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,也即地址/数据总线复用口。作为输出口用时,能驱动8个TTL逻辑门电路。对端口写“1”时,被定义为高阻输入。

在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。

在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。

P1口:P1口是一个带内部上拉电阻的8位双向I/O口,P1口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

在Flash编程和程序校验期间,P1接收低8位地址。部分端口还有第二功能,如表3所示:

端口引脚 P1.5 P1.6 P1.7 第二功能 MOSI(用于ISP编程) MISO(用于ISP编程) SCK (用于ISP编程) 表3 P1口部分引脚第二功能

P2口:P2口是一个带有内部上拉电阻的8位双向I/O口, P2口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

8

基于DS1302数字时钟电路的设计

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据寄存器(例如执行MOVX@Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。

在Flash编程或校验时,P2亦接收高位地址和其它控制信号。

P3口: P3口是一个带有内部上拉电阻的双向8位I/O口, P3口的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写“1”时,它们被内部的上拉电阻拉高并可作为输入端口。作输入口使用时,被外部信号拉低的P3口将用上拉电阻输出电流(IIL)。

P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如表4所示: P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。

端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD (串行输入口) TXD (串行输出口) INT0 (外中断0) INT1 (外中断1) T0 (定时/计数器0) T1 (定时/计数器1) WR (外部数据存储器写选通) RD (外部数据存储器读选通) 表4 P3口引脚第二功能

RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上的高电平时间将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRTO位(地址8EH)可打开或关闭该功能。 DISRTO位缺省为RESET输出高电平打开状态。

ALE/PROG:当访问外部存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部寄存器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。值得注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。

9

核心芯片简介

如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只要一条MOVX和MOVC指令才会激活ALE。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

程序存储允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外PSEN:

部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器时,没有两次有效的PSEN信号。

EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需要注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端保持高电平(接VCC端),CPU则执行内部程序存储器中的指令。 Flash存储器编程期间,该引脚用于施加+12V编程电压(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入端。 XTAL2:反向振荡放大器器的输出端。 (3)晶体振荡器特性:

AT89S51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。这个反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。

外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。如果使用石英晶体,电容应该使用30pF10pF。

还可以使用外部时钟。这种情况下,外部时钟脉冲接XTAL1端,即内部时钟发生器的输入端, XTAL2应悬空。

由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大低电平持续时间应符合产品技术条件的要求。

2.2.2 AT89S51的主要性能参数: (1)与MCS-51产品指令系统完全兼容。

(2)4K字节在系统可编程(ISP)Flash闪速存储器。 (3)1000次擦写周期。

(4)4.0—5.5V的工作电压范围。

10

基于DS1302数字时钟电路的设计

(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-字节或页写模式)。 2.2.3 AT89S51的新功能:

AT89S51兼容标准MCS-51指令系统及AT89C51引脚结构,它相对于AT89C51增加的新功能包括:

(1)ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离。是一个强大易用的功能。

(2) 最高工作频率为33MHz,AT89C51的极限工作频率是24M,所以AT89S51具有更高工作频率,从而具有了更快的计算速度。 (3)具有双工UART串行通道。

(4)内部集成看门狗计时器,不再需要像AT89C51那样外接看门狗计时器单元电路。 (5)双数据指示器。 (6)电源关闭标识。

(7)全新的加密算法,这使得对于AT89S51的解密变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。

(8) 兼容性方面:向下完全兼容51全部字系列产品。比如8051、AT89C51等早期MCS-51产品。

11

核心芯片简介

3 方案设计与论证

方案一:使用并行接口时钟芯片DS12887设计时钟电路。该设计方案用AT89S51主控,利用并行时钟芯片DS12887为核心计时芯片,组成数字时钟电路。该电路能够准确计时,还附加许多其它功能,在掉电时能保存用户设置参数和故障状态参数等重要参数。设计电路图5如下:

图5 DS12887与CPU接口电路

该设计虽然能完成所要求的任务,综合性能也较好,但其并行接口方式占用大量接口资源,给其它设计带来诸多不便。

方案二:使用串行接口时钟芯片DS1302设计时钟电路。该设计方案以单片机AT89S51为主控芯片,以串行时钟芯片DS1302为核心计时芯片,组成数字时钟电路。该电路不但能准确地计时、附加其它功能,而且,其三线接口可以节省接口资源,在断电后不丢失时间和数据信息。该设计

12

基于DS1302数字时钟电路的设计

方案的接口电路如图6所示:

图6 DS1302与CPU接口

通过以上两种设计方案的比较,我们可以看到,设计方案二接口简单,计时可靠,综合性能良好。所以选用第二种设计方案。

13

软硬件设计

4 软硬件设计

4.1 硬件电路设计

该设计的硬件电路由主控部分(单片机AT89S51)、计时部分(实时时钟芯片DS1302)、显示部分(八段数码管)、电源部分(三端稳压器7805)4个部分组成。各部分之间相互协作,构成一个统一的有机整体,实现数字时钟的功能。各部分的硬件电路设计如下。设计总电路图见附录一。

4.1.1 单片机AT89S51外围电路设计

单片机AT89S51作为主控芯片,控制整个电路的运行。单片机外围需要一个复位电路,复位电路的功能是:系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。该设计采用含有二极管的复位电路,复位电路可以有效的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。复位电路的设计图如图7示:

图7 单片机复位电路图

AT89S51具有在系统可编程功能,可以很方便的改写单片机存储器内的程序不需要把芯片中从工作环境中剥离,把AT89S ISP下载口接入电路,可使电路实现该功能。AT89S51需要接入一个普通12MHz晶振,为其提供稳定的时钟脉冲。该设计中有6个八段数码显示管LED,所以,在单片机AT89S51外围需要接入6个三极管来驱动数码显示管。此外,单片机外围需要接入3个开关,用来调整时钟。单片机外围电路的设计图如图8示:

14

基于DS1302数字时钟电路的设计

图8 AT89S51外围电路图

4.1.2 DS1302与单片机的接口设计

时钟芯片DS1302与单片机AT89S51的接口是由3条线来完成的,单片机AT89S51的P1.0与时钟芯片的数据传输端相连,P1.1用来作为DS1302输入时钟SCLK控制端,P1.2控制DS1302的复位输入端。DS1302接标准32.768KHz石英晶振。DS1302与单片机的接口电路如图9所示:

图9 DS1302与AT89S51连接图

15

软硬件设计

4.1.3 显示设计

八段数码显示管有两种,一种是共阳数码管,其内部是由八个阳极相连接的发光二极管组成;另一种是共阴数码管,其内部是由八个阴极相连接的发光二极管组成。二者原理不同但功能相同。本设计的时间显示选用6个共阴八段数码管LED,其外形和内部结构如图10所示:

图10 八段共阴数码管LED

4.1.4 电源设计

时钟芯片DS1302有很宽的工作电压范围,其工作电压为2.5~5.5V。单片机AT89S51

的工作电压范围相对较窄,为4.0~5.5V,所以本设计中,给电路接入三端稳压器7805,利用它的稳压功能给电路提供稳定的+5V电压,使电路的工作保持很高的可靠性。在电路中接入一个发光二极管作为指示灯,可以很方便地指示电源与电路是否接通。该设计的电源部分如图11所示:

图11 电源电路图

16

基于DS1302数字时钟电路的设计

4.2 软件实现

单片机AT89S51对时钟芯片DS1302的控制需要通过程序驱动来实现,程序主要完成两个方面的任务:①利用单片机实现对DS1302寄存器的地址定义和控制字的写入,②实现对DS1302的数据读取。

初始化DS1302要求RST为低电平,SCLK为低电平。 RST被设置为高电平就启动了一个数据传送的过程。SCLK的16个方波完成一次数据传送,前8个方波用于输入命令字节,后8个方波用于数据的输出(读DS1302)或数据的输入(写DS1302)。在SCLK的上升沿,I/O线上的数据被送入DS1302;在SCLK的下降沿,DS1302输出数据在I/O线上。写和读各需要一个程序,写DS1302程序流程图如图12①所示,读DS1302程序流程图个子程序及总程序见附录二、三、四。

复位端变高启动一

SCLK发脉冲

够8次吗?

Y 复位端变低 结束 够8次吗? Y 写数据字节一位 SCLK发脉冲 N N 够8次吗? Y 读数据字节一位 SCLK发脉冲 N N SCLK发脉冲 次数据传送工作 写命令字节一位 复位端变高启动一次数据传送工作 写命令字节一位 启动 启动 [4]

如图12②所示。两

够8次吗? Y 复位端变低 结束 ①写DS1302流程图 ②读DS1302流程图

图12 DS1302时间流程图

17

结论

5 结论与心得

数字钟制作过程中遇到的问题

问题一:对于时钟的各个计时单元:时、分、秒,由于单片机内部的寄存器资源有限,在程序设计的开始首先必须得解决由时钟芯片DS1302读得的数据如何保存的问题。

解决办法:由于我使用的编程语言是汇编语言,不能像C语言那样使用一个数组来保存数据。为了能够及时的保存数据,在程序设计的过程中使用DATA指令在单片机的内存空间中开辟出了一些具有固定地址的内存单元来存储相应的数据。在程序中定义的用于保存当前由DS1302读得的数据单元如下: SEC1 DATA 41H ;定义秒显示的十位 SEC0 DATA 40H ;定义秒显示的个位

LINE0 DATA 42H ;定义秒-时分隔符“-” MIN0 DATA 43H ;定义分显示个位 MIN1 DATA 44H ;定义分显示十位

LINE1 DATA 45H ;定义时-分分隔符“-” HOUR0 DATA 46H ;定义时显示个位 HOUR1 DATA 47H ;定义时显示十位

通过以上的方法,在单片机的RAM中开辟了一片用户可直接操作的内存单元,解决例如数据的保存问题。

问题二:焊接好自己刻的板子后,数码管显示跳动不稳定,但时钟没停,但有时走一分钟后就停掉了。

解决方法:将写好的程序下在51开发板上,发现程序运行稳定,没有上述现象的发生。由此首先说明程序没有问题,可能是做的电路板有问题,为了找到问题的根源所在,从开发板上引出了时钟芯片的输出信号接至自己做的电路板,发现电路板能正常工作。由此推断问题的根源出在电路板的时钟芯片模块,经过进一步的排查,发现在时钟芯片在没有接地的情况下竟然能够正常工作。由此进一步说明问题是出在时钟芯片的接地上。

为了能够进一步寻找问题根源,我们将自己刻的电路板的地线接至示波器上观察。结果证明了我们的推断完全正确,为了最大程度的降低干扰,我们直接对DS1302单独接地,并且对数码管驱动芯片74HC573等需较大电流的芯片单独接电源,同时划断电路板中对74HC573等供电的电源线路以进一步降低电源带来的干扰。

问题总结:由于我们是第一次做PCB板,在布局的时候根本没有考虑到布线的不合理会带来的众多干扰的问题,而且布线也全部由电脑自动布线完成,这样使得电路滋生出大量的寄生电容以及其他的干扰。同样的程序在开发板上运行很稳定,在我们自己刻的PCB板上刚开始很不稳定进一步告诉我们,在以后绘制PCB板的过程中需要周密的考虑到布局的合理性以及电路的干扰问题。 问题三:在程序设计完成后,在开发板和自己刻的PCB板上时发现再有按键按下的情况下,数码管所显示时间有闪动。

解决方法:因为单片机是一个顺序执行程序微机,不像CPLD或FPGA等具有并行处理数据的特点,CPU在当前时间只能处理一件事。在开始我以为产生这个问题的原因是我设的防抖延时间太长了(我的防抖延时设置为10ms)。当我进一步减小防抖延时的时间时情况还是没有好转,由于单片机的软件防抖延时最佳时间段在5ms~10ms,太大或者太小都不利于软件防抖。

18

基于DS1302数字时钟电路的设计

通过对电平触发和边沿触发两种中断触发方式的比较,发现在按键时数码管显示闪动的原因是:起初时,中断触发方式我选的是电平触发方式。在按键按下时可能由于按键性能不太好,按键稍稍的抖动使得在软件防抖后依然不太稳定,单片机在此检测到中断发生的有效电平,从而再次发生中断,导致在有按键按下时单片连续处理按键中断,从而产生数码管在有按键按下的情况下出现闪动的问题。在将按键的中断方式由电平触发模式改为边沿触发后,数码管再有按键按下的情况下闪动的问题得到了解决。

问题四:蜂鸣器在没有闹铃发生时没有声音,在闹铃响完以后还回有比较小的嘟嘟声。 可能原因:理想状态下在闹铃响完后驱动蜂鸣器的三极管截止,蜂鸣器上没有电流流过,蜂鸣器出在不发声状态。闹铃响完后蜂鸣器蜂鸣器仍然有很小的嘟嘟声,说明此时有干扰脉冲通过蜂鸣器。为了进一步减小蜂鸣器的嘟嘟声。在蜂鸣器两端接入300PF的电容后声音有所减小但没有消除。但干扰的来源尚不清楚,可能是来自电源地的干扰。 问题五:T2定时器在汇编编程的情况下如何使用。

可能原因:在C语言编程时,只需要包含头文件 #include,所有的52单片机所用到的端口,寄存器,定时器等资源均已事先定义好了。在汇编编程的过程中我模仿C语言的模式首先定义在使用T2定时器,但一直出现错误。如何在汇编编程的情况下如何使用还未解决。

如何利用软件减小的计时误差

此次所设计的数字钟,总的来看计时的误差来源主要由中断响应延迟引起的误差(不使用时钟芯片的情况下)。

如下对误差来源进行详细的分析。不考虑晶振等固件的误差, 则系统机器周期可以由公式准确算出, 因而系统误差不可能来自于硬件, 而应该主要来自于软件方面。 系统每次调用定时中断程序的过程中, 硬件并没有自动进入下一个定时周期, 而是在调用中断程序以后由软件置数来实现的。 而在程序调用过程中,堆栈建立、参数传递等都是需要耗时,而这些时间都被无形中加到了定时长度中去。所以,使得每次定时长度都大于理论推导值,在宏观上表现出来就是系统比理论计算出来的结果变慢了。另外,由于系统每次调用中断处理程序所执行的操作都是相同的,也就是说,系统每次定时的时间误差应该是一个常数。

MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。

如果设置定时器中断为中断高优先级,外部中断位低优先级,则中断过程中产生的中断延时如下图所示:

A:有按键按下的情况下发生定时中断

19

结论

B:仅有时钟中断的情况CPU响应定时中断

设置定时器T1工作在定时方式1为,晶振频率为12MHz 。 通过5法来解决由中断引起的延时误差问题。 方法1:

在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为65536-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(65536-1000+7)和#HIGH(65536-1000+7)是汇编符号,分别表示65536-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。

......

CLR EA ;禁止所有中断 CLR TR1 ;停止定时器T1

MOV A,# LOW (LOW -1000+7) ;期望数的低位字节 ADD A,TL1 ;进行修正 MOV TL1,A ;重装载低位字节

MOV A,#HIGH(HIGH -1000+7) ;对高位字节处理 ADDC A,TH1 MOV TH1,A

20

基于DS1302数字时钟电路的设计

SETB TR1 ;重启动定时器 SETB EA ;重开中断 ......

适用范围:此方法适用于各种原因造成的定时误差的情况,为通用方法。 方法2

假如定时周期为1ms,通常定时器重装载值为0FC18H,中断子程序如下:

MOV A,#LOW(LOW -1000+4) ;期望数的低位字节 ADD A,TL1 MOV TL1,A

MOV A,#HIGH(HIGH -1000+4) ;对高位字节处理 ADDC A,TH1 MOV TH1,A

DEC TL1 ;恢复提前了的2个机器周期 ......

这种方法中不停止定时器计数过程,若在执行指令ADDC A,TH1 或MOV TH1,A时,

恰好产生TL1溢出向TH1进位的情况,则TH1的值就不对了,会产生更大的误差。为此,程序段开头为重装载值加4,若有溢出进位,则可提前发生,其中2个机器周期是考虑到为TL1重装载占用的时间。 方法3

假如定时周期为10ms,通常定时器重装载值为0D8F0H,中断子程序如下:

ORL TL1,#0F0H

21

结论

MOV TH1,#0D8H ......

这里用ORL TL1,#0F0H代替MOV TL1,#0F0H 可提高定时精度。此方法只适用于重装

载值低位字节的低4位为零,且中断响应的延迟时间小于16个机器周期的情况。类似的定时器重装载值有0FFF0H,0FFE0H等。

方法4:

假如定时周期不确定,只知道定时器重装载值存放在寄存器R3、R2中,中断子程序如下:

MOV A,#05H ;3个机器周期装载TL1,2个周期提前 ADD A,TL1 ADD A,R2 MOV TL1,A

MOV A,R3 ;处理高位字节 ADDC A,TH1 MOV TH1,A

DEC TL1 ;恢复提前了的2个机器周期 ......

适用范围:此法适用于定时周期不确定的情况,其它同方法3。

方法5:当定时中断发生的位置可预知时,通常出现在主程序的AJMP $ (或SJMP $)等待指令处,中断延迟时间为3个或4个机器周期。取固定值4可简化补偿程序。以定时周期1ms为例,中断子程序如下:

ORG 001BH

MOV TL1,#LOW(LOW -1000+4) MOV TH1,#HIGH(HIGH -1000+4) ......

适用范围:此方法适用于定时中断总发生在同一条指令位置,且无其它中断源的情况。 上述5种方法误差均不超过1个机器周期,其中方法1、3、4较为通用,适用于任何情况,但程序较长;方法2、5简单,但必须注意满足对应条件,才能使用。

总结

本设计利用单片机AT89S51控制串行实时时钟芯片DS1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片DS1302带有后备电池,具备对后背电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟占用单片机资源多以及计时不可靠等缺点。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的精确性和可靠性有较高要求的场合,提供较好的实时时钟。但是,由于DS1302易受环境影响,会使该电路出现时钟精度不高、时钟混乱[5]等问题,还有待继续研究和改进。

22

基于DS1302数字时钟电路的设计

6 致 谢

本论文设计在王维平明老师的悉心指导和严格要求下已完成,从课题选择到具体的写作过程,无不凝聚着王维平老师的心血和汗水,在我的毕业论文写作期间,王维平老师为我提供了种种专业知识上的指导和一些富于创造性的建议,没有这样的帮助和关怀,我不会这么顺利的完成毕业论文。在此向王维平老师表示深深的感谢和崇高的敬意。 在临近毕业之际,我还要借此机会向在这三年中给予了我帮助和指导的所有老师表示由衷的谢意,感谢他们三年来的辛勤栽培。不积跬步何以至千里,各位任课老师认真负责,在他们的悉心帮助和支持下,我能够很好的掌握和运用专业知识,并在设计中得以体现,顺利完成毕业论文。

同时,在论文写作过程中,我还参考了有关的书籍和论文,在这里一并向有关的作者表示谢意。

我还要感谢同组的各位同学,在毕业设计的这段时间里,你们给了我很多的启发,提出了很多宝贵的意见,对于你们帮助和支持,在此我表示深深地感谢。

23

附录

7 参 考 文 献

[1] 王明顺,赵德平.可涓流充电的串行实时时钟芯片DS1302及应用设计[J].国外电子元

器件,1997,(2)

[2] 高性能、低功耗带RAM实时时钟芯片DS1302.P&S武汉力源电子股份有限公司,1999 [3] ZYMCU AT89S51 Datasheets

[4] 黄明强.DS1302在单片机系统中的应用[J].保定师范专科学校学报,2004,17(2) [5] 赵海兰,朱剑,赵祥伟.DS1302实时显示时间的原理与应用[J].电子技术,2002,(1) [6] 邓红,张越编著.单片机实验与应用设计教程[M].冶金工业出版社,2004,5 [7] 孙雪梅,范久臣.实时时钟芯片在单片机系统中的应用[J].沈阳教育学院学报,

2005,7(2)

[8] 孙安青编著. AT89S51单片机实验及实践教程[M]

24

基于DS1302数字时钟电路的设计

[9] DALLAS SEMICONDUCTOR.DS1302 Trickle Charge Timekeeping Chip [10] ATMEL AT89S51.Atmel Corporation 2001

[11] 盛蒙蒙,葛亦斌等.基于单片机实现多功能数字钟的系统设计[J].硅谷,2009,27(20):67-69.

[12].马丽萍,肖渊.基于Proteus的数字钟设计及仿真[J]. 西安工程大学学报,2009,23(3):59-62.

[13].刘睿劼.基于FPGA的多功能数字钟的设计[J].应用技术与研究,2009,(5):73-75

[14].黄明,黄艳.多功能数字钟电路的设计与制作[J].机械与电子,2009(27):71-72.

[15].邵雯.基于MULTISIM8 的数字钟的设计[J]. 光盘技术,2009(3):46-48 .

[16].毕满清等.电子技术实验与课程设计.北京:机械工业出版社,1995.131~132

[17].谢自美.电子线路设计.实验.测试.华中科技大学出版社,2000.7.

[18].彭容修,刘泉,马建国.数字电子技术基础.武汉理工大学出版社.2006.1

[19].侯伯亨,顾新.VHDI。硬件描述语言与数字电路逻辑设计[M].西安:西安电子科技大学出版社。2001.

[20].李国洪,沈明山.可编程器件EDA技术与实践[M].北京:机械工业出版社,2004.

[21].李景华,杜玉远.可编程逻辑器件与EDA技术[M].沈阳:东北大学出版社,2000 .

[22]刘斌儒;戴勇;基于AVR单片机Mega16的电子时钟设计[J];国外电子元器件;2008年07期

[23]刘建英;基于单片机的时钟设计[J];内蒙古石油化工;2005年01期

25

附录

8 附 录

附录一:设计总电路图:

附录二:写DS1302子程序:

void writeDS1302(uchar dsRamAdr,uchar ds1302data)

26

基于DS1302数字时钟电路的设计

{

uchar i;

TIMERCLK=0; delay(2);

TIMERRST=1; delay(2);

DS1302adr=dsRamAdr; DS1302dat=ds1302data; for(i=0;i<8;i++) {

CY=0;

TIMERCLK=0; CY=ds1302adrBit; TIMERIO=CY; delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1; }

for(i=0;i<8;i++) {

CY=0;

TIMERCLK=0; CY=ds1302datBit; TIMERIO=CY; delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1; }

TIMERRST=0; delay(2);

TIMERRST=0; }

附录三:读DS1302子程序: uchar readDS1302(uchar DS1302Adr) {

uchar i;

TIMERCLK=0; delay(2);

TIMERRST=1; delay(2);

DS1302adr=DS1302Adr; for(i=0;i<8;i++) {

TIMERCLK=0;

27

附录

TIMERIO=ds1302adrBit; delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1; }

TIMERIO=1; for(i=0;i<7;i++) {

TIMERCLK=0;

ds1302datHbit=TIMERIO; delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1; TIMERCLK=0;

ds1302datHbit=TIMERIO; }

TIMERRST=0; delay(2);

TIMERCLK=0; return DS1302dat; }

附录四:软件设计总程序:

#include #include

#define uchar unsigned char //引脚定义

sbit TIMERCLK=P1^0; //DS1302同步串行时钟引脚 sbit TIMERIO=P1^1; //DS1302数据输入输出引脚 sbit TIMERRST=P1^2; //DS1302RST引脚 sbit P2_0=P2^0; sbit P2_1=P2^1; sbit P2_2=P2^2; sbit P2_3=P2^3; sbit P2_4=P2^4; sbit P2_5=P2^5; sbit P2_6=P2^6; sbit P2_7=P2^7; sbit P3_5=P3^5; sbit P3_6=P3^6; sbit P3_7=P3^7;

//sbit SEC_7=SEC^7;

//sbit WDT=P1^3; //看门狗\"喂狗\"引脚

uchar code TABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //#define DIGPORT

28

基于DS1302数字时钟电路的设计

//全局变量声明

uchar bdata DS1302dat; //DS1302读写过程中的命令或数据 sbit ds1302datHbit=DS1302dat^7; //位定义,用于数据写入 sbit ds1302datBit=DS1302dat^0; //位定义,用于数据读出

uchar bdata DS1302adr; //DS1302读写过程中所访问的单元地址 sbit ds1302adrBit=DS1302adr^0; // uchar idata SEC; uchar MIN; uchar HR; uchar DATE; uchar MONTH; uchar DAY; uchar YEAR; uchar disp1; uchar disp2; uchar disp3; uchar disp4; uchar disp5; uchar disp6; uchar disp7; uchar disp8; uchar tiao; uchar tt; uchar flag;

// sbit SEC_7=SEC^7; void delay(uchar time) {

uchar i,j;

for(i=0;ifor(j=0;j// WDT=~WDT; } } }

void writeDS1302(uchar dsRamAdr,uchar ds1302data) {

uchar i;

TIMERCLK=0; delay(2);

TIMERRST=1; delay(2);

29

DS1302adr=dsRamAdr; DS1302dat=ds1302data; for(i=0;i<8;i++) {

CY=0;

TIMERCLK=0; CY=ds1302adrBit; TIMERIO=CY; delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1; }

for(i=0;i<8;i++) {

CY=0;

TIMERCLK=0; CY=ds1302datBit; TIMERIO=CY; delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1; }

TIMERRST=0; delay(2);

TIMERRST=0; }

uchar readDS1302(uchar DS1302Adr) {

uchar i;

TIMERCLK=0; delay(2);

TIMERRST=1; delay(2);

DS1302adr=DS1302Adr; for(i=0;i<8;i++) {

TIMERCLK=0;

TIMERIO=ds1302adrBit; delay(2);

TIMERCLK=1;

DS1302adr=DS1302adr>>1; }

TIMERIO=1; for(i=0;i<7;i++) {

TIMERCLK=0;

附录

30

基于DS1302数字时钟电路的设计

ds1302datHbit=TIMERIO; delay(2);

TIMERCLK=1;

DS1302dat=DS1302dat>>1; TIMERCLK=0;

ds1302datHbit=TIMERIO; }

TIMERRST=0; delay(2);

TIMERCLK=0; return DS1302dat; }

void DS1302Inital(void) {

uchar ds1302st; TIMERCLK=0; TIMERRST=0;

ds1302st=readDS1302(0x0c1); if(ds1302st!=0x55) {

// WDT=~WDT; ;

writeDS1302(0x8e,0x00); //writeDS1302(0x80,0x00); writeDS1302(0x82,0x00); writeDS1302(0x84,0x16); writeDS1302(0x86,0x19); // WDT=~WDT; ;

writeDS1302(0x88,0x09); writeDS1302(0x8a,0x02); writeDS1302(0x8c,0x00); // WDT=~WDT; ;

writeDS1302(0x90,0xa6); writeDS1302(0x0c0,0x55); writeDS1302(0x80,0x00); } }

void readRTC(void) {

MONTH=readDS1302(0x89); DATE=readDS1302(0x87); HR=readDS1302(0x85); MIN=readDS1302(0x83); SEC=readDS1302(0x81);

31

附录

}

void disp(void) { if(MIN==10)writeDS1302(0x82,0x10); if(MIN==26)writeDS1302(0x82,0x20); if(MIN==42)writeDS1302(0x82,0x30); if(MIN==58)writeDS1302(0x82,0x40); if(MIN==74)writeDS1302(0x82,0x50); if(MIN==90)writeDS1302(0x82,0x00); if(HR==10)writeDS1302(0x84,0x10); if(HR==26)writeDS1302(0x84,0x20); if(HR==36)writeDS1302(0x84,0x00); //if(HR==58)writeDS1302(0x82,0x40); //if(HR==74)writeDS1302(0x82,0x50); //if(HR==90)writeDS1302(0x82,0x00); if(DATE==10)writeDS1302(0x86,0x10); if(DATE==26)writeDS1302(0x86,0x20); if(DATE==42)writeDS1302(0x86,0x30); if(DATE==50)writeDS1302(0x86,0x01); //if(DATE==74)writeDS1302(0x82,0x50); //if(DATE==90)writeDS1302(0x82,0x00); disp2=SEC/16; disp1=SEC%16; //if(flag1==0) //if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;} disp4=MIN/16; disp3=MIN%16;//flag1=0; disp6=HR/16; disp5=HR%16; disp8=DATE/16; disp7=DATE%16; P2_0=0; P0=TABLE[disp1]; delay(12); P2_0=1; P2_1=0; P0=TABLE[disp2]; delay(12); P2_1=1; P2_2=0; P0=TABLE[disp3]; delay(12); P2_2=1; P2_3=0; P0=TABLE[disp4];

32

基于DS1302数字时钟电路的设计

delay(12); P2_3=1; P2_4=0; P0=TABLE[disp5]; delay(12); P2_4=1; P2_5=0; P0=TABLE[disp6]; delay(12); P2_5=1; P2_6=0; P0=TABLE[disp7]; delay(12); P2_6=1; P2_7=0; P0=TABLE[disp8]; delay(12); P2_7=1; }

void dispA(void)

{ if(SEC==10||SEC==26||SEC==42||SEC==58||SEC==74){SEC=SEC+6;} //if(SEC==74||SEC==58||SEC==42||SEC==26||SEC==10){SEC=SEC+6;} disp2=SEC/16; disp1=SEC%16; //disp4=MIN/16; //disp3=MIN%16; //disp6=HR/16; //disp5=HR%16; //disp8=DATE/16; //disp7=DATE%16; if(SEC==90)SEC=0; P2_0=0; P0=TABLE[disp1]; delay(12); P2_0=1; P2_1=0; P0=TABLE[disp2]; delay(12); P2_1=1; P2_2=0; P0=TABLE[disp3]; delay(5); P2_2=1; P2_3=0; P0=TABLE[disp4]; delay(5);

33

附录

P2_3=1; P2_4=0; P0=TABLE[disp5]; delay(5); P2_4=1; P2_5=0; P0=TABLE[disp6]; delay(5); P2_5=1; P2_6=0; P0=TABLE[disp7]; delay(5); P2_6=1; P2_7=0; P0=TABLE[disp8]; delay(5); P2_7=1; }

void dispB(void)

{ if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;} //if(MIN==74||MIN==58||MIN==42||MIN==26||MIN==10){MIN=MIN+6;} //disp2=SEC/16; //disp1=SEC%16; disp4=MIN/16; disp3=MIN%16; //disp6=HR/16; //disp5=HR%16; //disp8=DATE/16; //disp7=DATE%16; if(MIN==90)MIN=0; P2_0=0; P0=TABLE[disp1]; delay(5); P2_0=1; P2_1=0; P0=TABLE[disp2]; delay(5); P2_1=1; P2_2=0; P0=TABLE[disp3]; delay(12); P2_2=1; P2_3=0; P0=TABLE[disp4]; delay(12); P2_3=1;

34

基于DS1302数字时钟电路的设计

P2_4=0; P0=TABLE[disp5]; delay(5); P2_4=1; P2_5=0; P0=TABLE[disp6]; delay(5); P2_5=1; P2_6=0; P0=TABLE[disp7]; delay(5); P2_6=1; P2_7=0; P0=TABLE[disp8]; delay(5); P2_7=1; }

void dispC(void) { if(HR==10||HR==26||HR==42||HR==58||HR==74){HR=HR+6;} //if(HR==74||HR==58||HR==42||HR==26||HR==10){HR=HR+6;} //disp2=SEC/16; //disp1=SEC%16; //disp4=MIN/16; //disp3=MIN%16; disp6=HR/16; disp5=HR%16; if(HR==36)HR=0; //disp8=DATE/16; //disp7=DATE%16; P2_0=0; P0=TABLE[disp1]; delay(5); P2_0=1; P2_1=0; P0=TABLE[disp2]; delay(5); P2_1=1; P2_2=0; P0=TABLE[disp3]; delay(5); P2_2=1; P2_3=0; P0=TABLE[disp4]; delay(5); P2_3=1; P2_4=0;

35

附录

P0=TABLE[disp5]; delay(12); P2_4=1; P2_5=0; P0=TABLE[disp6]; delay(12); P2_5=1; P2_6=0; P0=TABLE[disp7]; delay(5); P2_6=1; P2_7=0; P0=TABLE[disp8]; delay(5); P2_7=1; }

void dispD(void) { if(DATE==10||DATE==26||DATE==42||DATE==58||DATE==74){DATE=DATE+6;} //if(DATE==74||DATE==58||DATE==42||DATE==26||DATE==10){DATE=DATE+6;} //disp2=SEC/16; //disp1=SEC%16; //disp4=MIN/16; //disp3=MIN%16; //disp6=HR/16; //disp5=HR%16; disp8=DATE/16; disp7=DATE%16; if(DATE==50)DATE=1; P2_0=0; P0=TABLE[disp1]; delay(5); P2_0=1; P2_1=0; P0=TABLE[disp2]; delay(5); P2_1=1; P2_2=0; P0=TABLE[disp3]; delay(5); P2_2=1; P2_3=0; P0=TABLE[disp4]; delay(5); P2_3=1;

36

基于DS1302数字时钟电路的设计

P2_4=0; P0=TABLE[disp5]; delay(5); P2_4=1; P2_5=0; P0=TABLE[disp6]; delay(5); P2_5=1; P2_6=0; P0=TABLE[disp7]; delay(12); P2_6=1; P2_7=0; P0=TABLE[disp8]; delay(12); P2_7=1; }

//void disp(void) //{

void main(void) {

DS1302Inital(); while(1) { readRTC(); disp(); tt=0; flag=0; tiao=0; // flag1=0; //SEC_7=0; //writeDS1302(0x80,0x00); while(P3_7==0||tt==1){tt=1; //writeDS1302(0x80,0x80);dispA(); if(flag==0) {tiao++;flag=1;} if(tiao==1) {while(P3_7==0);dispA();if(P3_6==0) {while(P3_6==0);writeDS1302(0x80,++SEC);} //if(P3_5==0) {while(P3_5==0);writeDS1302(0x80,--SEC);} if(P3_7==0)flag=0;} if(tiao==2) {while(P3_7==0);dispB();if(P3_6==0) {while(P3_6==0);writeDS1302(0x82,++MIN);} //if(P3_5==0) {while(P3_5==0);writeDS1302(0x82,--MIN);} if(P3_7==0)flag=0;} if(tiao==3) {while(P3_7==0);dispC();if(P3_6==0) {while(P3_6==0);writeDS1302(0x84,++HR);}

37

附录

//if(P3_5==0) {while(P3_5==0);writeDS1302(0x84,--HR);} if(P3_7==0)flag=0;} if(tiao==4) {while(P3_7==0);dispD();if(P3_6==0) {while(P3_6==0);writeDS1302(0x86,++DATE);} //if(P3_5==0) {while(P3_5==0);writeDS1302(0x86,--DATE);} if(tiao==5) tt=0; } }

if(P3_7==0)flag=0;} } 38

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务