打印

高手请帮忙看下,关于DS1302时钟芯片

[复制链接]
1353|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ymc123405|  楼主 | 2008-5-1 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想使用这个芯片做一个时钟
但是读出来的始终是0x7F,查了不少资料,始终不知道怎么解决
已经做了3天了,感觉快疯了。
如果有人有这方面的经验,麻烦指点下,先谢过了
#include "AT89X52.h"
#include "absacc.h"
#include "intrins.h"


sbit clk = P3^4;
sbit dat = P3^5;
sbit rst = P2^7;

unsigned char init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年

//向DS1302写一个字节数据
void WriteOneByte(unsigned char data1)
{
    unsigned char i;
    for(i=8;i>0;i--)
    {

        clk = 0;
              if(data1&0x01)
                  dat = 1;
              else
                  dat = 0;
        clk = 1;
              _nop_();_nop_();
        data1 = data1>>1;
    }
}

//从DS1302读一个字节数据
unsigned char ReadOneByte()
{
    unsigned char i,temp = 0;
    dat = 1;
    for(i =8;i>0;i--)
    {
        clk = 0;
        if(dat == 1)
            temp= temp|0x80;
        else
            temp= temp&0x7f;
        clk = 1;
        temp= temp>>1;
    }
    return temp;
}

void WriteData(unsigned char addr, unsigned char num)
{
    rst = 1;
    WriteOneByte(addr);
    WriteOneByte(num);
    rst =0;
       clk =0;
}

unsigned char ReadData(unsigned char addr)
{
    unsigned char data1;
    rst = 1;
    WriteOneByte(addr);
    data1 = ReadOneByte();
        rst = 0;
    return data1;
}

unsigned char ReadSec()
{
    unsigned char data1;
    data1 = ReadData(0x81);
    return data1;
}
unsigned char ReadMin()
{
    unsigned char data1;
    data1 = ReadData(0x83);
    return data1;
}
void initds1302()
{
        rst=0;
      clk=0;
      WriteData(0x80,0x00);
      WriteData(0x90,0x00);//禁止涡流充电
}
void set_ds1302(unsigned char addr,unsigned char *p,unsigned char n)//写入n个数据
{
      WriteData(0x8e,0x00);//写控制字,允许写操作
      for(;n>0;n--)
      {
        WriteData(addr,*p);
           p++;
           addr=addr+2;
      }
      WriteData(0x8e,0x80);//写保护,不允许写
}
void main()
{
    unsigned char sec,min;
        initds1302();
        set_ds1302(0x80,init,7);
    while(1)
    {
        sec = ReadData(0x81);
        min = ReadData(0x85);
    }
}

相关帖子

沙发
dai_weis| | 2008-5-2 19:47 | 只看该作者

DS1302上电在0-2V之间各个引脚的电平要注意

还有先要打开标志位才能运行否则DS1302是停止的。
晶体是否正常?

使用特权

评论回复
板凳
ymc123405|  楼主 | 2008-5-2 20:58 | 只看该作者

DS1302上电在0-2V之间各个引脚的电平要注意

标志位是指秒寄存器中的CH位吧,这个上来就置0了
晶体也是工作正常的
“DS1302上电在0-2V之间各个引脚的电平要注意”这个是什么意思呢?
它的信号不是TTL电平么?

使用特权

评论回复
地板
hotpower| | 2008-5-2 21:52 | 只看该作者

ReadOneByte()有错误~~~先读后移太倒塌~~~

哈哈~~~最近怎么了~~~总有人喜欢"先读后移"???

不解~~~
相关链接:https://bbs.21ic.com/club/bbs/list.asp?boardid=26&t=2939552

使用特权

评论回复
5
ymc123405|  楼主 | 2008-5-2 23:37 | 只看该作者

恩,多谢四楼,但主要问题还是存在唉

先读后移确实有问题,但改掉后就读出来全是0xFF了。。
还是不正常的说

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝