高精度实时时钟SD2405系列.docx

上传人:b****5 文档编号:5684977 上传时间:2022-12-31 格式:DOCX 页数:21 大小:257.09KB
下载 相关 举报
高精度实时时钟SD2405系列.docx_第1页
第1页 / 共21页
高精度实时时钟SD2405系列.docx_第2页
第2页 / 共21页
高精度实时时钟SD2405系列.docx_第3页
第3页 / 共21页
高精度实时时钟SD2405系列.docx_第4页
第4页 / 共21页
高精度实时时钟SD2405系列.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

高精度实时时钟SD2405系列.docx

《高精度实时时钟SD2405系列.docx》由会员分享,可在线阅读,更多相关《高精度实时时钟SD2405系列.docx(21页珍藏版)》请在冰豆网上搜索。

高精度实时时钟SD2405系列.docx

高精度实时时钟SD2405系列

高精度实时时钟完全解决方案-SD2405系列

内置电池、晶振、串行NVSRAM/EEPROM、12字节RAM、IIC接口、多种中断输出、高精度、免调校

SD2400系列是一种具有内置晶振、支持IIC串行接口的高精度实时时钟芯片,CPU可使用该接口通过5位地址寻址来读写片内32字节寄存器的数据(包括时间寄存器、报警寄存器、控制寄存器、通用SRAM寄存器)。

SD2400系列内置晶振,该芯片可保证时钟精度为±5ppm(在25℃下),即年误差小于2.5分钟;该芯片内置时钟精度调整功能,可以在很宽的范围内校正时钟的偏差(分辨力3ppm),通过外置或内置的数字温度传感器可设定适应温度变化的调整值,实现在宽温范围内高精度的计时功能。

SD2400系列内置的一次性工业级电池或充电电池可保证在外部掉电情况下时钟使用寿命为5~8年时间;内部具备电源切换电路,当芯片检测到主电源VDD掉到电池电压以下,芯片会自动转为由备电电池供电。

SD2400系列内置单路定时/报警中断输出,报警中断时间最长可设至100年;内置频率中断输出和倒计时中断输出。

SD2400系列采用了多种提高芯片可靠性的技术,可满足对实时时钟芯片的各种需要,是在选用高精度实时时钟时的理想选择。

l低功耗:

1.0μA典型值(时钟电路部分,Ta=25℃)。

l工作电压:

3.3V~5.5V,工作温度:

民用级0℃~70℃,工业级-40℃~85℃。

l标准IIC总线接口方式,时钟电路最高速度400KHZ(4.5V~5.5V)。

l年、月、日、星期、时、分、秒的BCD码输入/输出,并可通过独立的地址访问各时间寄存器。

l闰年自动调整功能(从2000年~2099年)。

l可选择12/24小时制式.

l内置年、月、日、星期、时、分、秒共7字节的报警数据寄存器及1字节的报警允许寄存器。

l内置12字节通用SRAM寄存器可用于存储用户的一般数据。

l三种中断均可选择从INT脚输出,并具有两个中断标志位.

l可设定并自动重置的单路报警中断功能(时间范围最长设至100年),年、月、日、星期、时、分、秒报警共有96种组合方式,并有单事件报警和周期性报警两种中断输出模式.

l周期性频率中断输出:

从32768Hz~1/16Hz……1秒共十五种方波脉冲.

l自动重置的8位倒计时定时器,可选的4种时钟源(4096HZ、64HZ、1HZ、1/60HZ)。

l内置晶振,出厂前已对时钟进行校准,时钟精度为±5ppm(在25℃±1℃下),即年误差小于2.5分钟。

l内置时钟精度数字调整功能,可通过程序来调整走时的快慢。

用户采用外置或内置的温度传感器,设定适应温度变化的调整值,可实现在宽温范围内高精度的计时功能(在-10℃~50℃小于5ppm,在-40℃~85℃小于10ppm)。

l内置备电自动切换功能,芯片依据不同的电压自动从VDD切换到VBAT或从VBAT切换到VDD。

l在VBAT模式下,芯片具有中断输出允许或禁止的功能,可满足在备用电池供电时输出中断的需要。

l内置的充电电池及充电电路,累计电池电量超过550mAh,电池使用寿命为5~8年时间;内置的一次性民用级电池使用寿命为3~5年,一次性工业级电池使用寿命为5~8年时间。

l内置的16kbit~256kbit非易失性SRAM(C/D/E型),其读写次数为100亿次,且内部写延时小于300ns。

l内置的2kbit~256kbitE2PROM(F/B/C/D/E型),其擦写次数100万次

l内置IIC总线0.5秒自动复位功能(从Start命令开始计时),保证时钟数据的有效性及可靠性,避免总线挂死问题。

l内置三个时钟数据写保护位,避免对数据的误写操作,可更好地保护时钟数据。

l内置VBAT模式IIC总线通信禁止功能,从而避免在电池供电时CPU对时钟操作所消耗的电池电量,也可避免在主电源上、下电的过程中因CPU的I/O端口所输出的不受控的杂波信号对时钟芯片的误写操作,进一步提高时钟芯片的可靠性。

l内置上电复位电路及指示位;内置电源稳压,内部计时电压可低至1.5V。

l芯片管脚抗静电(ESD)>4KV。

l芯片在兴威帆的评估板上可通过4KV的群脉冲(EFT)干扰。

l封装形式:

SD2400/2401/2404-24脚的DIP封装,SD2402/2405/2406-16脚窄形DIP封装,SD2403-8脚的DIP封装;有工业级型号,其尾缀加“I”以示区分,如“SD2400API”为SD2400AP的工业级,“P”标志为直插封装形式。

**************************************************

;奥宇星单片机工作室

;  

;Copyright2009aoyuxMcuStudio

;AllrightsReserved

;作者:

奥宇星       QQ:

393193589

;AT89S52晶振频率为11.0592MHz指令周期:

1.085069us

功能说明:

电子日历实例程序

;********************************************************************************************/

#include"reg52.h"

#include"intrins.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitkey=P1^0;//;按键控制状态标志

sbitsda=P1^1;//;SD7218模拟I2C数据传送位

sbitscl=P1^2;//;SD7218模拟I2C时钟控制状态标志

sbitsda_sd2405=P3^4;//;SD2405模拟I2C数据传送位

sbitscl_sd2405=P3^5;//;SD2405模拟I2C时钟控制状态标志

ucharHours;//定义-----时

ucharMinutes;//定义---分

ucharSeconds;//定义---秒

ucharYear;//定义------年

ucharMonth;//定义-----月

ucharDate;//定义------日期

ucharWeeks;//定义-----星期

ucharcounter;//时间按键标志计数器

ucharcounter2;//日期按键标志计数器

ucharcodeDispTab[]={0,1,2,3,4,5,6,7,8,9,0xa,0xb,0xc,0xd,0xe,0xf};//1602:

0~9andA~F数字/字母

voiddelay1(uintz)//延时为1ms

{

ucharx,x1;

for(;z>0;z--)

{

for(x=0;x<114;x++)

{

for(x1=0;x1<1;x1++);

}

}

}

voiddelay()//30us延时

{

uchari;

i=30;

while(i>0)

{

i--;

}

}

voidstar()//开始

{

sda=1;

delay();//30us延时

scl=1;

delay();//30us延时

sda=0;

delay();//30us延时

}

voidstop()//停止

{

sda=0;

delay();//30us延时

scl=1;

delay();//30us延时

sda=1;

delay();//30us延时

}

voidack()//应答

{ucharz=0;

while((sda==1)&&(z<50))z++;//条件判断,sda=1,则没有应答。

如果没有应答则延时:

z<50,z++;后返回

scl=0;

delay();//延时

}

///写一个数据函数

//器件写地址slave_write_address

//字节地址byte_address

//待写入数据data_data

voidwrite(ucharslave_write_address,byte_address,uchardata_data)//写一个数据

{

uchartemp,temp1,i,ii;

star();//开始

for(ii=0;ii<3;ii++)//根据I2C资料,和时序图,按顺序送:

器件写地址,字节地址,数据

{

if(ii==0)

{

temp=slave_write_address;//送器件写地址

temp1=slave_write_address;

}

elseif(ii==1)

{

temp=byte_address;//送数据

temp1=byte_address;

}

elseif(ii==2)

{

temp=data_data;//送数据

temp1=data_data;

}

for(i=0;i<8;i++)

{

scl=0;

delay();//延时

temp=temp1;

temp=temp&0x80;//相与后,把不相关的位清零

if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1

sda=1;

else

sda=0;

delay();//延时

scl=1;

delay();//延时

scl=0;

delay();//延时

temp1=temp1<<1;//向左移出1位

}

sda=1;

delay();//延时

scl=1;

delay();//延时

ack();

}

stop();//停止

}

///读一个数据函数

//器件写地址slave_write_address

//器件读地址slave_read_address

//字节地址byte_address

//读出的数据data_data

read(ucharslave_write_address,ucharslave_write_Directive)//读一个数据

{

uchartemp,temp1,i,ii,x,data_data;

star();//开始

for(ii=0;ii<2;ii++)//根据I2C文档资料,和时序图,按顺序送:

器件写地址,字节地址,数据

{

if(ii==0)

{

temp=slave_write_address;//送器件写地址

temp1=slave_write_address;

}

elseif(ii==1)

{

temp=slave_write_Directive;//送数据

temp1=slave_write_Directive;

}

for(i=0;i<8;i++)//开始读数据

{

scl=0;

delay();//5us延时

temp=temp1;

temp=temp&0x80;//相与后,把不相关的位清零

if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1

sda=1;

else

sda=0;

delay();//延时

scl=1;

delay();//延时

scl=0;

delay();//延时

temp1=temp1<<1;//向左移出1位

}

sda=1;

delay();//延时

scl=1;

delay();//延时

ack();//应答

}

for(x=0;x<8;x++)

{

data_data=data_data<<1;//向左移入1位

sda=1;

delay();//延时

scl=0;

delay();//延时

scl=1;

delay();//延时

if(sda==1)//判断数据线是否是高电平

data_data|=0x01;//把读到的数据或0X01

//else

//data_data|=0x00;

}

ack();//应答

stop();//停止

returndata_data;//返回读到的数据

}

//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////

//sda_sd2405=P3^4;//;SD2405模拟I2C数据传送位

//sbitscl_sd2405=P3^5

//

voiddelay_sd2405()//5us延时

{

_nop_();

_nop_();

_nop_();

_nop_();

}

voidstar_sd2405()//开始

{

sda_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

while(~sda_sd2405);//检测数据线是否被钳位

sda_sd2405=0;

delay_sd2405();//5us延时

}

voidstop_sd2405()//停止

{

sda_sd2405=0;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

sda_sd2405=1;

delay_sd2405();//5us延时

while(~sda_sd2405)

{

sda_sd2405=0;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

sda_sd2405=1;

delay_sd2405();//5us延时

}

}

voidack_sd2405()//应答

{ucharz1=0;

while((sda_sd2405==1)&&(z1<50))z1++;//条件判断,sda=1,则没有应答。

如果没有应答则延时:

z<50,z++;后返回

scl_sd2405=0;

delay_sd2405();//5us延时

}

///写一个数据函数

//器件写地址slave_write_address

//字节地址byte_address

//待写入数据data_data

voidwrite_sd2405(ucharslave_write_address,ucharbyte_address,uchardata_data)//写一个数据

{

uchartemp,temp1,i,ii;

star_sd2405();//开始

for(ii=0;ii<3;ii++)//根据I2C文档资料,和时序图,按顺序送:

器件写地址,字节地址,数据

{

if(ii==0)

{

temp=slave_write_address;//送器件写地址

temp1=slave_write_address;

}

elseif(ii==1)

{

temp=byte_address;//送字节地址

temp1=byte_address;

}

elseif(ii==2)

{

temp=data_data;//送数据

temp1=data_data;

}

for(i=0;i<8;i++)

{

scl_sd2405=0;

delay_sd2405();//5us延时

temp=temp1;

temp=temp&0x80;//相与后,把不相关的位清零

if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1

sda_sd2405=1;

else

sda_sd2405=0;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=0;

delay_sd2405();//5us延时

temp1=temp1<<1;//向左移出1位

}

sda_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

ack_sd2405();

}

stop_sd2405();//停止

}

///读一个数据函数

//器件写地址slave_write_address

//器件读地址slave_read_address

//字节地址byte_address

//读出的数据data_data

read_sd2405(ucharslave_write_address,ucharbyte_address,ucharslave_read_address)//读一个数据

{

uchartemp,temp1,i,ii,x,data_data;

star_sd2405();//开始

for(ii=0;ii<3;ii++)//根据I2C文档资料,和时序图,按顺序送:

器件写地址,字节地址,器件读地址

{

if(ii==0)

{

temp=slave_write_address;//送器件写地址

temp1=slave_write_address;

}

elseif(ii==1)

{

temp=byte_address;//送字节地址

temp1=byte_address;

}

elseif(ii==2)

{

star_sd2405();//开始

temp=slave_read_address;//送器件读地址

temp1=slave_read_address;

}

for(i=0;i<8;i++)//开始读数据

{

scl_sd2405=0;

delay_sd2405();//5us延时

temp=temp1;

temp=temp&0x80;//相与后,把不相关的位清零

if(temp==0x80)//根据前面相与后,判断temp是否等于0x80,是则该位为1

sda_sd2405=1;

else

sda_sd2405=0;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=0;

delay_sd2405();//5us延时

temp1=temp1<<1;//向左移出1位

}

sda_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

ack_sd2405();//应答

}

for(x=0;x<8;x++)

{

data_data=data_data<<1;//向左移入1位

sda_sd2405=1;

delay_sd2405();//5us延时

scl_sd2405=0;

delay_sd2405();//5us延时

scl_sd2405=1;

delay_sd2405();//5us延时

if(sda_sd2405==1)//判断数据线是否是高电平

data_data|=0x01;//把读到的数据或0X01

//else

//data_data|=0x00;

}

ack_sd2405();//应答

stop_sd2405();//停止

returndata_data;//返回读到的数据

}

//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////

voidinit()//0x50是器件写地址;0xff是待写入的数据或指令)

{

//TMOD=0x10;//定时器T1工作于方式1,16位计数器

//TH1=0x4b;

//TL1=0xff;

//EA=1;//开总中断允许

//ET1=1;//开定时器T1允许控制

//PT1=1;//开定时器T1中断为最高优先级

//TR1=1;//T1开始运行

//write(0x50,0x6a);//测试指令:

//write(0x50,0x68);//复位(清除)指令:

//write(0x50,0x61);//左移指令:

//write(0x50,0x62);//右移指令:

//write(0x50,0x63);//循环左移指令:

//write(0x50,0x64);//循环右移指令:

//Hours=21;//定义-----时

//Minutes=43;//定义---分

//Seconds=0;//定义---秒

//Year=20;//定义------年

//Month=20;//定义-----月

//Date=20;//定义------日期

//Weeks=5;//定义-----星期

counter=0;

counter2=0;

write(0x50,0x47,0x00);//数码管初始化

write(0x50,0x46,0x00);//数码管初始化

write(0x50,0x45,0x00);//数码管初始化

write(0x50,0x44,0x00);//数码管初始化

write(0x50,0x43,0x00);//数码管初始化

write(0x50,0x42,0x00);//数码管初始化

write(0x50,0x41,0x00);//数码管

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1