DS1302时钟模块简单介绍

2018/4/30

1.功能

1.可以计算2100年之前的秒,分,时,日,日期,星期,月,年的能力

2.在其内部有着31个字节的静态RAM,提供用户使用

3.采用串行数据传送,采用SPI三线接口

4.工作电压(2.0v--5.5v),工作温度:-40c--85c

5.可以采用双电源进行供应

2.SPI 总线

SPI(Secial Peripheral Interface)  串行外围接口

信号类型:

1.MOSI:主机输出,从机输入

2.MISO:主机输入,从机输出

3.SCLK:时钟信号

4./cs(RST):复位功能

DS1302时钟模块简单介绍_第1张图片


2.DS1302引脚设置

DS1302时钟模块简单介绍_第2张图片


1.特点:

有着两个VCC(内部电源和外部电源),SLCK,IO,RST模拟了SPI总线

x1,x2连接的是两个32.768KHZ晶振


3.DS1302片内RAM介绍(重点)

1.在DS1302中有着一个控制寄存器,12个日历,时钟寄存器和31个可读写RAM

DS1302时钟模块简单介绍_第3张图片

注:D7位固定为1,D6位选择RAM/CK(选择是片内RAM还是日历,时钟寄存器),D5到D1为用于读写的时间寄存器或者片内RAM.

对于时钟寄存器的具体介绍图解:

DS1302时钟模块简单介绍_第4张图片


注:时钟均由BCD码进行写入,从低位写入高位

4.片内RAM

1.操作方式:单字节方式和多字节方式

2.奇数为读操作,偶数为写操作

5.相关代码详解(写入是以两位为一个单元,控制命令和数据,读取以一位为一个单元,数据)

0.时序图分析

DS1302时钟模块简单介绍_第5张图片DS1302时钟模块简单介绍_第6张图片


1.写操作


void Ds1302Write(uchar addr, uchar dat)//写入控制位和数据位
{
	uchar n;
	RST = 0;

	_nop_();//延时一个机器周期

	SCLK = 0;//先将SCLK置低电平。//低电平进行写入
	_nop_();
	RST = 1; //然后将RST(CE)置高电平。
	_nop_();

	for (n=0; n<8; n++)//开始传送八位地址命令
	{
		DSIO=addr&0x01;
		addr>>=1;//数据右移
		SCLK=1;//数据上升沿 开始读取数据
		_nop_();
		SCLK=0;//数据在下降沿  开始写入数据
		_nop_();
	}
	for (n=0; n<8; n++)//写入8位数据
	{
		DSIO = dat & 0x01;//从最低位开始传送
		dat >>= 1;
		SCLK = 1;//数据在上升沿时,DS1302读取数据
		_nop_();
		SCLK = 0;
		_nop_();	
	}	
		 
	RST = 0;//传送数据结束
	_nop_();
}

2.读操作


uchar Ds1302Read(uchar addr)
{
	uchar n,dat,dat1;
	RST = 0;
	_nop_();

	SCLK = 0;//先将SCLK置低电平。
	_nop_();
	RST = 1;//然后将RST(CE)置高电平。
	_nop_();

	for(n=0; n<8; n++)//开始传送八位地址命令
	{
		DSIO = addr & 0x01;//数据从低位开始传送
		addr >>= 1;
		SCLK = 1;//数据在上升沿时,DS1302读取数据
		_nop_();
		SCLK = 0;//DS1302下降沿时,放置数据
		_nop_();
	}
	_nop_();
	for(n=0; n<8; n++)//读取8位数据
	{
		dat1 = DSIO;//从最低位开始接收
		dat = (dat>>1) | (dat1<<7);
		SCLK = 1;
		_nop_();
		SCLK = 0;//DS1302下降沿时,放置数据
		_nop_();
	}

	RST = 0;
	_nop_();	//以下为DS1302复位的稳定时间,必须的。
	SCLK = 1;
	_nop_();
	DSIO = 0;
	_nop_();
	DSIO = 1;
	_nop_();
	return dat;	
}

3.初始化

void Ds1302Init()
{
	uchar n;
	Ds1302Write(0x8E,0X00);		 //禁止写保护,就是关闭写保护功能
	for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
	{
		Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);	
	}
	Ds1302Write(0x8E,0x80);		 //打开写保护功能
}

4.读取时钟信息

void Ds1302ReadTime()
{
	uchar n;
	for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
	{
		TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
	}
		
}




你可能感兴趣的:(DS1302时钟模块简单介绍)