makaveli 发表于 2012-12-4 13:34:57

cc224 发表于 2012-12-4 13:36:39

不行,要设置了才可以

makaveli 发表于 2012-12-4 13:45:17

yp19890718 发表于 2012-12-4 17:01:02

最好是看DS1302数据手册,非常详细,非常权威

gallle 发表于 2012-12-4 17:29:57

将秒寄存器的最高位置0,启动计时,然后如果没有断电的话就一直走

gallle 发表于 2012-12-4 17:30:39

makaveli 发表于 2012-12-4 13:45 static/image/common/back.gif
怎么设置,给个程序段看看。。。

动手搜一下,一堆一堆的。论坛里也有

wsy2012 发表于 2012-12-4 17:36:34

要先设置电池充不充电,还有秒寄存器的高位,我这里有一个项目就用了DS1302,源码一会整理好之后我发上来.

wsy2012 发表于 2012-12-4 17:56:02

本帖最后由 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;
*/

Randy1022 发表于 2012-12-4 18:25:24

DS1302数据手册,非常详细,非常权威!学会看手册受益一生啊!

dingshidong214 发表于 2012-12-4 23:38:57

看完源码,在看手册,因为问题解决了可以放下心来看手册。
页: [1]
查看完整版本: DS1302的一些小问题