先来说说实时时钟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=y10+x;
return y;
}
仿真剖析
本文末了利用Proteus软件对本实时时钟系统进行仿真,将代码下载到单片机当中并启动Proteus后,液晶显示器与DS1307时钟显示模块同时显示初始韶光并开始计时, 适当调节三个独立按键 K0~K2 后,液晶显示器显示调度后的 韶光并且把新的 韶光写入DS1307,DS1307 重新的韶光开始计时。 仿真效果如图5 所示。
本文设计了一个基于 DS1307 可调实时时钟系统,提出了实时时钟芯片 DS1307 与单片机接口电路的设计方法,因本系统采取了 I2C 总线虚拟技能,需严格按照 I2C 总线时序图的哀求对 DS1307 进行操作,本文给出了对I2C 总线上的旗子暗记进行仿照的几个范例程序实例,末了通过 Proteus 软件成功仿真实现。