实时时钟ds1307 介绍:
ds1307是低功耗、两线制串行读写接口、日历和时钟数据按bcd码存取的时钟/日历芯片。它提供秒、分、小时、星期、日期、月和年等时钟日历数据。另外它还集成了如下几点功能:
(1)56 字节掉电时电池保持的nv sram 数据存储器
(2)可编程的方波信号输出
(3)掉电检测和自动切换电池供电模式
ds1307 把8 个寄存器和56 字节的ram 进行了统一编址,具体地址和寄器数据组织格式如下表:
(日期为bcd码)
在读写过程中ds1307 内部维护一个地址指针,通过写操作可对它 值,读和写每一字节时自动加一,当指针越过ds1307 内部ram 尾 时指针将返回到0 地址处。
ds1307 的时钟和日历数据按bcd 码存储。
ds1307引脚图及功能
ds1307
串行实时时钟记录年、月、日、时、分、秒、星期及日期; am、pm 分别表示上午和下午; 56 个字节的nvram存放数据; 2线串口; 可编程的方波输出;电源故障检测及自动切换电路;电池电流小于500na。
主要引脚定义如下: x1、32.768khz 晶振接入端;
vbat:x2:+3v 电池电压输入;
sda: 串行数据;
scl:串行时钟;
sqw/out:方波/输出驱动器。
方波信号输出功能
方波信号输出功能从sqw/out 引脚输出设置频率的方波,control 寄存器用于控制sqw/out 脚的输出。
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)于设定输出波形的频率,如下表:
要注意的是,00h 地址的第7 位为器件时钟允许位(ch),由于在在开始上电时内部ram内容随机,所以在初始化时将ch 位设零(时钟允许)是非常重要的。
ds1307 在twi 总线上是从器件,地址(sla)固定为”11010000”
ds1307 写操作 twi 被控接收模式
主控器件按如下顺序将数据写入到ds1307 寄存器或内部ram 中:
第一步.start 信号
第二步。写sla+w(0xd0)字节,ds1307 应答(ack)
第三步。写1 字节内存地址(在以下第四步写入的第一字节将存入到ds1307 内该地址处),ds1307应答。
第四步。写数据(可写多个字节,每一字节写入后ds1307 内部地址计数器加一,ds1307 应答)
第五步.stop 信号
ds1307 读操作twi 被控发送模式
主控器件按如下顺序将ds1307 寄存器或内部ram 数据读取:
第一步.start 信号
第二步。写sla+r(0xd1)字节,ds1307 应答(ack)
第三步。读数据(可读多个字节,读取数据的ds1307 内部地址由上次写操作或读操作决定,读取每一字节ds1307 内部地址计数器加一,主器件应答,读取最后一字节时主器件回应一nack信号)
第四步.stop 信号
典型应用电路图
特征
实时时钟(rtc)计算秒,分钟,小时,月,月,日的日期周和年份,闰年补偿,有效期至2100年
56字节,由电池供电,通用ram与无限写操作i2c串行接口可编程方波输出信号
自动电源失效检测和切换电路消耗的电池备份超过500na的少与振荡器运行模式
可选的工业温度范围:-40°c至+ 85°c提供8引脚塑料dip或so
美国保险商实验室(ul)认证
ds1307 c语言程序
//********************************************************************
//***************************ds1307调试 *****************************
//********************************************************************
//**ds1307实时时钟芯片地址0xd0 读0xd1 写0xd0 *********************
//********************************************************************
#include《reg51.h》 //单片机80c51
sbit scl=p1^1; //串口时钟信号
sbit sda=p1^0; //串口数据信号
sbit clock=p1^2; //调试用脉冲输出信号**************
unsigned char error; //通讯正常error=0x10;超时error=0x11
void delay(int i); //延时子函数
void timeinitial(); //时钟初始化子函数
void start_i2c(); //打开串口子函数
void stop_i2c (); //关闭串口子函数
void ack_i2c(); //接受应答信号并判断是否正常子函数
void sendack(); //发送应答信号子函数
void sendnotack(); //发送非应答信号子函数
void send_i2c (int ch); //向总线上发送一个字节
unsigned int receive_i2c(); //在总线上接受一个字节
int read_time(int address); //从芯片d1307读出10为字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字
void write_time(int address,int date); //向芯片d1307 之中地址为address的寄存器写入数据date 仅为八位字节
void main() //主程序************************************************************
{
timeinitial(); //时钟初始化
write_time(0x07,0x10); //向芯片d1307写入控制字(芯片地址0x07)0x10 控制字:1晶振使能(0有效)4:sout方波输出 7、8:方波频率编码
while(1)
{
}
}
void timeinitial() //时钟初始化
{
tmod=0x10; //时钟选择方式2 t1时钟
th1=0x15;
tl1=0xa0; //定时60ms
ea=1; //中断准许
et1=1; //时钟t1 溢出中断准许
tr1=1; //启动时钟t1
}
//**********************************延时
void delay(int i)
{
int j,h;
for(j=1;j《99;j++)
{
for(h=0;h《i;h++)
;
}
}
//**********************************传送启动
void start_i2c()
{
ea=0; //关闭中断
scl=0; //总线放空,以便更改总线数据
delay(1); //延时
sda=1; //发送i2c总线起始条件的数据信号1以便总线使能时产生下降沿
delay(1); //延时
scl=1; //发送i2c总线起始条件的时钟信号
delay(1); //延时
sda=0; //产生下降沿 总线传输开始
delay(1); //延时
scl=0; //时钟线从高到低一次跳变,总线放空 准备传输数据
}
//**********************************传送关闭
void stop_i2c ()
{
scl=0; //发送i2c总线时钟信号放空
sda=0; //发送i2c总线停止条件的数据信号0以便产生上升沿
delay(1); //延时
scl=1; //时钟线从低到高一次跳变 总线 使能
delay(1); //延时
sda=1; //发送i2c总线数据信号产生上升沿 终止传送
delay(1); //延时
scl=0; //发送i2c总线时钟信号放空
delay(1);
sda=0; //发送i2c总线放空 准备下次动作
ea=1; //传输结束开启中断
}
//**********************************传送响应
void ack_i2c()
{
unsigned char errtime=255; //因故障接收方无ack,超时值为255。
sda=1; //数据线升高,以便捕捉相应信号,(相应信号:拉低数据线)
scl=1; // 主机放出一脉冲,等待捕捉相应信号
error=0x10; //通讯正常(即:接受到了相应信号)为0x10;
while(sda) //等待捕捉相应信号,信号没有到来前一直保持循环,信号到来后迅速跳出循环
{
errtime--; //每循环一次,倒计时减一
if(!errtime) //判断倒计时是否减到了0,即循环了255次,如果减到了0,判定此次通讯未接受到响应信号,传送失败
{
stop_i2c (); //传送失败,停止传送
error=0x11; //传送结果未传送失败0x11
return; //跳出循环
}
}
scl=0; //无论传送是否正确,都需放空总线,以备后用
}
//**********************************向总线传送响应
void sendack()
{
sda=0; //数据线保持拉低,时钟线发生一次从高低的跳变 发送一个应答信号
delay(1);
scl=1;
delay(1);
scl=0;
}
//**********************************向总线传送非响应
void sendnotack()
{
sda=1; //数据线保持高,时钟线发生一次从高低的跳变 没有应答
delay(1);
scl=1;
delay(1);
scl=0;
}
//**********************************向总线传送字节
void send_i2c (int ch)
{
int i;
for (i=1;i《=8;i++) //发送八位
{
scl=0; //总线放空
delay(1); //延时
sda=(ch&0x80); //根据给定数据,又高位到低位逐步提出字节位,发送到总线上
ch《《=1; //左循环以便输出下一位
delay(1); //延时
scl=1; //总线使能,发送总线数据
delay(1); //延时
}
scl=0; //总线8位传送完成,总线放空
}
//**********************************向总线读入字节
unsigned int receive_i2c()
{
unsigned char i,a;
sda=1; //不知道为啥,1的时候读入正确 0的时候读入全部为0;
for (i=1;i《=8;i++) //读入八个位
{
a《《=1; // 读入数据左循环
scl=0; //总线放空
delay(1);
scl=1; //时钟做一次从低到高的跳变 可以接收一位数据
delay(1);
a|=sda; // 将数据编入变量a
}
scl=0; //总线放空
return a; //反馈接收到的信息
}
//**********************************向芯片d1307 之中地址为address的寄存器写入数据date 仅为八位字节
void write_time(int address,int date)
{
start_i2c(); //启动总线
send_i2c (0xd0); //呼叫芯片d1307,并定义为 写 动作
ack_i2c(); //等待响应信号
send_i2c (address); //发送地址
ack_i2c(); //等待响应信号
send_i2c (date); //发送数据
ack_i2c(); //等待响应信号
stop_i2c (); //停止总线
}
//****************从芯片d1307读出10为字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字
int read_time(int address)
{
int a[10]; //定义一个数组以便接受数据
int i=1;
start_i2c(); //启动传送
send_i2c (0xd0); //呼叫芯片d1307,并定义为 写 动作
ack_i2c(); //等待响应信号
send_i2c (0x00); //发送起始地址
ack_i2c(); //等待响应信号
stop_i2c (); //关闭总线
start_i2c(); //启动总线
send_i2c (0xd1); //呼叫芯片d1307,并定义为 读 动作
sendack(); //发送应答就位,准备接受数据
for(i;i《10;i++)
{
a[i]=receive_i2c(); //接受自初始地址开始的10个字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字
sendack(); //每成功接受一位发送一个响应信号 以便接受下一位
}
stop_i2c (); //接受完成停止
return a[address]; //反馈所需数据
}
void t1(void) interrupt 3 using 0 //t1溢出中断
{
th1=0x15;
tl1=0xa0; //重新载入60ms
clock=~clock; //调试用脉冲
p0=read_time(1); //将实时时钟 秒 送入p0口
}
详解Netty高性能异步事件驱动的网络框架
光电传感器的三大应用行业
关于PCB高精密表面修饰新工艺研发
IR2110反相延时驱动电路
安科瑞工厂用AFRD防火门监控系统 可在256点实时接收数据
ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路)
高效率、宽输入 (“冷车发动”) 范围双通道 5V/8.5V 转换器
国产IGBT,任重而道远!
龙芯中科在鹤壁建立首个芯片封装项目
CAN网络-其特性阻抗及终端阻抗
凌壹科技ITX-H81T-6CD8嵌入式主板介绍
IS31FL3236A-QFLS2-TR参数简介
PCB设计Protel99 SE 转Gerber Files的详细流程
小米电视5系列正式发布 售价最低2999最高9999
EMC设计的4大要点,电源系统处理,信号的考虑,布局和ESD问题的概述
pcb打样和抄板的区别
现代战争中常见的电子干扰分析
电位差计的测量原理及使用方法
高效率升压转换器是延长电池使用寿命的关键
纳微半导体宣布开设全新电动汽车设计中心