搜索
bottom↓
回复: 17

DS1302求助

[复制链接]

出0入0汤圆

发表于 2012-5-9 23:40:28 | 显示全部楼层 |阅读模式

DS1302.C代码如下:

#include <reg52.h>
#include "MacroAndConst.h"
#include "ds1302.h"

/*************************************************************************************************
定义静态变量
ds1302驱动引脚:slck/io/rst
**************************************************************************************************/
sbit sclk=P3^4;
sbit io=P3^6;
sbit rst=P3^5;
sbit ACC_7=ACC^7;



/*************************************************************************************************
函数名称:writebyte_ds1302()
函数功能:向DS1302中写一位数据
CPU_frequence:12Mhz
输入:无
输出:一个位bat
调用函数:无
**************************************************************************************************/
void writebyte_ds1302(uchar add,uchar date)
{
        uchar i,temp;
        bit bitemp;

        rst=0;
        sclk=0;
        rst=1;

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=add;
                bitemp=temp&0x01;
                io=bitemp;
                add=add>>1;       
                sclk=1;       
        }

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=date;
                bitemp=temp&0x01;
                io=bitemp;
                date=date>>1;       
                sclk=1;                       
        }

        rst=0;
}


/*************************************************************************************************
函数名称:readbyte_ds1302()
函数功能:从DS1302中读一位数据
CPU_frequence:12Mhz
输入:无
输出:一个位bat
调用函数:无
**************************************************************************************************/
uchar readbyte_ds1302(uchar add)
{
        uchar i,temp;
        bit bitemp;
        rst=0;
        sclk=0;
        rst=1;

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=add;
                bitemp=temp&0x01;
                io=bitemp;
                add=add>>1;       
                sclk=1;               
        }
               
        for(i=8;i>0;i--)
        {
                ACC_7=io;
                sclk=0;
                ACC=ACC>>1;
                sclk=1;
        }
               
        rst=0;
        temp=ACC;       
        return(temp);
}

/*************************************************************************************************
函数名称:initial_ds1302()
函数功能:ds1302初始化
CPU_frequence:12Mhz
输入:无
输出:无
调用函数:无
**************************************************************************************************/
void initial_ds1302()
{
        writebyte_ds1302(0x8e,0x00);        //开写保护
        writebyte_ds1302(0x80,0x25);
        writebyte_ds1302(0x82,0x30);
        writebyte_ds1302(0x84,0x10);
        writebyte_ds1302(0x8e,0x80);
}

DS1302.h代码如下:
#ifndef _ds1302_h_
        #define _ds1302_h_

extern void writebyte_ds1302(uchar add,uchar date);
extern uchar readbyte_ds1302(uchar add);
extern void initial_ds1302(void);

#endif

main.c代码如下:
void main()
{
        lcd_initial();
        initial_ds1302();

        while(1)
        {               
                write_com(0x80);
                P1=readbyte_ds1302(0x81);
                write_date(readbyte_ds1302(0x81));
                 while(1);
        }                                                                               
}

全部代码:
读到LCD的始终是一个向左的箭头,郁闷了。
求大侠指导!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-9 23:49:17 | 显示全部楼层
没有仔细看你的代码
可以一步一步调试,先看1302是否驱动正常,然后测试下LCD是否能正常显示数字
你一下就弄到LCD上去了,也不知道是哪里出的问题

出0入0汤圆

 楼主| 发表于 2012-5-10 00:16:58 | 显示全部楼层
hnzjc 发表于 2012-5-9 23:49
没有仔细看你的代码
可以一步一步调试,先看1302是否驱动正常,然后测试下LCD是否能正常显示数字
你一下就 ...

LCD用的是以前调试成功的模块,应该问题不大。

1302把握不大。

呵呵

出0入0汤圆

 楼主| 发表于 2012-5-10 09:08:42 | 显示全部楼层
咋没人帮忙看看呢?
我是初学者,急需各位大侠的指导啊!

出0入0汤圆

 楼主| 发表于 2012-5-10 10:10:47 | 显示全部楼层
再发一次代码:
void writebyte_ds1302(uchar add,uchar date)
{
        uchar i,temp;
        bit bitemp;

        rst=0;
        sclk=0;
        rst=1;

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=add;
                bitemp=temp&0x01;
                io=bitemp;
                add=add>>1;       
                sclk=1;       
        }

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=date;
                bitemp=temp&0x01;
                io=bitemp;
                date=date>>1;       
                sclk=1;                       
        }

        rst=0;
}




uchar readbyte_ds1302(uchar add)
{
        uchar i,temp;
        bit bitemp;
        rst=0;
        sclk=0;
        rst=1;

        for(i=8;i>0;i--)
        {
                sclk=0;
                temp=add;
                bitemp=temp&0x01;
                io=bitemp;
                add=add>>1;       
                sclk=1;               
        }
               
        for(i=8;i>0;i--)
        {
                ACC_7=io;
                sclk=0;
                ACC=ACC>>1;
                sclk=1;
        }
               
        rst=0;
        temp=ACC;       
        return(temp);
}
我对着论坛上别人的调试心得严格检查过,没办法了,大虾门,Give me your hands please!

出0入0汤圆

发表于 2012-5-10 12:45:37 | 显示全部楼层
DS1302 读出的数据要么是BCD码要么是HEX,要送显示肯定要转成字符才行啊。没看代码。

出0入0汤圆

 楼主| 发表于 2012-5-10 15:03:43 | 显示全部楼层
nicksean 发表于 2012-5-10 12:45
DS1302 读出的数据要么是BCD码要么是HEX,要送显示肯定要转成字符才行啊。没看代码。 ...


DS1302读出的数据时BCD码,
我现在只求能正确读出,
只有能正确读出来我才可以转成字符啊。

问题是:我现在读出的数据是左向的箭头。
估计是时序或延时不够的问题。

出0入0汤圆

发表于 2012-5-10 20:23:21 | 显示全部楼层
没详细看,好像是延时不够,给你一段代码参考.
  1. /*******************************DS1302写数据(底层协议)**********************************/
  2. void write_clock(unsigned char ord, unsigned char dd)
  3. {
  4.   clock_clk=0;
  5.   clock_Rst=0;
  6.   clock_Rst=1;
  7.   clock_out(ord);
  8.   clock_out(dd);
  9.   clock_Rst=0;
  10.   clock_clk=1;
  11. }
  12. /***************************1302驱动程序(底层协议)*********************************/
  13. void clock_out(unsigned char dd)
  14. {
  15.   ACC=dd;
  16.   clock_dat=a0; clock_clk=1; clock_clk=0;
  17.   clock_dat=a1; clock_clk=1; clock_clk=0;
  18.   clock_dat=a2; clock_clk=1; clock_clk=0;
  19.   clock_dat=a3; clock_clk=1; clock_clk=0;
  20.   clock_dat=a4; clock_clk=1; clock_clk=0;
  21.   clock_dat=a5; clock_clk=1; clock_clk=0;
  22.   clock_dat=a6; clock_clk=1; clock_clk=0;
  23.   clock_dat=a7; clock_clk=1; clock_clk=0;
  24. }
  25. /******************************DS1302写入字节(底层协议)***************************/
  26. unsigned char clock_in(void)
  27. {
  28.   clock_dat=1;
  29.   a0=clock_dat;
  30.   clock_clk=1; clock_clk=0; a1=clock_dat;
  31.   clock_clk=1; clock_clk=0; a2=clock_dat;
  32.   clock_clk=1; clock_clk=0; a3=clock_dat;
  33.   clock_clk=1; clock_clk=0; a4=clock_dat;
  34.   clock_clk=1; clock_clk=0; a5=clock_dat;
  35.   clock_clk=1; clock_clk=0; a6=clock_dat;
  36.   clock_clk=1; clock_clk=0; a7=clock_dat;
  37.   return(ACC);
  38. }
  39. /*****************************DS1302读数据(底层协议)*********************************/
  40. unsigned char read_clock(unsigned char ord)
  41. {
  42.   unsigned char dd=0;
  43.   clock_clk=0;
  44.   clock_Rst=0;
  45.   clock_Rst=1;
  46.   clock_out(ord);
  47.   dd=clock_in();
  48.   clock_Rst=0;
  49.   clock_clk=1;
  50.   return(dd);
  51. }
复制代码

出0入0汤圆

 楼主| 发表于 2012-5-11 09:02:07 | 显示全部楼层
lryxr2507 发表于 2012-5-10 20:23
没详细看,好像是延时不够,给你一段代码参考.

大侠,你的代码确认测试OK吗?
我准备拿你的代码做底层测试一下我的板子。

出0入0汤圆

发表于 2012-5-11 10:05:35 | 显示全部楼层
我现正就是用的这个.

出0入0汤圆

 楼主| 发表于 2012-5-11 10:08:11 | 显示全部楼层
lryxr2507 发表于 2012-5-11 10:05
我现正就是用的这个.

万分感谢,我马上写段代码测试一下板子。
硬件的问题也说不准。

我对了几段代码,和我的时序、延时基本一致,真不懂到底哪里出了问题。

出0入0汤圆

 楼主| 发表于 2012-5-11 10:27:02 | 显示全部楼层
horalxi 发表于 2012-5-11 10:08
万分感谢,我马上写段代码测试一下板子。
硬件的问题也说不准。

自信研究了一下大侠的代码,发现了一点问题:

从DS1302读数据时候,时钟信号从高电平到低电平的脉冲目的是通知DS1302准备好数据,
所以要先把时钟线由高拉低,延时一段时间读IO口,代码:
SCLK=1;
SCLK=0;
DELAY_US(1);
DAT=IO;

而之前理解有误,总是先读IO口,再把时钟线由高到底,代码:
SCLK=1;
DAT=IO;
DELAY_US(1);
SCLK=0;

所以读出来的数据是错的,大侠帮忙分析一下我的理解对吗?

出0入0汤圆

 楼主| 发表于 2012-5-11 22:32:01 | 显示全部楼层
horalxi 发表于 2012-5-11 10:27
自信研究了一下大侠的代码,发现了一点问题:

从DS1302读数据时候,时钟信号从高电平到低电平的脉冲目的 ...

弄了两天,就是我说的这个问题,改过代码后测试通过了。

出0入0汤圆

 楼主| 发表于 2012-5-11 22:32:51 | 显示全部楼层
lryxr2507 发表于 2012-5-10 20:23
没详细看,好像是延时不够,给你一段代码参考.

多亏了大侠的这段代码,让我彻底认识到错的位置。
终于调试成功了。

出0入0汤圆

发表于 2012-5-11 22:51:14 | 显示全部楼层
呵呵,还有呢.........
比如,不能把DS1302的时间写错,否则时钟不走;再比如,修改完时间写进去,时钟就会停止,要设法让时钟再走起来;还有,秒不能修改,怎样在对表时减小误差.........等等.

出0入0汤圆

 楼主| 发表于 2012-5-11 23:16:43 | 显示全部楼层
surf_131 发表于 2012-5-11 22:51
呵呵,还有呢.........
比如,不能把DS1302的时间写错,否则时钟不走;再比如,修改完时间写进去,时钟就会停止, ...

后续工作正在开展,
第一步就是能正确的读写操作,
已经达到。

谢谢大侠关注。

出0入0汤圆

发表于 2012-5-12 13:03:31 | 显示全部楼层
horalxi 发表于 2012-5-11 23:16
后续工作正在开展,
第一步就是能正确的读写操作,
已经达到。

哦,秒的修改我记错了。修改完时间写回去时,秒自动清零。

大侠不敢当,只是接触DS1302略早而已。我的开发平台是pic。

出0入0汤圆

发表于 2012-5-12 13:21:24 | 显示全部楼层
耐心些吧 这芯片还是比较稳定的,驱动也比较简单。一点点对着时序看。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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