DS1307中文说明(含程序)

DS1307中文说明(含程序)
DS1307中文说明(含程序)

DS1307 时钟芯片中文资料及程序

§1:实时时钟 DS1307 简介

DS1307 是低功耗、IIC 接口、日历和时钟数据,按 BCD 码存取的时钟/日历芯片。它提供秒、分、小时、星期、日期、月和年等时钟日历数据。

§2:引脚与接线

DS1307 典型接线如图 1 所示。BT1 为备用电池,3V,7 脚为方波输出,通常把该脚接到单片机的能够产生电平变化中断的引脚,如设置成每秒输出1个方波,则会每秒中断一次,读取时间用以显示。图1中的R1、R2、R4是必须的上拉电阻。

图 1 DS1307典型接线图

§3:DS1307 RAM

DS1307 寄存器统一编址,其中的时间相关的和寄器数据组织格式如表 1。

表1时间相关的寄存器说明

注:存放时的单元02的位6为12/24小时设置位,1为12时制,0为24时制。位5为上午/

下午(AM/PM)指示位,0为上午(AM),1为下午(PM),在24时制中,该位为10倍时位。

在读写过程中DS1307内部有一个地址指针,通过写操作可对它赋值,读和写每一字节时自动加一,当指针越过DS1307内部RAM尾时指针将返回到0地址处。

DS1307 的时钟和日历数据按 BCD 码存储。

§4:方波信号输出功能

方波信号输出功能从SQW/OUT引脚输出设置频率的方波,CONTROL寄存器用于控制SQW/OUT脚的输出,其地址为07,每位的内容如表2。

表2CONTROL寄存器位

BIT7(OUT):此位表示在方波输出被禁止时(BIT4=0),SQW/OUT 引脚的逻辑电平,在BIT4=0(SQWE=0方波输出禁止)时,若BIT7(OUT)为1则SQL/OUT引脚为高电平,反之亦然。

BIT4(SQWE)方波输出允许/禁止控制位,SQWE =1 允许方波输出(有效);BIT4=0

禁止方波输出。

BIT0(RS0)、BIT1(RS1)于设定输出波形的频率,如表 3。

表 3 CONTROL寄存器说明

由于DS1307的方波输出脚为集电极开路,故要在外部加上上拉电阻!要注意的是,00h地址的第7位为器件时钟允许位(CH),此位为1则芯片未开

始工作,即时钟未走时,所以在上电时单片机要先读出秒,并判断位7(CH)是否为1,如为 1 要把该位清零写入秒寄存器(地址为 0),并把其他的时间单元设定为默认值。如果上电复位时读出的秒的最高位CH为0,说明时钟已工作(前已对CH 清0,且停电后有备用电池),此时不能重写时间单元!

§5:IIC 时序

DS1307 在 IIC 总线上是从器件,地址固定为”11010000”

DS1307 写操作,被控接收模式主控器件按如下顺序将数据写入

到DS1307寄存器或内部RAM中:

1.S TART 信号。

2.写地址+W(0xd0)字节,DS1307应答(ACK)。

3.写1字节的内存地址(在以下步4写入的第一字节数据将存入到内该地址处),DS1307 应答。

4.写数据,可写多个字节,每一字节写入后DS1307内部地址计数器加一,DS1307应答。

5.S TOP 信号。

写DS1707就是修改时间(除写地址为7的单元外),其时序图如图2。

图2单片机对DS1307写时序图

DS1307 读操作,被控发送模式

主控器件按如下顺序将DS1307寄存器或内部RAM数据读取:

1.S TART 信号。

2.写地址+读写位0b11010001),DS1307应答(ACK)。

3.读数据,可读多个字节,读取数据的DS1307内部地址由上次写操作或读操作决定,读取每一字节数据DS1307内部地址计数器自动加一,主器件应答,读取最后一字节时主器件回应NACK信号(不应答)。

4.S TOP 信号。

读DS1307的地址0-6的内容就是读取时间,其时序图如图3。

图3单片机对DS1307读时序图

以上所说的主控器件通常为单片机。

§6:编程要点

可以按如下宏定义:

//产生起始位,检测完成起始位?

#define Start_bit\

SEN=1;\

while (SEN==1)

//停止位,检查至停止位结束

#define Stop_bit\

PEN=1;\

while (PEN==1)

//发送重复开始,确定重复开始已完成?

#define Re_start_bit \

RSEN=1;\

while(RSEN==1)

//接收使能模式,确定接收使能?

#define Receive_enable_bit

\ RCEN=1; \ while

(RCEN==1)

//自动应答,检查是否完成应答?

#define Ack_bit \

ACKDT=0; \

ACKEN=1; \ while

(ACKEN==1)

//不应答,检查是否完成无应答?

#define Not_Ack_bit

\ ACKDT=1; \

ACKEN=1; \ while

(ACKEN==1)

有了以上的宏定义,我们就可以这样写程序://写 DS1307,地址为 address,数为 data

void WRITE_DS1307(char address,char data) { Start_bit;

IIC_SEND(ADDR);

IIC_SEND(address);

IIC_SEND(data);

Stop_bit;

}

其中的ADDR定义如下:

#define ADDR 0b11010000

其中的IIC_SEND函数如下:

//发送数 R 并等待发送完成,收到从机的应答

信号 void IIC_SEND(char R)

{SSPBUF=R; //发送 while

(RW==1);

while (SSPIF==0);//等待发送完成

while (ACKSTAT==1);//等待从机发送应答信号

NOP();

}

而读DS1307则可如下:

//读 DS1307,读出的结果在 AAAA[],初始地址为 START_ADDR,要读的数字

节数为 n //当 START_ADDR=0,n=7 时为时间

void READ_DS1307(char START_ADDR,char n)

{ char i;

Start_bit;

IIC_SEND(ADDR); //写寄存器地址

IIC_SEND(START_ADDR); //设定寄存器初始

地址 Stop_bit;

NOP();

Re_start_bit;

IIC_SEND(ADDR+1);//最后低位为 1 表示读

for (i=0;i

{ Receive_enable_bit;

AAAA[i]=SSPBUF; //读 1 字

节 if (i

{Ack_bit;}

else

{Not_Ack_bit;} //最后一字节不应答

}

Stop_bit;

}

关于IIC接口编程,详见《PIC16系列单片机C程序设计与PROTEUS仿真》中的第四章和第六章。

相关主题
相关文档
最新文档