利用实时时钟芯片 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 软件成功仿真实现。
广和通正式发布基于Sony Altair ALT1350平台的5G LPWA模组MS18系列
后端时序修正基本思路
X-ray与Xray在纳米机器人无损检测中的应用与比较-智诚精展
浅谈鸿蒙系统与现有移动操作系统的差异?
Android手机有福了 谷歌互传Nearby Share或于八月上线
基于DS1307的可调实时时钟系统设计
如何监测低氧环境对细胞培养基内氧浓度的影响
国自机器人的快速发展背后有着怎样的秘诀
PCB叠层有什么原则
使用粗粒度可重构阵列加速处理
比亚迪电子独家供应 vivo X60 Pro+ 中框,中板最薄位置 0.3mm
晶心科技成功测试IMG B图形处理器 NVIDIA GPU产品助力三维家效率提升
掌握控制变压器选型方法,让您轻松选
大陆LED芯片制造商在2018年底的库存水平超过人民币60亿元
SpaceNXT系列的RF-Labs射频柔性电缆组件
跨区重建VoNR异常的故障分析
MEMS加速度计可预防汽车偷盗
不用猜了,华为官方在推特确认P10发布时间
LG Uplus称未来将发布更多的5G手机以促使对下一代服务需求的加速
微软宣布成立云计算和人工智能平台,正式进军人工智能领域