打印

51单片机控制DS1302

[复制链接]
2180|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rousedeshui|  楼主 | 2011-10-24 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//初始化时钟芯片的秒寄存器,用数码管显示
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P1^4;
sbit IO=P1^5;
sbit RST=P2^2;
sbit Q0=P2^0;            //第一位数码管
sbit Q1=P2^1;            //第二位数码管

uchar code table[]={
    0xC0,0xF9,0xA4,0xB0,
    0x99,0x92,0x82,0xF8,
    0x80,0x98
};
void delay(uint z)
{
    uchar i,j;
    for(i=0;i<z;i++)
        for(j=0;j<110;j++);
}
void write_DS1302(uchar d)
{
    uchar i,byte;
    byte = d;
    for(i=0; i<8; i++)
    {     
        IO = (byte>>i)&0x01;
        CLK = 1;
          CLK = 0;

    }
}
uchar read_DS1302()
{
    uchar i,byte;
    for(i=0; i<8; i++)
    {
        byte=byte>>1;
        if(IO==1)
        {
            byte=byte|0x80;
        }
        CLK = 1;
        CLK = 0;
    }
    return(byte);
}
void W1302(uchar ucAddr, uchar ucDa)
{
    RST = 0;
    CLK = 0;
    RST = 1;
    write_DS1302(ucAddr);       /* 地址,命令 */
    write_DS1302(ucDa);       /* 写1Byte数据*/
    CLK = 1;
    RST = 0;
}
uchar R1302(uchar ucAddr)
{
    uchar ucData;
    RST = 0;
    CLK = 0;
    RST = 1;
    write_DS1302(ucAddr);             /* 地址,命令 */
    ucData = read_DS1302();         /* 读1Byte数据 */
    CLK = 1;
    RST = 0;
    return(ucData);
}
void main()
{
    uchar byte;
    W1302(0x8e,0x00);
    W1302(0x80,0x00);
   
    while(1)
    {
        W1302(0x8e,0x80);
        byte=R1302(0x81);
        P2=0xfe;
        P0=table[byte/0x10];
        delay(5);
        P2=0xfd;
        P0=table[byte%0x10];
        delay(5);
    }


问题是:我搞不太清楚DS1302 的时序。DS1302的datasheet里明明说上升沿写入数据,为什么write_DS1302(uchar d)函数写的是:
          IO = (byte>>i)&0x01;
          CLK = 1;
          CLK = 0;
这不是下降沿吗?如果我改成:
         IO = (byte>>i)&0x01;
          CLK = 0;
          CLK = 1;
结果就不对了。
          还有一个问题是:read_DS1302()函数,如果我把它改成:
     for(i=0; i<8; i++)
    {
        CLK = 1;
        CLK = 0;
        byte=byte>>1;
        if(IO==1)
        {
            byte=byte|0x80;
        }
    }
   或者:
      for(i=0; i<8; i++)
    {
        if(IO==1)
        {
            byte=byte|0x80;
        }
        CLK = 1;
        CLK = 0;
       byte=byte>>1;
    }
我觉得这两种写法没啥差呀。
求大牛指教,万分感谢!
        
   

}

相关帖子

沙发
airwill| | 2011-10-24 11:21 | 只看该作者
上升沿写入数据,就是要在上升沿之前准备好数据,等上升沿到来时数据进入芯片

使用特权

评论回复
板凳
ywb888| | 2011-10-24 12:26 | 只看该作者
二楼正接,数据准备好,上升沿数据写入芯片,也许写入这个词用错了。

使用特权

评论回复
地板
rousedeshui|  楼主 | 2011-10-24 15:16 | 只看该作者
2# airwill
那不就应该是这样写吗?
          IO = (byte>>i)&0x01;
          CLK = 0;
          CLK = 1;
可是这样子运行结果就不对了

使用特权

评论回复
5
小模头| | 2011-10-24 15:26 | 只看该作者
网上一艘一大堆

使用特权

评论回复
6
Jackson_lv| | 2012-3-27 21:12 | 只看该作者
请问楼主的单片机具体是什么型号呢?

使用特权

评论回复
7
鬼影左翼| | 2012-3-27 21:59 | 只看该作者
二楼是正解的,建议看英文资料

使用特权

评论回复
8
lxh0035| | 2013-6-19 15:33 | 只看该作者
要整体看时序图,严格把一个数据的读取过程按照芯片资料的时序画一下就知道了。

使用特权

评论回复
9
流水随春去远| | 2013-6-23 01:34 | 只看该作者
当初我也有这个疑问,后来还是没解决,到现在还留着

使用特权

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

本版积分规则

0

主题

6

帖子

1

粉丝