📄 ds1302.c
字号:
#include "ds1302.h"
void wr_oneword_ds1302(uchar,uchar);
uchar rd_oneword_ds1302(uchar);
void delay1302(void);
uchar xdata rdtime[6] = {0};
uchar xdata inittime[6]={0};//初始时间(yy,mm,dd,hh,mm,ss)
sbit sck1302 =P1^5; //1302的clock
sbit sio1302 =P1^6; //1302的io口
sbit rst1302 =P1^7; //1302的rst
/************************************************************/
/*函数名:ds1302set
/*描述:设置1302的时间
/*输入:inittime:初始时间暂存区头指针
/*输出:无
/************************************************************/
void ds1302set(void)
{
uchar xdata *inittimeptr;
uchar ctrl1302; //存放1302控制码
uchar data1302; //存放1302数据
inittimeptr=inittime;
ctrl1302=0x8e;
data1302=0x00; //控制字(允许写)
wr_oneword_ds1302(ctrl1302,data1302);
ctrl1302=0x80; //禁止1302
data1302=0x80;
wr_oneword_ds1302(ctrl1302,data1302);
ctrl1302=0x8c; //写入年
data1302=*inittimeptr;
wr_oneword_ds1302(ctrl1302,data1302);
inittimeptr++;
ctrl1302=0x88; //写入月
data1302=*inittimeptr;
wr_oneword_ds1302(ctrl1302,data1302);
inittimeptr++;
ctrl1302=0x86; //写入日期
data1302=*inittimeptr;
wr_oneword_ds1302(ctrl1302,data1302);
inittimeptr++;
ctrl1302=0x84; //写入小时
data1302=*inittimeptr;
data1302&=0x7f;//24小时制
wr_oneword_ds1302(ctrl1302,data1302);
inittimeptr++;
ctrl1302=0x82; //写入分
data1302=*inittimeptr;
wr_oneword_ds1302(ctrl1302,data1302);
inittimeptr++;
ctrl1302=0x80;
data1302=*inittimeptr;
data1302|=0x80;
wr_oneword_ds1302(ctrl1302,data1302);
ctrl1302=0x80; //写入秒
data1302=*inittimeptr;
data1302&=0x7f;//开始计时
wr_oneword_ds1302(ctrl1302,data1302);
ctrl1302=0x90;
data1302=0xa5;
wr_oneword_ds1302(ctrl1302,data1302);//trikle charger
ctrl1302=0x8e; //结束(写保护)
data1302=0x80;
wr_oneword_ds1302(ctrl1302,data1302);
}
/***********************************************************/
/*函数名:ds1302read
/*描述:读出1302计数器中的当前值
/*输入:inittime:读出数据保存区的头指针
/*输出:无
/***********************************************************/
void ds1302read(void) //读1302内部数据
{
uchar ctrl1302;
uchar data1302;
uchar xdata *inittimep;
inittimep = rdtime;
ctrl1302=0x8e;
data1302=0x00; //控制字(允许写)
wr_oneword_ds1302(ctrl1302,data1302);
ctrl1302=0x8d; //读入年
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep = data1302;
inittimep++;
ctrl1302=0x89; //读入月
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep=data1302;
inittimep++;
ctrl1302=0x87; //读入日期
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep=data1302;
inittimep++;
ctrl1302=0x85; //读入小时
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep=data1302;
inittimep++;
ctrl1302=0x83; //读入分钟
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep=data1302;
inittimep++;
ctrl1302=0x81; //读入秒
data1302=rd_oneword_ds1302(ctrl1302);
*inittimep=data1302;
ctrl1302=0x8e; //结束(写保护)
data1302=0x80;
wr_oneword_ds1302(ctrl1302,data1302);
inittimep = rdtime;
// return(inittimep);
}
/*************************************************************/
/*函数名:wr_oneword_ds1302
/*描述:向ds1302的某一指定单元写入一字节
/*输入:ctrl1302:命令字节
data1302:数据字节
/*输出:无
/************************************************************/
void wr_oneword_ds1302(uchar ctrl1302,uchar data1302)
{
uchar i;
uchar ds1302tmp;
ds1302tmp =ctrl1302;
ds1302tmp|=0x80;//控制码最高位必须位1
ds1302tmp&=0xfe;//写入时,最低位必须为0
sck1302 =0;//当把rst驱动为1时,sck必须为0
delay1302();
rst1302 =1;//只有rst为高时,才允许数据传送
for(i=0;i<8;i++)//写入控制码
{
sck1302 =0;
delay1302();
if(ds1302tmp&0x01)
sio1302 =1;
else
sio1302 =0;
_nop_();
_nop_();
sck1302 =1;//上升沿将数据写入
delay1302();
ds1302tmp>>=1;
}
ds1302tmp =data1302;//写入数据
for(i=0;i<8;i++)
{
sck1302 =0;
delay1302();
if(ds1302tmp&0x01)
sio1302 =1;
else
sio1302 =0;
_nop_();
_nop_();
sck1302 =1;
delay1302();
ds1302tmp>>=1;
}
_nop_();
_nop_();
rst1302 =0;//禁止芯片操作
sck1302 =0;//恢复原有状态
}
/************************************************************/
/*函数名:rd_oneword_ds1302
/*描述:从ds1302的指定单元读出一字节
/*输入:ctrl1302:指定要读取的单元
/*输出:读取的字节
/***********************************************************/
uchar rd_oneword_ds1302(uchar ctrl1302)
{
uchar i;
uchar ds1302tmp;
ds1302tmp =ctrl1302;
ds1302tmp|=0x80;//控制码最高位必须为1
ds1302tmp|=0x01;//读出时,最低位必须为1
sck1302 =0;//当把rst驱动为1时,sck必须为0
delay1302();
rst1302 =1;//只有rst为高时,才允许数据传送
for(i=0;i<8;i++)//输出控制码
{
sck1302 =0;
delay1302();
if(ds1302tmp&0x01)
sio1302 =1;
else
sio1302 =0;
_nop_();
_nop_();
sck1302 =1;
delay1302();
ds1302tmp>>=1;
}
for(i=0;i<8;i++)//读出控制码指定单元内容
{
ds1302tmp>>=1;
sck1302 =1;
delay1302();
sck1302 =0;
delay1302();
if(sio1302)
ds1302tmp|=0x80;//最高位为1
else
ds1302tmp&=0x7f;//最高位为0
delay1302();
}
rst1302 =0;//禁止芯片操作
sck1302 =0;//恢复原有状态
return(ds1302tmp);
}
/*****************************************/
/*函数名:delay1302
/*描述:延时,使程序时序符合芯片要求
/*输入:无
/*输出:无
/****************************************/
void delay1302(void)//对于11.0592Mhz,延时为1us
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -