怎么设置,给个程序段看看。。。
动手搜一下,一堆一堆的。论坛里也有 要先设置电池充不充电,还有秒寄存器的高位,我这里有一个项目就用了DS1302,源码一会整理好之后我发上来. 本帖最后由 wsy2012 于 2012-12-5 17:27 编辑
DS1302驱动及读取时间代码:
注:
clock_dat为DS1302数据引脚
clock_clk为DS1302时钟引脚
clock_Rst为DS1302复位引脚/*************************************************************************************************************************************************************
模块名:DS1302驱动
函数:6
作用:读写DS1302
分类:硬件层
/*************************************************************************************************************************************************************/
/*********************************************************************************************
函数名:向DS1302写信息(不可直接调用)
调用:clock_out(dd);
参数:dd:要写入的数据或地址
返回值:无
结果:向DS1302写入一字节
分类:第一硬件层
/**********************************************************************************************/
void clock_out(unsigned char dd){
unsigned char i;
for(i=0;i<8;i++){
clock_dat=dd&0x01; //向DS1302写入一字节数据
_nop_();//延时一指令周期
clock_clk=1; //拉高时钟脉冲
dd>>=1;//右移一位
clock_clk=0; //拉低时钟脉冲
}
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:从DS1302读出数据(不可直接调用)
调用:某变量=clock_in();
参数:无
返回值:从DS1302读出的数据
结果:从DS1302读出一字节
分类:第一硬件层
/**********************************************************************************************/
unsigned char clock_in(){
unsigned char i,j=0;
clock_dat=1;
for(i=0;i<8;i++){
j>>=1; //右移一位
_nop_(); //延时一指令周期
clock_clk=0; //拉低时钟脉冲
_nop_(); //延时一指令周期
if(clock_dat){ //判断接收该位数据是否为1
j+=0x80;
}
_nop_(); //延时一指令周期
clock_clk=1; //拉高时钟脉冲
}
return(j); //返回数值
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:从DS1302读出数据
调用:某变量=read_clock();
参数:ord:要读的数据的地址
返回值:从DS1302读出的数据
结果:从DS1302读出一字节
分类:第二硬件层
/**********************************************************************************************/
unsigned char read_clock(unsigned char ord){ //-DS1302读数据(DS1302驱动)
unsigned char dd=0;
clock_Rst=0;
clock_clk=0;
clock_Rst=1;
clock_out(ord|0x01);
dd=clock_in();
clock_clk=1;
clock_Rst=0;
return(dd);
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:向DS1302写信息(不可直接调用)
调用:write_clock(ord,dd);
参数:ord:要写入的地址;dd:要写入的数据
返回值:无
结果:向DS1302写入一字节
分类:第二硬件层
/**********************************************************************************************/
void write_clock(unsigned char ord, unsigned char dd){ //-DS1302写数据(DS1302驱动)
clock_Rst=0;
clock_clk=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_clk=1;
clock_Rst=0;
}
/**********************************************************************************************
/*********************************************************************************************
函数名:初始化DS1302
调用:Init_1302();
参数:无
返回值:无
结果:自动判断DS1302是否初始化,未初始化则进行初始化
分类:第三硬件层
/**********************************************************************************************/
void Init_1302(void){
unsigned char f;
if(read_clock(0xc1) != 0xaa){//&&TIME_SS==80
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充电
write_clock(0xc1,0xaa);//写入初始化标志RAM(第00个RAM位置)
for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
write_clock(0xc2+f,0x00);
}
write_clock(0x8e,0x80);//禁止写操作
}
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:DS1302写入时间数据
调用:SET_1302_TIME();
参数:无
返回值:无
结果:将时间变量写入DS1302
分类:第三硬件层
/**********************************************************************************************/
void SET_1302_TIME (void){
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,TIME_YY/10*16+TIME_YY%10);//TIME_YY为时间年变量
write_clock(0x88,TIME_MO/10*16+TIME_MO%10);//TIME_MO为时间月变量
write_clock(0x86,TIME_DD/10*16+TIME_DD%10);//TIME_DD为时间天变量
write_clock(0x8a,TIME_WW/10*16+TIME_WW%10);//TIME_WW为时间星期变量
write_clock(0x84,TIME_HH/10*16+TIME_HH%10);//TIME_HH为时间小时变量
write_clock(0x82,TIME_MM/10*16+TIME_MM%10);//TIME_MM为时间分钟变量
write_clock(0x80,TIME_SS/10*16+TIME_SS%10);//TIME_SS为时间秒变量
write_clock(0x90,0xa5);//充电
write_clock(0x8e,0x80);//写保护,禁止写操作
}
/**********************************************************************************************/
/*************************************************************************************************************************************************************/
/*
读取DS1302数据示范
TIME_YY=read_clock(0x8c)/16*10+read_clock(0x8c)%16;
TIME_MO=read_clock(0x88)/16*10+read_clock(0x88)%16;
TIME_DD=read_clock(0x86)/16*10+read_clock(0x86)%16;
TIME_WW=read_clock(0x8a)/16*10+read_clock(0x8a)%16;
TIME_HH=read_clock(0x84)/16*10+read_clock(0x84)%16;
TIME_MM=read_clock(0x82)/16*10+read_clock(0x82)%16;
TIME_SS=read_clock(0x80)/16*10+read_clock(0x80)%16;
*/
DS1302数据手册,非常详细,非常权威!学会看手册受益一生啊! 看完源码,在看手册,因为问题解决了可以放下心来看手册。
页:
[1]