ds1302——斌哥51

以下内容分别借鉴了“清翔 51”,“斌哥51”,以及CSDN“普通的不普通少年”

ds1302——斌哥51_第1张图片

内部结构:
ds1302——斌哥51_第2张图片
DS1302 包括时钟/日历寄存器和 31 字节(8 位)的数据暂存寄存器,数据通信仅通过一条串行输入输出口。实时时钟/日历提供包括秒、分、时、日期、月份和年份信息。闰年可自行调整,可选择 12 小时制和 24 小时制,可以设置 AM、PM。

使用同步串行通讯简化了 DS1302 与微处理器的接口。与时钟/RAM通讯只需要三根线: CE, I/O (数据线), and SCLK (串行时钟).*

典型应用电路:
ds1302——斌哥51_第3张图片
管脚:
ds1302——斌哥51_第4张图片
供电说明说明
Vcc2是主电源,Vcc1是备用电源。
当Vcc2>Vcc1+0.2v的时候,Vcc2供电
当Vcc2 ds1302——斌哥51_第5张图片
上图是清翔51开发板的DS1302原理图

总结ds1302的引脚:
SCLK:串行时钟输入端,控制数据输入与输出。
I/O:双向输入线
CE:使能端,CE为高时允许DS1302读写数据,CE端为低时DS1302数据不可读写
X1与X2:外接32.768的圆形晶振,给时钟芯片提供晶振频率

控制寄存器(相当于命令控制寄存器)
用于存放ds1302的控制命令,他用于对ds1302的读写进行控制
ds1302——斌哥51_第6张图片

要求命令字的bit7在每一次的数据传输过程中必须置为1,如果置为0,则禁止对ds1302写入数据。

位 6 在逻辑 0时规定为时钟/日历数据,
位6在逻辑 1时为 RAM数据.

位 1 至 位 5 为寄存器的5位地址位,用于选择进行读写的日历,时钟寄存器或者片内RAM

LSB (位 0) 在逻辑0时为写操作(输出)
LSB(位0)为逻辑1时为读操作(输入).命令字以 LSB (位 0)开始总是输入.

与日历时钟相关的寄存器(相当于数据寄存器)
ds1302——斌哥51_第7张图片
**秒寄存器0x81,0x80:**当CH=0时,DS1302内部时钟运行,反之CH=1停止。
对于数据位,已知秒十位最大为5,个位最大为9,所以高位只需要3位,低位则需要4位。

**分钟寄存器0x83,0x82:**分钟寄存器就只有bit0-bit6作为数据位,bit7为0就好。

**小时寄存器0x85,0x84:**当BIT7为1时为12小时制,当BIT7为0时为24小时制。

**控制寄存器0x8f,0x8e:**当WP为1时,不能对Ds1302做任何操作。

寄存器内容是按照BCD码存放的,如READ:0x83地址读到的0x28代表28分钟。

SPI通信方式:

写操作
ds1302——斌哥51_第8张图片
读操作
ds1302——斌哥51_第9张图片
写操作描述:
首先要操作ds1302首先得拉高CE口
然后放上要写的数据
最后观察上面的时序图,在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。

读操作描述:
首先要操作ds1302首先得拉高CE口
在命令字的最后一个上升沿时,我们令SCLK拉低,紧接着就可以读数据了
读出DS1302的数据,读出的数据也是从最低位到最高位。

总结:CE从低到高的的时候,CLK必须为低。
上升沿写入,下降沿读出
写操作:写完命令的紧接着的上升沿写入数据。
读操作:写完命令的紧接着的下降沿读出数据。
注意读写位是低位在前,不管是命令字还是地址。

将BCD码转为十进制码


 uchar BCD2DECIMAL(uchar BCD)
{
   
	return(BCD>>4)*10+(BCD & 0x0F)}

解释一下上面的代码,BCD码比如是0x28,对应的二进制就是0010 1000 我们先右移4位得到0000 0010,换为十进制就是2,然后乘10得到20。然后用BCD码按位操作与上0x0F 换成二进制就是0000 1000 & 0010 1000 得到了0000 1000换成十进制就是8,然后将20+8得到十进制数28。显然我们的目的就是28。与BCD码对应上了。
BCD码0x28的含义就是将高四位看做十位,低四位看做个位,来直观表示我们的数值,但并非真正意义上的十进制。
我么看做是少了ABCDEF的16进制。

**十进制数转8421码 **
往时钟芯片写入数据时,需将待写的十进制数转换为8421码。

unsigned char hex_to_bcd(unsigned char data)
{
   
    unsigned char temp;

    temp = (((data/10)<<4) + (data%10));
    return temp;
}

解释上面的代码,将一个十进制数先对10整除,然后左移至高4位。然后对这个十进制数取余,然后加上刚才算好的高位数据,就是BCD码。

复位以及时钟控制:
所有的数据传输在RST置一时进行(反复强调), 输入信号有两种功能:
首先,RST 接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST 提供终止单字节或多字节数据的传送手段。
当 RST 为高电平时,所有的数据传送被初始化,允许对 DS1302 进行操作。
如果在传送过程中 RST 置为低电平,则会终止此次数据传送,I/O 引脚变为高阻态。
上电运行时,在 Vcc≥2.5V 之前,RST 必须保持低电平。只有在 SCLK 为低电平时,才能将 RST 置为高电平。
I/O 为串行数据输入输出端(双向),后面有详细说明。SCLK 始终是输入端。

数据输入:
经过 8 个时钟周期的控制字节的输入,一个字节的输入将在下 8 个时钟周期的上升沿完成,数据传输从字节最低位开始。

数据输出:
经过 8 个时钟周期的控制读指令的输入,控制指令串行输入后,一个字节的数据将在下个 8 个时钟周期的下降沿被输出,注意第一位输出是在最后一位控制指令所在脉冲的下降沿被输出,要求 RST 保持位高电平。

同理 8 个时钟周期的控制读指令如果指定的是突发模式,将会在脉冲的上升沿读入数据,下降沿读出数据,突发模式一次可进行多字节数据的一次性读写,只要控制好脉冲就行了。

主函数:


# include <reg51.h>
# include "display.h"		//1602,忙检测,写数据,写命令,位定义,
# include "ds1302.h"



uchar sec = 0,minu = 0,hour = 0;
uint j ;


//BCD转码方法1
//#define BCD_to_Decimal(bcd) ((((bcd) / 10) << 4) + ((bcd) % 10))
//#define Decimal_to_BCD(dec)  (((0xf0 & (dec)) >> 4)*10 + (0x0f & (dec)))


你可能感兴趣的:(单片机,单片机)