基于DS1307的可调实时时钟系统设计

2018-01-27 20:40:29编辑:王磊 关键字:DS1307  实时时钟

利用实时时钟芯片 DS1307 设计一个能够调节时间的实时时钟。 介绍采用 I2C 总线接口实时时钟芯片 DS1307 进行准确定时的设计原理, 提出实时时钟芯片 DS1307 与单片机接口电路的设计方法,同时给出几个典型程序实例,通过 Proteus 软件进行仿真实现。


先来说说实时时钟DS1307的使用!


DS1307 是一款十分常用的实时时钟芯片,它可以记录年、月、日、时、分、秒等信息,提供至2100年的记录。可使用电池供电,也就是说,即使Arduino 在断电状态下,时钟芯片仍然是在运行的。它使用十分常用的两线式串行总线(I2C),只要两根线即可和Arduino 通信。


电控单元的时钟基准通常可利用 CPU 内部定时器作为时钟基准,并通过软件编程和 CPU 时钟中断来构造一个软时钟。 这种方法的优点是无需额外硬件支持,但缺点是时钟的计时精度受 CPU 主晶振以及与其相连的起振电容的影响而无法做到很高, 因此累积误差较大。同时在主电源掉电时为了维持时钟不停摆,系统必须由备用电源给整个 CPU 供电,这将导致功耗增大。


I2C总线虚拟技术


DS1307是一款具有I2C总线接口的实时时钟芯片,要驱动具有I2C总线接口的DS1307芯片,一种办法是选择一款带有I2C总线接口的高档单片机,然而,在很多小型仪器仪表中以及在单片机的教学环境中,使用带有I2C总线接口的高档单片机在经济上是不合算的,在这种情况下,可以采用I2C总线虚拟技术,选用普遍使用的51单片机,利用单片机的通用I/O端口模拟实现I2C总线接口。


硬件接口电路设计


本系统的电路由单片机AT89C51、日历时钟芯片DS1307、独立按键及显示电路组成。


DS1307与AT89C51的接口


为了使AT89C51单片机能够驱动DS1307芯片,本文采用了I2C总线虚拟技术,将单片机P2.6口和P2.7口来虚拟I2C总线接口。I2C总线是同步串行数据传输总线,其内部为双向传输电路,端口输出为开漏结构,故总线上必须有上拉电阻,通常可取5~10kΩ。因单片机P2口内部有上拉电阻,故DS1307芯片的SCL引脚与SDA引脚与单片机接口时,不需再添加上拉电阻。此外,按照DALLAS公司推荐的硬件接法,往往需要精度很高的晶体,为了提高其可靠性并节约成本,可将DS1307的X2引脚添加上拉电阻,从而可以克服使用普通晶振时DS1307不起振的问题,进而保证了DS1307的起振。日历时钟芯片DS1307与AT89C51的接口电路如图1所示。

时钟显示电路


为了将系统时间实时显示出来,本系统没有采用常用的数码管作为显示方式,而是采用1602LCD液晶实时显示时间,这样电路的设计就会相对简单一些,所用到的I/O口也较少。1602液晶的接口电路如图2所示。

时钟调节电路


为了能够及时对时间进行调节,本系统设计了时钟调节电路,由K0、K1、K2三个按键组成,且分别由单片机的P2.0、P2.1和P2.2口控制。其中,K0做为时钟调节的菜单键,第一次按下表示可以调节时间秒,第二次可以调节时间分,第三次按下调节时,第四次按下退出调时菜单,时钟继续开始走动。K1和K2分别是时分秒调节的加减键。在本电路中,根据经验总结,额外添加三个上拉电阻,以保证在没有按键按下时,进入单片机三个I/O口的按键均处于高电平状态,防止干扰产生。时钟调节电路如图3所示。

接口程序设计


软件程序设计采用模块化设计思想,包括主程序、初始化子程序、时钟运行子程序,按键扫描子程序。其中,初始化子程序主要工作有:初始化I2C总线,使总线处于备用状态;初始化LCD液晶显示器让其正常显示;初始化定时器0并开启定时器0中断。时钟运行子程序主要负责让DS1307芯片更新时间并在LCD上显示。按键扫描子程序负责检测按键的状态并将更改后的时间显示出来。主程序主要负责初始化及键盘扫描工作。本系统主程序的流程图如图4所示。

在本系统中,因采用了I2C总线虚拟技术,需严格按照时序图的要求进行操作,因此,在程序设计当中,分别添加了几个子程序,用于实现单片机与DS1307进行通信。下面是根据本文电路对I2C总线上的信号进行模拟的几个子程序:

void start() //模拟 I2C 启动信号

{

SDA = 1;

Nop ();

SCL = 1;

Nop ();

SDA = 0;

Nop ();

SCL = 0;

}

void stop() //模拟 I2C 停止信号

{

SDA = 0;

Nop ();

SCL = 1;

Nop ();

SDA = 1;

Nop ();

}

void ack() //模拟 I2C 应答信号

{

SDA = 1;

Nop ();

SCL = 1;

Nop ();

SCL = 0;

}

void un_ack() //模拟 I2C 非应答信号

{

uchar i;

i=0;

SCL=1;

while(SDA==1&&i《200) i++;

Nop ();

SCL = 0;

}

需要注意的是,DS1307的各类时间数据均以BCD码的格式存储在相应的时间寄存器中,而1602液晶显示器只能识别字符码,即ASCLL码,因而1602在向DS1307读取或写入时间数据时,需要进行数据类型转换。本文采用以下两个子程序用来完成上述功能:

uchar dec_to_bcd (uchar dec) //ASCLL 码 (十 进 制 )转BCD 码

{

Uchar x, y;

x=dec/10;

y=dec%10;

y=(x《《4)|y;

return y;

}

uchar bcd_to_dec(uchar bcd) //BCD 码 转 ASCLL 码(十

进制)

{

Uchar x, y;

y=bcd/16;

x=bcd % 16;

y=y*10+x;

return y;

}


仿真分析


本文最后使用Proteus软件对本实时时钟系统进行仿真,将代码下载到单片机当中并启动Proteus后,液晶显示器与DS1307时钟显示模块同时显示初始时间并开始计时, 适当调节三个独立按键 K0~K2 后,液晶显示器显示调整后的 时间并且把新的 时间写入DS1307,DS1307 从新的时间开始计时。 仿真效果如图5 所示。

本文设计了一个基于 DS1307 可调实时时钟系统,提出了实时时钟芯片 DS1307 与单片机接口电路的设计方法,因本系统采用了 I2C 总线虚拟技术,需严格按照 I2C 总线时序图的要求对 DS1307 进行操作,本文给出了对I2C 总线上的信号进行模拟的几个典型程序实例,最后通过 Proteus 软件成功仿真实现。

关键字:DS1307  实时时钟

来源: 互联网 引用地址:http://www.eeworld.com.cn/mndz/article_2018012726918.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:IEEE固态电路协会中国科大学生分会成立
下一篇:基于MATLAB的理想低通滤波器的设计

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

DS1302时钟与LCD1602液晶显示

    DS1302是一个实时时钟芯片,它在实时显示时间中应用。它可以对年、月、日、周、时、分、秒进行计时。DS1302的引脚及原理图如下:    它与CPU的连接需要SCLK(7)、I/O(6)和RST(5)三个引脚,VCC2和VCC1分别为主电源和备份电源,X1和X2分别接外部振荡器。在于CPU的通信中I/O用来传输数据,RST作为复位信号,SCLK用来控制数据字节的读写。DS1302的读写时序如下:    程序中对芯片的操作主要是参考芯片的时序状态,时序中说明只要有对数据的操作RST就需要置1,在读数据的前8个时钟中在SCLK处于高电平的过程中会获取控制字信息
发表于 2018-06-25 21:56:15
DS1302时钟与LCD1602液晶显示

stm32+DS1302+TM1638驱动程序

number which has been pressed*params       : none*return       : the number of the key. 0-8.  "return 0" represents no key has been pressed.***********************************************************************************************/2.DS1302与STM322.1硬件连接   Vcc--
发表于 2018-06-25 21:52:54

STM32与DS1302的接口电路

(1)硬件 CLK---PA4,  DAT--- PA5, RST--- PA6(2)硬件初始化 CLK与RST均为输出,而DAT是开漏型的输出。因为在这种方式下,IO口的读仍然存在,因此是真正的双向IO模式。/*DSCK -PA4 DAT PA5 RST DAT*/#define ds1302Clk GPIO_Pin_4   //与时钟线相连的芯片的管脚#define ds1302Dat GPIO_Pin_5   //与数据线相连的芯片的管脚#define ds1302Rst GPIO_Pin_6   //与复位端相连的芯片的管脚/* PA 4,6,为输出*/ 
发表于 2018-06-25 21:52:13

一个完整的DS1302时钟在STM32上的应用实例

一个完整的DS1302时钟在STM32上的应用    /*DS1302时钟芯片*/  uint8_t read[] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址   uint8_t write[] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址  uint8_t start_time2[8]={0,0,10,5,5,6,18};//初始化时间:2018年5月5号10:00:00星期六   
发表于 2018-06-25 21:51:37

STM32与DS1302设计时钟芯片,超详细

DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RES 复位(2)I/O 数据线(3)SCLK串行时钟。时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信。DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mWDS1302 是由DS1202 改进而来增加了以下的特性:双电源
发表于 2018-06-25 21:50:57
STM32与DS1302设计时钟芯片,超详细

基于STM32的DS1302时钟芯片驱动

/************************************************************************************************************************** 函数 : DS1302.H* 功能 :  DS1302头文件* 参数 :  无* 返回 :  无* 依赖 :  底层读写函数* 最后修改时间 : * 说明 : DS1302采用GPIO模拟SPI的方式DS1302 LSB格式,上升沿写 下降沿读  BCD码存储* 参考
发表于 2018-06-25 21:49:52

小广播

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved