|
|
#include"DS1302.h" |
|
|
|
|
|
/***************************************** |
|
|
* 函数名:void DS1302_GPIOInit(void) |
|
|
* 描述 : DS1302 GPIO配置 |
|
|
* 输入 : |
|
|
* 输出 :无 |
|
|
* 调用 : |
|
|
CLK---PB5, |
|
|
IO--->PB6, |
|
|
RES--->PB7, |
|
|
*************************************/ |
|
|
|
|
|
|
|
|
|
|
|
void DS1302_GPIOInit(void) |
|
|
{ |
|
|
GPIO_InitTypeDef GPIO_InitStructre; |
|
|
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /*open GPIO clock*/ |
|
|
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; |
|
|
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz; |
|
|
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_Out_PP; |
|
|
GPIO_Init(DS1302_PORT, &GPIO_InitStructre); |
|
|
} |
|
|
/***************************************** |
|
|
* 函数名:void DS1302_IO_GPIO(void) |
|
|
* 描述 : DS1302 之 IO GPIO 输入输出配置 |
|
|
* 输入 :FLAG标志位 |
|
|
* 输出 :无 |
|
|
* 调用 :OUT:表示输出,IN:表示输入 |
|
|
FLAG: |
|
|
*************************************/ |
|
|
void DS1302_IO_GPIO(uchar FLAG) |
|
|
{ |
|
|
GPIO_InitTypeDef GPIO_InitStructre; |
|
|
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /*open GPIO clock*/ |
|
|
/**********配置数据IO端口 输出 **********/ |
|
|
if(FLAG==0x01) |
|
|
{ |
|
|
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_6;//配置IO_GPIO |
|
|
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz; |
|
|
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_Out_PP; |
|
|
GPIO_Init(DS1302_PORT, &GPIO_InitStructre); |
|
|
} |
|
|
/**********配置数据IO端口 输入**********/ |
|
|
else if(FLAG==0x00) |
|
|
{ |
|
|
GPIO_InitStructre.GPIO_Pin= GPIO_Pin_6;//配置IO_GPIO |
|
|
GPIO_InitStructre.GPIO_Speed=GPIO_Speed_50MHz; |
|
|
GPIO_InitStructre.GPIO_Mode=GPIO_Mode_IPU; //配置上拉输入 |
|
|
GPIO_Init(DS1302_PORT, &GPIO_InitStructre); |
|
|
} |
|
|
} |
|
|
/***************************************** |
|
|
* 函数名:void DS1302_delay(u8 dd) |
|
|
* 描述 :简单延时 |
|
|
* 输入 : |
|
|
* 输出 :无 |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_delay(u8 dd) |
|
|
{ |
|
|
u8 i; |
|
|
for(;dd>0;dd--) |
|
|
for(i=110;i>0;i--); |
|
|
} |
|
|
|
|
|
/***************************************** |
|
|
* 函数名:void DS1302_Write(uchar add,uchar dat) |
|
|
* 描述 :DS1302写指令和数据 |
|
|
* 输入 :add:发送地址,dat:所在数据 |
|
|
* 输出 :无 |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_Write(uchar add,uchar dat) |
|
|
{ |
|
|
uchar i,temp1,temp2; |
|
|
temp1=add; |
|
|
temp2=dat; |
|
|
RES_Set_1;//RET=1; |
|
|
//发送地址 |
|
|
for(i=0;i<8;i++) |
|
|
{ |
|
|
if(temp1&0x01) |
|
|
{IO_Set_1; } //IO=1; |
|
|
else |
|
|
{ IO_Reset_0;} //IO=0; |
|
|
temp1=temp1>>1; |
|
|
CLK_Set_1; //CLK=1; |
|
|
DS1302_delay(2); |
|
|
CLK_Reset_0; //CLK=0; |
|
|
} |
|
|
|
|
|
//发送数据 |
|
|
for(i=0;i<8;i++) |
|
|
{ |
|
|
/*IO=(temp2>>i)&0x01;这一句代替下面屏蔽的内容 */ |
|
|
if(temp2&0x01) |
|
|
{IO_Set_1; } //IO=1; |
|
|
else |
|
|
{ IO_Reset_0;} //IO=0; |
|
|
temp2=temp2>>1; |
|
|
CLK_Set_1; //CLK=1; |
|
|
DS1302_delay(2); |
|
|
CLK_Reset_0; //CLK=0; |
|
|
} |
|
|
RES_Reset_0;// RET=0; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************** |
|
|
* 函数名:uchar DS1302_Read(uchar add) |
|
|
* 描述 :DS1302读数据 |
|
|
* 输入 :add:发送所在地址 |
|
|
* 输出 : |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
uchar DS1302_Read(uchar add) |
|
|
{ |
|
|
uchar i,suf,temp,mm,nn,value; |
|
|
temp=add; |
|
|
RES_Set_1;//RET=1; |
|
|
//写地址 |
|
|
for(i=0;i<8;i++) |
|
|
{ |
|
|
if(temp&0x01) |
|
|
{IO_Set_1; } //IO=1; |
|
|
else |
|
|
{ IO_Reset_0;} //IO=0; |
|
|
temp=temp>>1; |
|
|
CLK_Set_1; //CLK=1; |
|
|
DS1302_delay(2); |
|
|
CLK_Reset_0; //CLK=0; |
|
|
} |
|
|
//读数据 |
|
|
|
|
|
DS1302_IO_GPIO(IN);//配置IO为输入 |
|
|
for(i=0;i<8;i++) |
|
|
{ |
|
|
suf=suf>>1;//读数据变量 |
|
|
if(IO_Read) //IO=1 |
|
|
{ |
|
|
suf=suf|0x80; |
|
|
} |
|
|
else //IO=0 |
|
|
{ |
|
|
suf=suf&0x7f; |
|
|
} |
|
|
|
|
|
CLK_Set_1; //CLK=1; |
|
|
DS1302_delay(2); |
|
|
CLK_Reset_0; //CLK=0; |
|
|
} |
|
|
RES_Reset_0; // RET=0; |
|
|
|
|
|
DS1302_IO_GPIO(OUT);//配置IO为输出,恢复正常状态 |
|
|
//数据处理转化十进制 |
|
|
mm=suf/16; |
|
|
nn=suf%16; |
|
|
value=mm*10+nn; |
|
|
return value; |
|
|
} |
|
|
/***************************************** |
|
|
* 函数名:void DS1302_SetTime(uchar *ad) |
|
|
* 描述 :DS1302 写入设置时间 |
|
|
* 输入 :add:发送所在地址 |
|
|
* 输出 : |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_SetTime(uchar *ad) |
|
|
{ |
|
|
DS1302_Write(0x8e,0x00); //WP=0 允许数据写入DS1302 |
|
|
/**********以下对时分秒的初始化*************/ |
|
|
DS1302_Write(ds1302_sec_addr,ad[5]); //秒 |
|
|
DS1302_Write(ds1302_min_addr,ad[4]); //分 |
|
|
DS1302_Write(ds1302_hour_addr,ad[3]); //时 |
|
|
/**********以下对年月日的初始化*************/ |
|
|
DS1302_Write(ds1302_day_addr,ad[2]); |
|
|
DS1302_Write(ds1302_month_addr,ad[1]); |
|
|
DS1302_Write(ds1302_year_addr,ad[0]); |
|
|
|
|
|
DS1302_Write(0x8e,0x80); //0x8e控制字节地址,bit7=WP WP=1 禁止数据写入DS1302 |
|
|
} |
|
|
|
|
|
|
|
|
/***************************************** |
|
|
* 函数名: void DS1302_OFF(void) |
|
|
* 描述 :DS1302时间禁止走时 |
|
|
* 输入 : |
|
|
* 输出 : |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_OFF(void) |
|
|
{ |
|
|
uchar temp; |
|
|
temp=DS1302_Read(0x81);//读取表地址时间 |
|
|
DS1302_Write(0x8e,0x00);//WP=0 允许数据写入DS1302 |
|
|
temp=temp|(1<<7); |
|
|
DS1302_Write(0x80,temp);//WP=1 禁止数据写入DS1302 |
|
|
|
|
|
} |
|
|
/***************************************** |
|
|
* 函数名: void DS1302_ON(void) |
|
|
* 描述 :DS1302时间开始运行,走时 |
|
|
* 输入 : |
|
|
* 输出 : |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_ON(void) |
|
|
{ |
|
|
uchar temp; |
|
|
temp=DS1302_Read(0x81); |
|
|
DS1302_Write(0x8e,0x00);//WP=0 允许数据写入DS1302 |
|
|
temp=temp|(0<<7); |
|
|
DS1302_Write(0x80,temp);//WP=0 允许数据写入DS1302 |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***************************************** |
|
|
* 函数名:void DS1302_init(uchar *time) |
|
|
* 描述 : DS1302初始化 |
|
|
* 输入 :无 |
|
|
* 输出 :无 |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_init(uchar *time) |
|
|
{ |
|
|
DS1302_GPIOInit();//GPIO初始化配置 |
|
|
DS1302_delay(2); |
|
|
RES_Reset_0; //RET=0; |
|
|
CLK_Reset_0;// CLK=0; |
|
|
//下面是对DS1302启动电池,不掉电 设置时间 |
|
|
DS1302_Write(0x8e,0x00);//WP=0 允许数据写入DS1302 |
|
|
DS1302_Write(0x90,0xA7);//充电(1个二极管+8K电阻) |
|
|
DS1302_Write(0x8E,0X80);//开启保护 WP=1 |
|
|
if(DS1302_Read(0X81)&0X80)//查询DS302时钟是否启动,如果时钟停止走动:启动时钟+初始化时钟 |
|
|
{ |
|
|
DS1302_SetTime(time);//设置设置初始时钟 |
|
|
} |
|
|
//否则跳过 |
|
|
|
|
|
} |
|
|
/***************************************** |
|
|
* 函数名:void DS1302_Readtime(void) |
|
|
* 描述 : DS1302时间读出 |
|
|
* 输入 :无 |
|
|
* 输出 :无 |
|
|
* 调用 : |
|
|
*************************************/ |
|
|
void DS1302_Readtime(void) |
|
|
{ |
|
|
nowTime.year = DS1302_Read( 0x8D); |
|
|
nowTime.mon = DS1302_Read( 0x89); |
|
|
nowTime.day = DS1302_Read( 0x87); |
|
|
nowTime.hour = DS1302_Read( 0x85); |
|
|
nowTime.min = DS1302_Read( 0x83); |
|
|
nowTime.sec = DS1302_Read( 0x81); |
|
|
} |