找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10871|回复: 16
收起左侧

求助 ds1302时钟 为什么秒不走??

[复制链接]
ID:66729 发表于 2014-11-8 22:00 | 显示全部楼层 |阅读模式
按本坛上面的12864万年历资料,做了几块PCB板,之前也在淘宝买了两块不同的PCB板子,但是都出现了同一个问题:用的ds1302和晶振,上电后就是秒不走,不知道是什么原因,首先程序是没问题的,然后PCB板焊接也应该没问题,上电后12864开机有显示,然后显示界面上,年月日星期都正常,但是时间的秒不走,就是一直定格在开机的样子。。。。
回复

使用道具 举报

ID:66729 发表于 2014-11-8 22:03 | 显示全部楼层
时间显示一直是 00 00  00   没有走时,没有秒点显示。。。
回复

使用道具 举报

ID:66729 发表于 2014-11-8 22:47 | 显示全部楼层
/****************************************************************************/ //程序名称:     DS1302头文件                             /****************************************************************************/  #ifndef __DS1302_H__  #define __DS1302_H__   #include <AT89X52.h> #include <intrins.h>    //包含_nop_()延时函数  #ifndef uchar #define uchar unsigned char #endif  #ifndef uint #define uint  unsigned int #endif  /****************************************************************************/ //定义DS1302时钟接口 sbit clock_clk = P2 ^ 4;//ds1302_clk(时钟线) sbit clock_dat = P2 ^ 5;//ds1302_dat(数据线) sbit clock_Rst = P2 ^ 6;//ds1302_Rst(复位线) //定义累加器A中的各位 sbit a0   = ACC ^ 0; sbit a1   = ACC ^ 1; sbit a2   = ACC ^ 2; sbit a3   = ACC ^ 3; sbit a4   = ACC ^ 4; sbit a5   = ACC ^ 5; sbit a6   = ACC ^ 6; sbit a7   = ACC ^ 7; /*****************************************************************************/ //1302驱动程序(底层协议) void clock_out(unsigned char dd){         ACC=dd;         clock_dat=a0; clock_clk=1; clock_clk=0;         clock_dat=a1; clock_clk=1; clock_clk=0;         clock_dat=a2; clock_clk=1; clock_clk=0;         clock_dat=a3; clock_clk=1; clock_clk=0;         clock_dat=a4; clock_clk=1; clock_clk=0;         clock_dat=a5; clock_clk=1; clock_clk=0;         clock_dat=a6; clock_clk=1; clock_clk=0;         clock_dat=a7; clock_clk=1; clock_clk=0; } /*****************************************************************************/ //DS1302写数据(底层协议) void write_clock(unsigned char ord, unsigned char dd){         clock_clk=0;         clock_Rst=0;         clock_Rst=1;         clock_out(ord);         clock_out(dd);         clock_Rst=0;         clock_clk=1; } /*****************************************************************************/ //DS1302写入字节(底层协议) unsigned char clock_in(void){         clock_dat=1;         a0=clock_dat;         clock_clk=1; clock_clk=0; a1=clock_dat;         clock_clk=1; clock_clk=0; a2=clock_dat;         clock_clk=1; clock_clk=0; a3=clock_dat;         clock_clk=1; clock_clk=0; a4=clock_dat;         clock_clk=1; clock_clk=0; a5=clock_dat;         clock_clk=1; clock_clk=0; a6=clock_dat;         clock_clk=1; clock_clk=0; a7=clock_dat;         return(ACC); } /*****************************************************************************/ //DS1302读数据(底层协议) unsigned char read_clock(unsigned char ord){         unsigned char dd=0;         clock_clk=0;         clock_Rst=0;         clock_Rst=1;         clock_out(ord);         dd=clock_in();         clock_Rst=0;         clock_clk=1;         return(dd); } /*****************************************************************************/ //设置1302的初始时间(自动初始化) void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)         unsigned char f;         if(read_clock(0xc1) != 0xaa){                 write_clock(0x8e,0x00);//允许写操作                 write_clock(0x8c,0x07);//年                 write_clock(0x8a,0x01);//星期                 write_clock(0x88,0x01);//月                 write_clock(0x86,0x01);//日                 write_clock(0x84,0x00);//小时                 write_clock(0x82,0x00);//分钟                 write_clock(0x80,0x00);//秒                 write_clock(0x90,0xa5);//充电                         write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)                 for(f=0;f<60;f=f+2){//清除闹钟RAM位为0                         write_clock(0xc2+f,0x00);                 }                 write_clock(0x8e,0x80);//禁止写操作         } }  #endif
回复

使用道具 举报

ID:66729 发表于 2014-11-8 22:48 | 显示全部楼层
/****************************************************************************/
//程序名称:     DS1302头文件               
          
/****************************************************************************/

#ifndef __DS1302_H__
#define __DS1302_H__

#include <AT89X52.h>
#include <intrins.h>    //包含_nop_()延时函数

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint  unsigned int
#endif

/****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P2 ^ 4;//ds1302_clk(时钟线)
sbit clock_dat = P2 ^ 5;//ds1302_dat(数据线)
sbit clock_Rst = P2 ^ 6;//ds1302_Rst(复位线)
//定义累加器A中的各位
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
        ACC=dd;
        clock_dat=a0; clock_clk=1; clock_clk=0;
        clock_dat=a1; clock_clk=1; clock_clk=0;
        clock_dat=a2; clock_clk=1; clock_clk=0;
        clock_dat=a3; clock_clk=1; clock_clk=0;
        clock_dat=a4; clock_clk=1; clock_clk=0;
        clock_dat=a5; clock_clk=1; clock_clk=0;
        clock_dat=a6; clock_clk=1; clock_clk=0;
        clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        clock_out(ord);
        clock_out(dd);
        clock_Rst=0;
        clock_clk=1;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
        clock_dat=1;
        a0=clock_dat;
        clock_clk=1; clock_clk=0; a1=clock_dat;
        clock_clk=1; clock_clk=0; a2=clock_dat;
        clock_clk=1; clock_clk=0; a3=clock_dat;
        clock_clk=1; clock_clk=0; a4=clock_dat;
        clock_clk=1; clock_clk=0; a5=clock_dat;
        clock_clk=1; clock_clk=0; a6=clock_dat;
        clock_clk=1; clock_clk=0; a7=clock_dat;
        return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
        unsigned char dd=0;
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        clock_out(ord);
        dd=clock_in();
        clock_Rst=0;
        clock_clk=1;
        return(dd);
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
        unsigned char f;
        if(read_clock(0xc1) != 0xaa){
                write_clock(0x8e,0x00);//允许写操作
                write_clock(0x8c,0x07);//年
                write_clock(0x8a,0x01);//星期
                write_clock(0x88,0x01);//月
                write_clock(0x86,0x01);//日
                write_clock(0x84,0x00);//小时
                write_clock(0x82,0x00);//分钟
                write_clock(0x80,0x00);//秒
                write_clock(0x90,0xa5);//充电       
                write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
                for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
                        write_clock(0xc2+f,0x00);
                }
                write_clock(0x8e,0x80);//禁止写操作
        }
}

#endif
回复

使用道具 举报

ID:1 发表于 2014-11-9 01:50 | 显示全部楼层
这问题我遇到过  应该是 32768晶振不行
回复

使用道具 举报

ID:67992 发表于 2014-11-10 10:18 | 显示全部楼层
看了你的程序觉得别有新意,别人都是用FOR循环,且没有指定用ACC存储,而且你都不用延时。好奇之下复制过来试了下,读时分秒不正常,数据飞快乱跳,换别人的正常。

评分

参与人数 1黑币 +50 收起 理由
admin + 50

查看全部评分

回复

使用道具 举报

ID:66729 发表于 2014-11-10 18:54 | 显示全部楼层
dgahz 发表于 2014-11-10 10:18
看了你的程序觉得别有新意,别人都是用FOR循环,且没有指定用ACC存储,而且你都不用延时。好奇之下复制过来 ...

恩,程序是本坛上面下载的,这个是用了24C02,ds1302,18b20的12864万年历程序。。我没有改动过,确实这个程序我买了三块PCB板,然后自己也做了pCB,都是时钟不行,看来真的这程序有问题吧??
回复

使用道具 举报

ID:67992 发表于 2014-11-10 19:56 | 显示全部楼层
你换下另一个别人的ds1302程序不就知道是板还是程序的问题了?
回复

使用道具 举报

ID:67992 发表于 2014-11-10 19:58 | 显示全部楼层
把ds1302程序模块换掉,试试
回复

使用道具 举报

ID:67992 发表于 2014-11-10 20:38 | 显示全部楼层
改一个给你,把你原来的换掉:
/****************************************************************************/
//程序名称:     DS1302头文件               
         
/****************************************************************************/

#ifndef __DS1302_H__
#define __DS1302_H__

#include <AT89X52.h>
#include <intrins.h>    //包含_nop_()延时函数

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint  unsigned int
#endif

//定义DS1302时钟接口
sbit clock_clk = P2^4;                //ds1302_clk(时钟线)
sbit clock_dat = P2^5;                //ds1302_dat(数据线)
sbit clock_Rst = P2^6;          //ds1302_clock_Rst(复位线)
void write_clock(uchar addr, uchar dat)
{
        uchar n;
        clock_Rst = 0;
        _nop_();

        clock_clk = 0;//先将clock_clk置低电平。
        _nop_();
        clock_Rst = 1; //然后将clock_Rst(CE)置高电平。
        _nop_();

        for (n=0; n<8; n++)//开始传送八位地址命令
        {
                clock_dat = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                clock_clk = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                clock_clk = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//写入8位数据
        {
                clock_dat = dat & 0x01;
                dat >>= 1;
                clock_clk = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                clock_clk = 0;
                _nop_();       
        }       
                 
        clock_Rst = 0;//传送数据结束
        _nop_();
}

/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能                   : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/

uchar  read_clock(uchar addr)
{
        uchar n,dat,dat1;
        clock_Rst = 0;
        _nop_();

        clock_clk = 0;//先将clock_clk置低电平。
        _nop_();
        clock_Rst = 1;//然后将clock_Rst(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                clock_dat = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                clock_clk = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                clock_clk = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = clock_dat;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                clock_clk = 1;
                _nop_();
                clock_clk = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        clock_Rst = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        clock_clk = 1;
        _nop_();
        clock_dat = 0;
        _nop_();
        clock_dat = 1;
        _nop_();

        return dat;       
}

/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void)//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
{        unsigned char f;
        if(read_clock(0xc1) != 0xaa)
                {
                write_clock(0x8e,0x00);//允许写操作
                write_clock(0x8c,0x07);//年
                write_clock(0x8a,0x01);//星期
                write_clock(0x88,0x01);//月
                write_clock(0x86,0x01);//日
                write_clock(0x84,0x00);//小时
                write_clock(0x82,0x00);//分钟
                write_clock(0x80,0x00);//秒
                write_clock(0x90,0xa5);//充电        
                write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
                for(f=0;f<60;f=f+2)//清除闹钟RAM位为0
                                {
                        write_clock(0xc2+f,0x00);
                }
                write_clock(0x8e,0x80);//禁止写操作
        }
}
回复

使用道具 举报

ID:66729 发表于 2014-11-10 22:32 | 显示全部楼层
dgahz 发表于 2014-11-10 20:38
改一个给你,把你原来的换掉:
/******************************************************************** ...

谢谢,我到时试试看
回复

使用道具 举报

ID:66729 发表于 2014-11-11 12:42 | 显示全部楼层
dgahz 发表于 2014-11-10 20:38
改一个给你,把你原来的换掉:
/******************************************************************** ...

我试过了,问题依旧,,还是秒不走,跟原来的一个样,,等新买的DS1302和晶振到了我再换上去试一下,,唉,烦。。如果是程序有问题,说明是设计者共享程序的时候做了手脚,要不然按照原理图做的PCB焊好的板子怎么会有这种问题。。。
回复

使用道具 举报

ID:66729 发表于 2014-11-13 18:32 | 显示全部楼层
admin 发表于 2014-11-9 01:50
这问题我遇到过  应该是 32768晶振不行

我试过了,用新买的32768晶振换上也不行,,但是今天下午我把这个晶振直接焊在DS1302的两脚上,结果一切都正常了,唉。。估计是ds1302的管脚接触不良。。。。
回复

使用道具 举报

ID:66729 发表于 2014-11-13 18:33 | 显示全部楼层
dgahz 发表于 2014-11-10 20:38
改一个给你,把你原来的换掉:
/******************************************************************** ...

你这个换上后现在能正常用了,但是掉电不能存储时间,所以我用原程序就可以了。。。
回复

使用道具 举报

ID:153199 发表于 2016-12-17 09:42 | 显示全部楼层
需要晶振接地。工作更稳定
回复

使用道具 举报

ID:127881 发表于 2017-1-1 21:34 | 显示全部楼层
你之前的问题估计在于芯片,如果大家买到DS302N,而且正面最后一行丝印是001就要小心了,100%不能用
回复

使用道具 举报

ID:1004738 发表于 2022-2-11 10:37 | 显示全部楼层
我也遇到这个问题,两个样机,有一个不走时。首先补焊,没有解决。互换晶振,没有解决,互相更换ds1302后,两个都没有问题了。推断是芯片和晶振的兼容性问题或者焊接问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表