DS1302的使用(by 51单片机)

最近在准备蓝桥杯单片机组的比赛,在学习这款单片机时,里面涉及到DS1302芯片的使用,所以今天就在这里把学习使用DS1302的过程写下来,以方便日后查阅。

DS1302是由DALLAS公司推出的涓流充电时钟芯片,片内含有一个实时时钟和31字节静态RAM.可通过简单串行接口与单片机进行通信。


与单片机相连的参考电路如上所示。很明显与单片机相连只需要三条线。

CE复位引脚:输入信号,在读写数据期间,必须为高,因此该引脚有两个功能,一是CE开始控制字访问移位寄存器的控制逻辑,二是提供结束单字节或多字节数据传输的方法。

I/O引脚:三线接口时的双向数据线。

SCLK:串行时钟,输入,控制数据的输入与输出。

既然接线都知道怎么接了,那么就直接开始程序的编写吧。(有些单片机板子在制作过程中就已经连在一起了)

其实不管什么样的芯片,使用它的过程都是差不多的,无非是先进行一个初始化,初始化之后就可以进行自己想要的读写(与芯片通信)。

初始化说起来好像和与芯片通信是两种不同的操作,其实本质上都是一样的,都是对芯片的寄存器进行读写操作,当然初始化就单纯是写。既然要写,就要知道DS1302控制字的格式,如下图所示。


一共八位。

最高位BIT7:必须为1,当为0时无法向DS1302写入数据。

BIT6:为0表示对时钟数据进行操作,为1表示对RAM数据进行操作。

BIT5~BIT1:要读写寄存器的地址。

BIT0:为0进行写操作,为1进行读操作。

                                             读操作示意图


                                             写操作示意图


很明显,数据操作之前CE要先置高。对于读操作,开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。需要注意的是,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入。

对于写操作,开始的8个SCLK周期,输入一个写命令字节,数据字节在后8个SCLK周期的上升沿输入。

下面贴出蓝桥杯官方给出的读写操作函数。


unsigned char Read_Ds1302_Byte(void) 
{
unsigned char i, dat=0;
for (i=0;i<8;i++)
{
dat = dat >> 1;    //因为读取的数据从低位开始读,因此要不断右移
if (SDA_R)     // #define SDA_R SDA 双向数据线的电平读取
{                            //也许大家会有疑问在这里就可以对电平进行读取了?
dat |= 0x80;   //不是还没有下降沿的制造吗,怎会有数据为传输到SDA线上
}                            //大家别忘了,前面说过,第一个数据字节的第一个下降沿发生后,
else                      //命令字的最后一位写入,也就是说写操作的最后一位和读操作的第一位
{                          //的传输是紧接发生的,当你写入要读的寄存器的地址,传送的字节的
dat &= 0x7F;  //第一位当然是已经到了SDA线上。
}
SCK_SET;         //时钟周期的电平置高置低,制造上升,下降沿
SCK_CLR;
}
return dat;
}

void Write_Ds1302_Byte(unsigned char dat) 
{
unsigned char i;
SCK = 0;
for (i=0;i<8;i++) 

if (dat & 0x01)        //同样是从最低位开始写
{
SDA_SET; //#define SDA_SET SDA=1 
}
else 
{
SDA_CLR; //#define SDA_CLR SDA=0 
}  
SCK_SET;                //同样是制造上升下降沿,用于数据传输
SCK_CLR;
dat = dat >> 1;  

}

上面说了根据时序来编写DS1302的读写程序,但我们还需要对指定寄存器进行读写操作,这样我们就得知道寄存器的地址。各寄存器地址如下图所示:


DS1302内部一共有12个寄存器,其中七个寄存器与时钟,日历有关,没错,就是上表中的前七个,寄存器中的数据是二----十进制的BCD码。

下面说说这七个寄存器中比较特殊的两个寄存器:秒寄存器和小时寄存器。

秒寄存器:BIT7位,时间暂停位,当为1时,时钟振荡器停止工作,DS1302进入低功耗模式,当为0时,DS1302正常工作。

小时寄存器:BIT7用来选择12小时还是24小时工作模式,很显然为1是12小时工作模式,为0是24小时工作模式,BIT5为AM/PM位,为0是AM模式,为1是PM模式。

上表中的倒数第二个为写保护寄存器:WP是写保护位,工作时,除WP外的其他位都置0,对时钟寄存器或RAM进行写操作之前,WP必须置为0,当WP为1,不得对任何时钟寄存器或者RAM进行写操作。

下面说一下对指定寄存器进行读写操作。依旧给出蓝桥杯官网给出的代码。

unsigned char Ds1302_Single_Byte_Read(unsigned char addr) 

unsigned char temp;
RST_CLR;   //CE引脚置低
SCK_CLR;   //时钟线拉低


RST_SET; //CE引脚置高,开始数据传输
addr = addr | 0x01;  //前面说过,要进行读操作,控制字最后一位应置1
Write_Ds1302_Byte(addr);    //写入地址
temp=Read_Ds1302_Byte();   //读出数据
RST_CLR;                             //CE引脚拉低
return temp;

}

void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)



RST_CLR;
SCK_CLR;


RST_SET;
addr = addr & 0xFE;         //同样,控制字最后一位置0,确保是写操作
Write_Ds1302_Byte(addr);  //写地址
Write_Ds1302_Byte(dat); //写数据
RST_CLR;  

}

好,最基本的函数讲解介绍完了,这些也是蓝桥杯大赛时给出的库函数,下面我将介绍利用这些函数完成DS1302的初始化以及读写DS1302的操作。

初始化函数如下所示:

void Init_DS1302(void)
{
Ds1302_Single_Byte_Write(0x8e,0x00);
Ds1302_Single_Byte_Write(ds1302_sec_addr,0x00);
Ds1302_Single_Byte_Write(ds1302_min_addr,0x20);
Ds1302_Single_Byte_Write(ds1302_hr_addr,0x09);
Ds1302_Single_Byte_Write(ds1302_date_addr,0x25);
Ds1302_Single_Byte_Write(ds1302_month_addr,0x12);
Ds1302_Single_Byte_Write(ds1302_day_addr,0x06);
Ds1302_Single_Byte_Write(ds1302_year_addr,0x10);
Ds1302_Single_Byte_Write(ds1302_charger_addr,0x01);
Ds1302_Single_Byte_Write(0x8e,0x80);

}

当然还有对应的一些宏定义:

#define ds1302_sec_addr 0x80
#define ds1302_min_addr 0x82
#define ds1302_hr_addr 0x84
#define ds1302_date_addr 0x86
#define ds1302_month_addr 0x88
#define ds1302_day_addr 0x8A

#define ds1302_year_addr 0x8C

没错,初始化就是在相应地址写上相应的初始化操作数据。

当初始化完成之后,就可以与DS1302进行通信了,即配合使用上面的函数就可以读出相应寄存器的内容。



猜你喜欢

转载自blog.csdn.net/qq_33656619/article/details/79555567
今日推荐