//是否写入保护 void DS1302_SetProtect(bit Flag) { if(Flag) Write1302(0x8E,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302 else Write1302(0x8E,0x00); //WP=0 允许数据写入DS1302 }
/* 写DS1302中的RAM addr:地址,从0到30,共31个字节的空间 data:要写的数据 */ void WriteDS1302Ram(uint8_t addr,uint8_t data) { uint8_t tmp; Write1302(DS1302_WRITE,0x00); //关闭写保护 tmp = (addr<<1)|0xc0; Write1302(tmp,data); Write1302(DS1302_WRITE,0x80); //打开写保护 }
/* 写DS1302中的RAM addr:地址,从0到30,共31个字节的空间 data:要写的数据 */ void WriteDS1302Ram(u8 addr,u8 data) { u8 tmp; Write1302(DS1302_WRITE,0x00); //关闭写保护 tmp = (addr<<1)|0xc0; Write1302(tmp,data); Write1302(DS1302_WRITE,0x80); //打开写保护 }
/***************************************************** 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ void Ds1302_Write_Byte(UINT8 Cmd,UINT8 dat) { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; Write1302(Cmd); // 地址,命令 Write1302(dat); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; //RST 0->1->0,CLK 0->1 }
/***************************************************** 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ void WriteSet1302(uchar Cmd,uchar dat) { RST=0; //禁止数据传递 SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Delaynus(5); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据 SCLK=1; //将时钟电平置于高电平状态 RST=0; //禁止数据传递 }
//设置时间函数 void DS1302_SetTime(unchar Address, unchar Value) { DS1302_SetProtect(0); Write1302(Address,((Value/10)<<4|(Value%10))); DS1302_SetProtect(1); }
void InitClock(void) { u8 tmp = 0; DS1302_Configuration(); tmp = ReadDS1302Ram(0); if(tmp != 0x25) { WriteDS1302Ram(0,0x25); Write1302(DS1302_WRITE,0x00); //关闭写保护 Write1302(0x90,0x03); //禁止涓流充电 Write1302(DS1302_HOUR,0x00); //设置成24小时制 Write1302(DS1302_SECOND,0x00); //使能时钟运行 Write1302(DS1302_WRITE,0x80); //打开写保护 WriteDS1302ClockASCII("20160115023500"); } //WriteDS1302ClockASCII("20140116084000"); }
/***************************************************** 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd ***************************************************/ uchar ReadSet1302(uchar Cmd) { uchar dat; RST=0; //拉低RST SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 }
/***************************************************** 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd ***************************************************/ UINT8 Ds1302_Read_Byte(UINT8 Cmd) { UINT8 ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; //enable Write1302(Cmd|0x01); // 地址,命令 ucData = Read1302(); // 读1Byte数据 DS1302_CLK = 1; //RST 0->1->0,CLK 0->1 DS1302_RST = 0; return(ucData); }
/* 写时间函数,顺序为:年周月日时分秒 */ void WriteDS1302Clock(uint8_t *p) { Write1302(DS1302_WRITE,0x00); //关闭写保护 DS1302_OUT(); DS1302_RST_L(); DS1302_CLK_L(); DS1302_RST_H(); delay_nus(4); DS1302SendByte(0xbe); //突发模式 DS1302SendByte(p[5]); //秒 DS1302SendByte(p[4]); //分 DS1302SendByte(p[3]); //时 DS1302SendByte(p[2]); //日 DS1302SendByte(p[1]); //月 DS1302SendByte(0x01); //周,设置成周一,没有使用 DS1302SendByte(p[0]); //年 DS1302SendByte(0x80); //保护标志字节 delay_nus(4); DS1302_RST_L(); }
void InitClock(void) { uint8_t tmp; uint8_t flag; flag=Read1302(0x81); if(flag&0x80) { //判断时钟芯片是否关闭 Write1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 Write1302(0x80,((51/10)<<4|(51%10))); //根据写秒寄存器命令字,写入秒的初始值 Write1302(0x82,((2/10)<<4|(2%10))); //根据写分寄存器命令字,写入分的初始值 Write1302(0x84,((12/10)<<4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值 Write1302(0x86,((27/10)<<4|(27%10))); //根据写日寄存器命令字,写入日的初始值 Write1302(0x88,((7/10)<<4|(7%10))); //根据写月寄存器命令字,写入月的初始值 Write1302(0x8c,((15/10)<<4|(15%10))); //根据写年寄存器命令字,写入年的初始值 Write1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令 } tmp = ReadDS1302Ram(0); if(tmp^0xa5) { WriteDS1302Ram(0,0xa5); Write1302(DS1302_WRITE,0x00); //关闭写保护 Write1302(0x90,0x03); //禁止涓流充电 Write1302(DS1302_HOUR,0x00); //设置成24小时制 Write1302(DS1302_SECOND,0x00); //使能时钟运行 Write1302(DS1302_WRITE,0x80); //打开写保护 } }