找回密码
 注册
搜索
查看: 718|回复: 5

[讨论] ds1302求助

[复制链接]
发表于 2009-2-25 23:10:38 | 显示全部楼层 |阅读模式
小妹最近用ds1302加at89s52做一个万年历,显示的时钟\分钟\秒钟每一秒都会跳变一次,跳变是没规律的,比如从8跳到20再跳到50,偶尔还会冒出个>号出来,我用的是keil编译环境.用的1602LCD,显示别的信息比如温度都是正常的.部分代码如下,只贴上了启动DS1302\读DS1302\显示转换代码:

sbit CLK=P3^2;                                                               
sbit DINOUT=P1^1;                                                               
sbit RST=P1^4;                                                               
uchar clocktmp[3];       
/******************************************startup ds1302*************************************/
void StartUp1302()       
{
        uchar i,conb;
        uchar conbyt,ts0;                                                                          /*define the temp*/
        conbyt=0;                                                                                          /*CH written to logic 0, clock will start */
        conb=0x80;                                                                                        /*written the seconds*/
        ts0=conb;
        RST=CLK=1;                                                                                        /*initial the ds1302*/
        nop; nop;
        RST=1;                                                                                                /*SE pull high with the data transfer*/
        for(i=0;i<8;i++)                                                                           /*transfer the command*/
                {CLK=0;
                if(conb&0x01)
                        DINOUT=0;
                 else
                         DINOUT=1;
                        CLK=1;                                                                                /*a data bit is input when the clock rising edge*/
                          conb>>=1;
                        nop;
                }
                        CLK=0;
                        delay_10(2);
          for(i=0;i<8;i++)                                                                        /*transfer the data*/
                  {CLK=0;
                if(conbyt&0x01)
                                DINOUT=0;
                        else
                                DINOUT=1;

                  CLK=1;
                  conbyt>>=1;
                  nop;
                }
         delay_10(10);
         RST=0;
         nop;

}
/*****************************************read the ds1302***********************************/

void RD1302()

{       
        uchar i,j;
        uchar conb,ts0;
        conb=0x81;                                                                                  /*read the seconds*/
        clocktmp[0]=0;
        clocktmp[1]=0;
        clocktmp[2]=0;
        ts0=conb;
        for(j=0;j<3;j++)
                {
                        RST=CLK=0;
                        nop; nop;
                        RST=1;
                        for(i=0;i<8;i++)
                                {
                                        CLK=0;
                                        if(conb&0x01)
                                                DINOUT=1;
                                                else
                                                        DINOUT=0;
                                          CLK=1;
                                          conb>>=1;
                                          nop;
                                }
                          conb=ts0=ts0+2;
                          CLK=0;
                          for(i=0;i<7;i++)                                                  /*read the 1302 hour minute second*/
                                  {
                                        if(DINOUT==1)
                                                clocktmp[j]|=0x80;
                                                else
                                                        clocktmp[j]&=0x7f;
                                          CLK=1;
                                          clocktmp[j]>>=1;                                  /*save the data of receive*/
                                          nop;
                                          CLK=0;
                               
                                }

                        delay_10(5);
                        RST=0;
                        delay_10(10);
                }

        nop;

}
后续
 楼主| 发表于 2009-2-25 23:22:06 | 显示全部楼层
续上   
/*******************************************diplay times*************************************/

void LCD_dispword()                               
{          uchar secl,sech,minl,minh,hourl,hourh,s;
        s=0x3a;
        secl=(clocktmp[0]&0x0f)|0x30;                                                        /*get the seconds and convert to diplay data*/
        sech=(clocktmp[0]>>4&0x0f)|0x30;
        minl=(clocktmp[1]&0x0f)|0x30;
        minh=(clocktmp[1]>>4&0x0f)|0x30;
        hourl=(clocktmp[2]&0x0f)|0x30;
        hourh=(clocktmp[2]>>4&0x0f)|0x30;
        //dels(1000);
    dels(1000);
        writer_function(0x88);                          
    Write2(hourh);                                                                         /*display hours*/                           
    Write2(hourl);                            
    Write2(s);                                                                                 /*display ":"*/                           
    Write2(minh);                            
    Write2(minl);                    
    Write2(s);                                    
    Write2(sech);                            
    Write2(secl);                            
    //Enable(0xc0);                           
    //Write1(STR14);                            
    }
因为以前是做硬件的,转行做软件不久,很多不懂的地方,上面这段代码的问题搞了几天了,因为没有51的仿真器,而软件仿真又找不出问题所在,恳请各位用过ds1302的前辈不吝赐教,提示我代码问题所在.谢谢!!!
点评回复

使用道具 举报

 楼主| 发表于 2009-2-26 21:21:39 | 显示全部楼层
[em03],怎么就没人吱声呢?走错地方了吗?
点评回复

使用道具 举报

 楼主| 发表于 2009-3-15 08:49:50 | 显示全部楼层
up[em03][em03]
点评回复

使用道具 举报

发表于 2009-3-19 07:44:17 | 显示全部楼层
根据楼主所提供的问题,小弟我也同样遇到,同样是lcd1602显示不正常。这让我很是头疼了几天。
因为我刚接触这类不久,关于楼主的程序是否正确,我无法给出肯定答案,实在不好意思,但我刚才在网上找到关于这方面的资料:在确定程序无错情况下,ds1302似乎很容易受到外界干扰,我个人认为,楼主不妨在ds1302的 IO 和 SCLK 脚加个上拉电阻,似乎能解决问题。具体方案 楼主可以找找《时钟 日历芯片 ds1302在 出租车计价器 中的应用》 作者 :徐兵。由于我也是刚找到,还没改我的电路板,效果不明,希望对楼主能有个帮助。呵呵~~[em01]
点评回复

使用道具 举报

发表于 2009-3-19 09:33:50 | 显示全部楼层
经测试~~~~果然这个原因!~~~~[em08]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-25 07:52 , Processed in 0.045952 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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