各位大侠,谁帮我看下程序,ds1302掉电后数据丢失

2019-07-15 16:36发布

/************************************************
*名称: DS1302WriteByte
*说明: 无
*功能: 写入8bit 数据
*调用: delayus()
*输入: dat:要写入的数据
*输出: 无
*************************************************/
void DS1302WriteByte(uchar dat)
{
uchar i;
SCLK=0;//初始时钟线置为0
delayus(2);
for(i=0;i<8;i++)//开始传输8 个字节的数据
{
SDA=dat&0x01;//取最低位,注意DS1302 的数据和地址都是从最低位开始传输的
delayus(2);
SCLK=1;//时钟线拉高,制造上升沿,SDA 的数据被传输
delayus(2);
SCLK=0;//时钟线拉低,为下一个上升沿做准备
dat>>=1;//数据右移一位,准备传输下一位数据
}
}
/************************************************
*名称: DS1302ReadByte()
*说明: 无
*功能: 读取8bit 的数据
*调用: delayus()
*输入: 无
*输出: dat:读取的数据
*************************************************/
uchar DS1302ReadByte()
{
uchar i,dat;
delayus(2);
for(i=0;i<8;i++)
{
dat>>=1;//要返回的数据左移一位
if(SDA==1)//当数据线为高时,证明该位数据为1
dat|=0x80;//要传输数据的当前值置为1,若不是,则为0
SCLK=1;//拉高时钟线
delayus(2);
SCLK=0;//制造下降沿
delayus(2);
}
return dat;//返回读取出的数据
}

/************************************************
*名称: uchar DS1302Read()
*说明: 先写地址,后读数据
*功能: 从cmd 相应地址中读取一个字节的数据
*调用: DS1302WriteByte(),DS1302ReadByte()
*输入: cmd:要写入的控制字节
*输出: dat:读取的数据
*************************************************/
uchar DS1302Read(uchar cmd)
{
uchar dat;
RST=0;//初始CE 线置为0
SCLK=0;//初始时钟线置为0
RST=1;//初始CE 置为1,传输开始
DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址
dat=DS1302ReadByte();//读取要得到的时间/日期
SCLK=1;//时钟线拉高
RST=0;//读取结束,CE 置为0,结束数据的传输
return dat;//返回得到的时间/日期
}
/************************************************
*名称: DS1302Write
*说明: 先写地址,后写数据
*功能: 向cmd 相应地址中写一个字节的数据
*调用: DS1302WriteByte()
*输入: cmd:要写入的控制字,dat:要写入的数据
*输出: 无
*************************************************/
void DS1302Write(uchar cmd, uchar dat)
{
RST=0; //初始CE 线置为0
SCLK=0; //初始时钟线置为0
RST=1; //初始CE 置为1,传输开始
DS1302WriteByte(cmd); //传输命令字,要写入的时间/日历地址
DS1302WriteByte(dat); //写入要修改的时间/日期
SCLK=1; //时钟线拉高
RST=0; //读取结束,CE 置为0,结束数据的传输
}


void Init_DS1302(void)
{
DS1302Write(0x8E,0);     //根据写状态寄存器命令字,写入不保护指令
DS1302Write(0x80,0);   //根据写秒寄存器命令字,写入秒的初始值
DS1302Write(0x82,10);   //根据写分寄存器命令字,写入分的初始值
DS1302Write(0x84,11); //根据写小时寄存器命令字,写入小时的初始值
DS1302Write(0x86,2); //根据写日寄存器命令字,写入日的初始值
DS1302Write(0x88,11); //根据写月寄存器命令字,写入月的初始值
DS1302Write(0x8c,12);   //nian
DS1302Write(0x8a,5);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。