DS1302详解(蓝桥杯单片机模块)

DS1302详解(蓝桥杯单片机模块)文章目录特性详细描述命令字节CE数据输入数据输出突发模态时钟\日期时钟停止标志写保护时钟\日期突发模式RAM突发模式数据传输蓝桥杯部分输出特性实时时钟计算秒、分、小时,日期,月,日、周,年与闰年赔偿有效期至2100年31×8支持电池的通用RAM2.0V至5.5V都可运行在2.0V时使用小于300nA电流单字节或多字节(突发模式)用于时钟或计算机读-写的数据传输内存数据简单的3线接口详细描述DS1302芯片包含一个实时时钟/日历和31字节的静态RAM。它通过一个简单的串行接口与

大家好,欢迎来到IT知识分享网。

特性

  • 实时时钟计算秒、分、小时,日期,月,日、周,年与闰年赔偿有效期至2100年
  • 31 x 8支持电池的通用RAM
  • 2.0V至5.5V都可运行
  • 在2.0V时使用小于300nA电流
  • 单字节或多字节(突发模式)用于时钟或计算机读- 写的数据传输内存数据
  • 简单的3线接口

在这里插入图片描述

详细描述

DS1302芯片包含一个实时时钟/日历和31字节的静态RAM。
它通过一个简单的串行接口与微处理器通信。
实时时钟/日历提供秒、分钟、小时、日、日、月和年信息。
月末的日期会自动调整天数少于31天的月份,包括闰年的更正。时钟运行在24小时或12小时的格式与AM/PM指示器使用同步串行通信简化了DS1302与微处理器的接口。
只需要三根电线与时钟/RAM:
CE通信
I/O(数据线)
SCLK(串行时钟)
DS1302被设计成在非常低的功率下工作,并且以低于1uW的速度保留数据和时钟信息。
DS1302是DS1202的继承者。除了DS1202的基本计时功能外,DS1302还具有用于主电源和备用电源的双电源引脚。

引脚 名字 功能
1 Vcc2 主电源引脚双电源配置。Vcc连接到备用电源,以在没有主电源的情况下保持时间和日期。
2 X1 晶振引脚
3 X2 晶振引脚
4 GND
5 CE 输入。在读或写过程中必须将CE信号变为为高电平。这个引脚有一个内部的40k2 (typ)下拉电阻到地。
6 IO 输入/推挽式输出。I/O引脚是3线接口的双向数据引脚。这个引脚有一个内部的40k2 (typ)下拉电阻到地。
7 SCLK 输入。SCLK用于同步串行接口上的数据移动。这个引脚有一个内部的40k2 (typ)下拉电阻到地。
8 Vcc1 单电源和电池供电系统的低功耗操作和低功耗电池备份

振荡器电路: DS1302采用了外接的32.768kHz晶体。振荡电路不需要任何外部电阻或电容来工作。

命令字节

下图显示了命令字节。每次数据传输都由命令字节启动。MSB(第7位)必须是一个逻辑1. 如果是0,对DS1302的写入将被禁用。
第6位逻辑O指定时钟/日历数据,逻辑1指定RAM数据。
第1 ~ 5位指定输入或输出的指定寄存器,LSB(比特0)指定逻辑0为写操作(输入),逻辑1为读操作(输出)。
命令字节总是从LSB (0位)开始输入。
在这里插入图片描述

这个就是后面时钟\日期的控制字节的组成!比如后面的
在这里插入图片描述

CE

驱动CE为高启动所有数据传输。
CE输入有两个功能
第一:CE打开控制逻辑,允许访问地址/命令序列的移位寄存器。
第二,CE信号提供了终止单字节或多字节CE数据传输的方法。时钟周期是由上升沿和下降沿组成的序列。
对于数据输入,数据必须在时钟上升沿有效,数据位在时钟下降沿输出。
如果CE输入低,所有的数据传输终止,I/O引脚进入高阻抗状态。

数据输入

在输入一个写命令字节的8个SCLK周期之后,在接下来的8个SCLK周期的上升边缘输入一个数据字节。额外的SCLK周期被忽略,如果他们无意中发生。数据从第0位开始输入。

数据输出

在输入一个read命令字节的8个SCLK周期之后
一个数据字节被输出到下一个8个SCLK周期的下降边缘。
注意,要传输的第一个数据位发生在命令字节的最后一位写入后的第一个下降沿上。只要CE保持高,额外的SCLK周期就会重新传输数据字节。
此操作允许连续突发模式读取能力。

突发模态

在突发模式下读或写从地址0的0位开始。
当以突发模式写入时钟寄存器时,必须写入完前8个寄存器。
然而,当以突发模式写入RAM时,并不需要为数据传输写入全部31个字节。不管31个字节是否都被写入,每个被写入的字节都将被转移到RAM中。

时钟\日期

时间和日历信息是通过读取适当的寄存器字节获得的。
下图。通过写入适当的寄存器字节来设置或初始化时间和日历。时间和日历寄存器的内容采用二进制编码的十进制(BCD)格式
与星期对应的值是用户定义的,必须是连续的(例如,如果1等于星期天,那么2等于星期一,以此类推)。不合逻辑的时间和日期条目会导致未定义的操作。
当读取或写入时间和日期寄存器时,次要(用户)缓冲区用于防止内部寄存器更新时发生错误。当读取时间和日期寄存器时,用户缓冲区被同步到内部寄存器(CE的上升边缘)
每当写入秒寄存器时,就会重置倒计时链。
时寄存器的第7位被定义为12小时或24小时模式选择位。
当为“high”时,选择12小时模式。
在12小时模式下,第5位是AM/PM位,逻辑高为PM。
24小时模式下,第5位是第二个10小时(20-23小时)位。
小时数据必须在12/24位改变时重新初始化

在这里插入图片描述

时钟停止标志

秒寄存器的第7位被定义为时钟停止(CH)标志。
当此位设置为逻辑1时。时钟振荡器停止,DS1302被置于低功率待机模式,电流漏小于100nA。
当此位写入逻辑0时,时钟开始计时。 也即上电状态。

写保护

控制寄存器的第7位是写保护位。前7位(从0到6位)被迫为0,在读时总是读0。
在对时钟或RAM进行任何写操作之前,第7位必须是0。当值高时,写保护位阻止对任何其他寄存器的写操作也即初始上电状态。因此,WP位应该在试图写入设备之前被清除。
电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作

时钟\日期突发模式

clock/calendar命令指定突发模式操作。在
这种模式下。前8个时钟/日历寄存器可以从地址0的0位开始连续读或写
如果写保护位设置高当写时钟/日历突发模式被指定,没有数据传输将发生到任何八个时钟/日历寄存器(这包括控制寄存器)。
在这里插入图片描述
内存静态RAM是31 × 8字节,在RAM地址空间中连续编址。

RAM突发模式

RAM命令字节指定突发模式操作。在这种模式下,31个RAM寄存器可以从地址0的0位开始连续读或写
在这里插入图片描述

数据传输

在这里插入图片描述

蓝桥杯部分

//其中time[3]在main.c中有申明
//extern uchar time[3];
//前面分别是秒、分、时......
uchar code addr[] = { 
   0x00, 0x00, 0x00, 0x08, 0x10, 0x02, 0x13, 0x13};
uchar time[3];
//这里使用的是突发模式
uchar Read_Ds1302()
{ 
   
 	unsigned char i,temp=0x00;
 	for (i=0;i<8;i++) 	
 	{ 
   		
			SCK=0;
			temp>>=1;	
			if(SDA)
			temp|=0x80;	
			SCK=1;
	} 
	return temp;
}

void v_DsW()
{ 
   
	uchar i = 0;
	Write_Ds1302_Byte(	0x8E, 0);
	RST=0;	_nop_();
	SCK=0;	_nop_();
	RST=1; 	_nop_();  
	Write_Ds1302(0xbe);
	//一定要将8个寄存器都写入!
	for(i = 0; i < 8; i++)
	{ 
   
		Write_Ds1302(addr[i]);
	}
	RST=0;
	Write_Ds1302_Byte(	0x8E, 0x80);
}
void v_DsR()
{ 
   
	uchar i = 0;
	//关闭写保护
	Write_Ds1302_Byte(	0x8E, 0);
	RST=0;	_nop_();
	SCK=0;	_nop_();
	RST=1; 	_nop_(); 
	Write_Ds1302(0xbf);
	//读完前三个就可以了
	time[0] = Read_Ds1302();
	time[1] = Read_Ds1302();
	time[2] = Read_Ds1302();
	//将秒位最高位清零
	time[0] = time[0] & 0x7f;
	//BCD码转换
	time[0] = (time[0] >> 4)*10 + (time[0]&0x0f);
	time[1] = (time[1] >> 4)*10 + (time[1]&0x0f);
	time[2] = (time[2] >> 4)*10 + (time[2]&0x0f);
	RST=0;
	//打开写保护
	Write_Ds1302_Byte(	0x8E, 0x80);
}

void StopTime()
{ 
   
 Write_Ds1302_Byte(	0x8E, 0);
	Write_Ds1302_Byte(	0x80, (time[0] | 0x80));
	Write_Ds1302_Byte(	0x8E, 0x80);
}

main.c

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "ds1302.h"
extern uchar time[3];
uchar Second=-1;
void main()
{ 
   
	UartInit();
	v_DsW();
	while(1)
	{ 
   
		TI = 1;
		if(Second!=time[0])
		{ 
   
			Second = time[0];
			printf("Time is %02bu:%02bu:%02bu\r\n", time[2], time[1], time[0]);
		}
		v_DsR();
		Delay500ms();	
	}
}

输出

在这里插入图片描述

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14573.html

(0)

相关推荐

发表回复

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

关注微信