ds1302时钟芯片与51单片机做电子钟,单片机ds1302时钟例程

1 DS1302 简介:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信

1 DS1302概述:

DS1302是美国DALLAS公司推出的高性能、低功耗实时时钟芯片,附加31字节静态RAM,采用SPI 3线接口与CPU同步通信。您可以在突发模式下一次发送多个字节。实时时钟提供秒、分、时、日、星期、月、年,可自动调整一月和31天的长度,并具有闰年校正功能。工作电压范围为2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电模式,备用电源可采用涓流电流充电。 DS1302的外部引脚分配如图1所示,内部结构如图2所示。 DS1302广泛应用于测量系统中,因为它用于记录数据,尤其是具有特殊意义的特定数据点,并且可以记录数据以及数据显示的时间。

图1 DS1302外部引脚分配

df489eabb81e41f4ac5efa876da651d4~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=NbC4vZY1JL0sICPBy9DbZLclUzk%3D

图2 DS1302内部结构

dbfc9ec5479a484bbecaaa1e304f5c1e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=VJh%2BMzzj8Dt6OVo3m3PDb4H8wsg%3D

各引脚的功能如下。

Vcc1:主电源,Vcc2:备用电源。对于Vcc2Vcc1+0.2V,Vcc2为DS1302供电。对于Vcc2 Vcc1,Vcc1 为DS1302 供电。

SCLK:串行时钟,输入。

I/O:3线接口双向数据线。

CE:输入信号。读写数据时必须为高电平。该引脚有两个功能。首先,CE 启动控制字访问移位寄存器的控制逻辑。其次,CE提供了一种终止单字节或多字节数据传输的方法。

DS1302 有以下一组寄存器。

DS1302共有12个寄存器,其中7个与日历和时间相关的寄存器(81h至8Dh用于读取,80h至8Ch用于写入),如图3所示。

62ddab9b17814507bc9cb6c9f1fb0883~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=KUHxmn9g2fkq0ruI4YzvclU5Yuw%3D

图3 DS1302日历和时间寄存器

时间寄存器的第7 位(85h、84h)用于定义DS1302 是工作在12 小时模式还是24 小时模式。如果高,则选择12 小时模式。在12 小时模式下,第5 位是,1 表示下午。在24 小时模式下,第5 位是第二个10 小时位。

秒寄存器的位7 (81h, 80h) 被定义为时钟暂停标志(CH)。当该位设置为1 时,时钟振荡器停止并且DS1302 置于低功耗状态。当该位设置为0 时,时钟开始运行。

控制寄存器的第7位(8Fh、8Eh)是写保护位(WP),其他7位设置为0。在对时钟或RAM 进行任何写操作之前,WP 位必须为0。当WP 位为1 时,写保护位阻止写入任何寄存器。

DS1302 RAM地址

图4 显示了DS1302 的附加31 字节静态RAM 的地址。

917bfcf0b60e4555bc4849db164a6a67~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=dY0wXcYIkqE7eoARL7DgNYRWmCU%3D

图4

DS1302工作模式寄存器

所谓突发模式是指一次发送多个字节的时钟信号和RAM数据。突发模式寄存器如图5 所示。

732126a048ab4c92aed2724e475a2867~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=iOYt9Le%2BS%2FCqjJ6IPBfva7VI2F8%3D

图5

此外,DS1302还配备了充电电阻等。

2 读写时序指令

DS1302是SPI总线驱动器。除了将控制字写入寄存器之外,我们还需要读取相应寄存器中的数据。

要与DS1302通信,必须首先了解DS1302控制字。 DS1302 控制字如图6 所示。

cc3e1ea6ee24492491e8e66bc0c27297~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=349oXM0wWVphjZz9pDg4oFeOUC8%3D

控制字的最高有效位(位7)必须是逻辑1。如果为0,则无法将数据写入DS1302。

位6:0 表示访问日历时钟数据,1 表示访问RAM 数据。

Bit 5 至Bit 1(A4 至A0):表示操作单元的地址。

Bit 0(最低有效位):0 表示执行写操作,1 表示执行读操作。

控制字始终首先输出最低有效位。输入控制字指令后,数据在SCLK 时钟的下一个上升沿写入DS1302,从最低有效位(0 位)开始。类似地,在紧随8 位控制字指令的下一个SCLK 脉冲的下降沿从DS1302 读取数据。该数据也是从最低有效位到最高有效位读取的。图7显示了数据读写时序。

a40f8f90c762465db327549a3b8eb488~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=0AhadoDWDok5Mt%2BlKb33bQxtMOk%3D

具体操作请参考驱动。

3 示意图:

电路图如图8所示。 DS1302和微控制器之间的连接只需要三根线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚、作为备用电源的Vcc2以及外部32.768kHz晶振。连接振荡器并且芯片提供定时脉冲。

27882d53ada344ad8909f0c8c74ca11b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745516&x-signature=h60giyFGFJaRc7E6XBir0sSs%2BCI%3D

4名司机

//注册宏定义

#定义WRITE_SECOND0x80

#定义WRITE_MINUTE0x82

#定义WRITE_HOUR0x84

#定义READ_SECOND0x81

#定义READ_MINUTE0x83

#定义READ_HOUR0x85

#定义WRITE_PROTECT0x8E

//位寻址寄存器定义

sbit ACC_7=ACC^7;

//引脚定义

sbit SCLK=P3^5; //DS1302时钟信号引脚7;

sbit DIO=P3^6; //DS1302 数据信号引脚6;

sbit CE=P3^7 //DS1302片选引脚5;

//地址和数据传输子程序

void Write1302(无符号字符地址,dat)

{

无符号字符i,临时;

CE=0; //CE引脚为低电平,数据传输暂停。

SCLK=0; //清除时钟总线

CE=1; //CE引脚为高电平,逻辑控制使能。

//发送地址

for (i=8; i0; i–) //循环8被移位

{

SCLK=0;

临时=地址;

DIO=(bit)(temp0x01); //每次发送低字节

addr=1 //右移一位。

SCLK=1;

}

//发送数据

对于( i=8; i0; i– )

{

SCLK=0;

温度=数据;

DIO=(位)(temp0x01);

数据=1;

SCLK=1;

}

CE=0;

}

//数据加载子程序

unsigned char Read1302(无符号字符地址)

{

无符号字符i、temp、dat1、dat2;

CE=0;

SCLK=0;

CE=1;

//发送地址

for (i=8; i0; i–) //移位循环8

{

SCLK=0;

临时=地址;

DIO=(bit)(temp0x01); //每次发送低字节

addr=1 //右移一位。

SCLK=1;

}

//读取数据

对于( i=8; i0; i– )

{

ACC_7=DIO;

SCLK=0;

ACC=1;

SCLK=1;

}

CE=0;

数据1=ACC;

dat2=dat1/16; //数据转换

dat1=dat1%16; //从十六进制转十进制

数据1=数据1+数据2*10;

返回(dat1)。

}

//初始化DS1302

无效初始(无效)

{

Write1302 (WRITE_PROTECT,0X00) //禁用写保护

Write1302 (WRITE_SECOND,0x56) //初始化第二位

Write1302 (WRITE_MINUTE,0x34); //初始化分钟

Write1302(WRITE_HOUR,0x12); //初始化时间

Write1302 (WRITE_PROTECT,0x80) //使能写保护。

}

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/82388.html

(0)
小条的头像小条
上一篇 2024年5月31日 下午3:29
下一篇 2024年5月31日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注