实时时钟芯片DS1302

我与影子孤独终老i 提交于 2019-11-27 08:06:29

BCD码

用0b0000-0b1001表示0-9
0b1001加1自动进位为0b00010000

特性

1、DS1302是一个实时时钟芯片,可以提供秒、分、小时、日期、月、年等信息,并且还有软件自动调整的能力,可以通过配置AM/PM来决定采用24小时格式还是12小时格式。

2、拥有31字节数据存储RAM。

3、串行I/O通信方式,相对并行来说比较节省IO口的使用。

4、DS1302的工作电压比较宽,在2.0~5.5V的范围内都可以正常工作。

5、DS1302这种时钟芯片功耗一般都很低,它在工作电压2.0V的时候,工作电流小于300nA。

6、DS1302共有8个引脚,有两种封装形式,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。

7、当供电电压是5V的时候,兼容标准的TTL电平标准,这里的意思是,可以完美的和单片机进行通信。

8、由于DS1302是DS1202的升级版本,所以所有的功能都兼容DS1202。此外DS1302有两个电源输入,一个是主电源,另外一个是备用电源,比如可以用电池或者大电容,这样做是为了在系统掉电的情况下,我们的时钟还会继续走。

硬件信息

在这里插入图片描述
引脚功能
在这里插入图片描述寄存器介绍
寄存器内部采用BCD码
在这里插入图片描述指令讲解:
DS1302 的一条指令一个字节共 8 位,其中第 7 位(即最高位)固定为 1,这一位如果是0 的话,那写进去也是无效的。第 6 位是选择 RAM 还是 CLOCK 的,如果选择 CLOCK 功能,第 6位是 0,如果要用 RAM,那第 6 位就是 1。从第 5 到第 1 位,决定了寄存器的 5 位地址,而第 0 位是读写位,如果要写,这一位就是 0,如果要读,这一位就是 1。

DS1302 时钟的寄存器,其中 8 个和时钟有关的,5 位地址分别是 0b00000~0b00111,还有一个寄存器的地址是 01000,这是涓流充电所用的寄存器,我们这里不讲。在 DS1302 的数据手册里的地址,直接把第 7 位、第 6 位和第 0 位值给出来了,所以指令就成了 0x80、0x81那些了,最低位是 1,那么表示读,最低位是 0 表示写,如图 15-10 所示。

寄存器详解
寄存器 0:最高位 CH 是一个时钟停止标志位。如果时钟电路有备用电源,上电后,我们要先检测一下这一位,如果这一位是 0,那说明时钟芯片在系统掉电后,由于备用电源的供给,时钟是持续正常运行的;如果这一位是 1,那么说明时钟芯片在系统掉电后,时钟部分不工作了。如果 Vcc1 悬空或者是电池没电了,当我们下次重新上电时,读取这一位,那这一位就是 1,我们可以通过这一位判断时钟在单片机系统掉电后是否还正常运行。剩下的7 位高 3 位是秒的十位,低 4 位是秒的个位,这里再提请注意一次,DS1302 内部是 BCD 码,而秒的十位最大是 5,所以 3 个二进制位就够了。

寄存器 1:最高位未使用,剩下的 7 位中高 3 位是分钟的十位,低 4 位是分钟的个位。

寄存器 2:bit7 是 1 的话代表是 12 小时制,0 代表是 24 小时制;bit6 固定是 0,bit5 在12 小时制下 0 代表的是上午,1 代表的是下午,在 24 小时制下和 bit4 一起代表了小时的十位,低 4 位代表的是小时的个位。

寄存器 3:高 2 位固定是 0,bit5 和 bit4 是日期的十位,低 4 位是日期的个位。

寄存器 4:高 3 位固定是 0,bit4 是月的十位,低 4 位是月的个位。

寄存器 5:高 5 位固定是 0,低 3 位代表了星期。

寄存器 6:高 4 位代表了年的十位,低 4 位代表了年的个位。请特别注意,这里的 00~99 指的是 2000 年~2099 年。

寄存器 7:最高位一个写保护位,如果这一位是 1,那么是禁止给任何其它寄存器或者那 31 个字节的 RAM 写数据的。因此在写数据之前,这一位必须先写成 0。

通信时序

sbit DS1302_CE=P1^7;//使能
sbit DS1302_CK=P3^5;//时钟信号
sbit DS1302_IO=P3^4;//信号读写


在这里插入图片描述先写指令在读字节
上升沿发送,下降沿读取数据

//从DS1302通信总线上读取一个字节
unsigned char DS1302ByteRead()
{
	unsigned char mask;
	for(mask=0x01;mask!=0;mask<<=1)
	{
		if(DS1302_IO!=0)
			dat|=mask;
		DS1302_CK=1;
		DS1302_CK=0;		
	}
	return dat;	
}
//用单次操作从某一寄存器中读取一个字节,reg为寄存器地址,dat为待写入字节
unsigned char DS1302SingleRead(unsigned char reg)
{
	unsigned char dat;
	DS1302_CE=1;
	DS1302ByteWrite((reg<<1)|0x81);
	dat=DS1302ByteRead();
	DS1302_E=0;
	return dat;
}


在这里插入图片描述1、首先写字节指令,指明寄存器地址以及后续操作是写操作
2、写入一个字节数据
在下降沿发送数据,从机上升沿附近进行采样

//发送单个字节到DS1302通信总线上
void DS1302ByteWrite(unsigned char dat)
{
	unsigned char mask;
	for(mask=0x01;mask!=0;mask<<=1)//低位先读
	{
		if((mask&dat)!=0)
			DS1302_IO=1;
		else
			DS1302_IO=0;
		DS1302_CK=1;
		DS1302_CK=0;		
	}
}
//用单次写操作向某一寄存器写入一个字节,reg为寄存器地址,dat为待写入字节
void DS1302_SingleWrite(unsigned char reg,unsigned char dat)
{
	DS1302_CE=1;
	DS1302ByteWrite((reg<<1)|0x80);//写入指令,寄存器地址即操作
	DS1302ByteWrite(dat);
	DS1302_CE=0;
}

BURST模式

主要是防止读取的时候,还没读完,数据又变化了,故先将寄存器的数据,输出到缓冲区内,读取数据时候是去缓冲区进行读取,写也是如此。
指令:
读0xBF
写0xBE

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!