实时时钟ISL1208原理与应用
#include reg51.h>
#define ISLwr 0xde /*写辨识字节*/
#define ISLrd 0xdf /*读辨识字节*/
/*--------ISL1208管脚配置---------*/
sbit ISLSCL=P1^6; /*时钟*/
sbit ISLSDA=P1^7; /*数据*/
void sdelay(); /*短延时*/
void ISLstart(); /*I2C起始位*/
void ISLstop(); /*I2C停止位*/
void GetACK(); /*主机等待应答(GACK)*/
void OutACK(); /*主机应答(OACK)*/
/*--------读/写ISL1208函数--------*/
unsigned char readISL1208();
void writeISL1208(unsigned char datas);
/*-----------读/写寄存器-------------*/
void writeREG(unsigned char adds,unsigned char datas);
unsigned char readREG(unsigned char adds);
bit flag=0; /*启动时钟报警标志位*/
unsigned char alarm=0; /*报警时间参数*/
main()
{ ……………….. /*初始化*/
for(;;) /*等待上位机发送命令*/
{ if(flag = =1)
break; }
/*写状态寄存器,写RTC使能,报警自动复位*/
writeREG(0x07,0x90);
/*写中断寄存器,单事件报警,中断使能*/
writeREG(0x08,0x60);
/*写报警寄存器,报警使能*/
writeREG(0x0c,0x81);
/*写时钟寄存器,启动RTC*/
writeREG(0x00,0x00);
for(;;); /*等待*/ }
void writeREG(unsigned char adds,unsigned char datas)
{ ISLstart();
writeISL1208(ISLwr);
GetACK();
writeISL1208(adds); /*写地址*/
GetACK();
writeISL1208(datas); /*写命令/数据*/
GetACK();
ISLstop(); }
unsigned char readREG(unsigned char adds)
{ unsigned char reg;
ISLstart();
writeISL1208(ISLwr);
GetACK();
writeISL1208(adds); /*写地址*/
GetACK();
ISLstart();
writeISL1208(ISLrd);
GetACK();
reg=readISL1208(); /*读就寄存器值*/
OutACK();
ISLstop();
return (reg); }
unsigned char readISL1208()
{ unsigned char i,k=0;
ISLSDA=1;
for(i=0;i8;i++)
{ ISLSCL=1;
k=k*2;
if(ISLSDA==1)
k=k+1;
ISLSCL=0; }
return (k); }
void writeISL1208(unsigned char datas)
{ unsigned char data i;
ISLSCL=0;
for(i=0;i8;i++)
{ ISLSDA=(bit)(datas0x80);
datas=datas1;
sdelay();
ISLSCL=1;
sdelay();
ISLSCL=0; } }
void int0() interrupt 0 using 1 /*外部中断0处理函数*/
{ unsigned char temp=0,reg;
/*单报警模式,5秒/次报警时间算法*/
alarm=(alarm+5)%60;
temp=alarm/10;
temp=4;
temp=(temp+alarm%10)|0x80;
/*读状态寄存器清除报警标志*/
reg=readREG(0x07);
/*写报警寄存器,确定下次报警时间*/
writeREG(0x0c,temp);
}
4.3 后背电容器的使用
具体电路结构如图3。电容器的大小通过计算得出:若后背电容供电时间为两个月且Vcc=5.0V,Vbat电压从4.7V下降到1.8V(时钟最低工作电压)。假定二极管漏电流ILKG很小并可忽略。则电容充电/放电方程为:IBAT=CBAT*dV/dT,整理后得后备供电时间:dT=CBAT*dV/ IBAT。由于IBAT随VBAT基本上呈线性变化,这样IBAT可近似取两点之间的平均值。IBAT与VBAT之间的典型线性关系方程式为:IBAT=1.031E-7* VBAT +1.036E-7 A
若已给出两点电压,则平均电流IBATAVG=5.155E-8*(VBAT2+VBAT1)+1.036E-7 A
结合以上方程整理后得后备供电时间TBACKUP=CBAT*(VBAT2 -VBAT1)/IBATAVG s
将上述方程改写为:CBAT=TBACKUP* IBATAVG /(VBAT2 -VBAT1)
其中:TBACKUP=60天*86400秒/天=5.18E6 s,IBATAVG=4.387E -7 A,VBAT2=4.7V,VBAT1=1.8V.则CBAT=5.18E6* 4.387E-7 / 2.9 =0.784 F,如果要包括30%的容度,则最坏情况下的电容值应为CBAT=1.3*0.784=1.02 F.
5. 小结
ISL1208是一种小巧(SOIC封装)、低功耗、低成本的实时时钟芯片,集时钟、日历、RAM、电源故障检测、报警功能由于一身,硬件结构简单、编成简便、精度高,在多功能电表、HVAC设备、音频/视频元件、寻呼机/PDA、家用电器及其它工业/医疗/汽车电子产品中都有十分广泛的应用前景。
参考文献
1. INTERSIL I2C Real Time Clock/Calendar ISL1208 Data Sheet. October 29,2004.
2.徐爱钧,彭秀华. 单片机高级语言C51应用程序设计. 电子工业出版社,1998年6月.
3.张道明,郝继飞. 基于MATLAB的MCU串行通信. 信息技术与信息化,2004(5).
评论