DS1302读数据时序的一些疑问

2019-07-16 03:12发布

下面是DS1302读数据的子程序,数据手册上不是说在下降沿读取数据吗??可这儿的程序怎么看上去上上升沿读数据呀??        for(i=0;i<8;i++)
        {        SCLK=0;
                if(IO==1)
                {
                        temp=temp|0x80;
                }
                temp=temp>>1;
                SCLK=1;
                _nop_();
敢问一下,是哪错了???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
yatoo
1楼-- · 2019-07-16 08:22
本帖最后由 yatoo 于 2012-12-13 12:33 编辑

具体的 是, ds1302 在sclk上升沿读取 mosi数据,下降沿发布数据到miso上,对于cpu则正好相反...........

这个程序确实是 在下降沿后 读取数据.....没有问题啊

http://bbs.elecfans.com/jishu_295866_1_1.html 参考下.......
911119qianhao
2楼-- · 2019-07-16 08:26
哥,能具体和我讲讲,你上面说的对单片机正好相反是啥意思吗?
yatoo
3楼-- · 2019-07-16 11:49
911119qianhao 发表于 2012-12-13 13:07
哥,能具体和我讲讲,你上面说的对单片机正好相反是啥意思吗?

我们写程序肯定是 在单片机中运行啊, 正好相反的意思 ,就是 mcu在sclk的上升沿(之前)发布数据到mosi(以便DS1302能在SCLK上升沿读走mosi数据); 在 下降沿(之后)读取miso数据(因为miso数据是 DS1302在sclk下降沿发布到miso上的).......
911119qianhao
4楼-- · 2019-07-16 17:16
哥,这是我写的全部程序,就是不知是哪错了,望指教#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IO=P1^0;
sbit SCLK=P1^1;
sbit RST=P1^2;
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar buf[6]={0x12,0x00,0x00,0x00,0x00,0x00};
uchar code wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay1ms(uint z)
{
        uint x;
        uchar y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
uchar read(uchar add)
{
        
        uchar temp=0,i=0;
        RST=0;
        SCLK=0;
        RST=1;
        for(i=0;i<8;i++)
        {        SCLK=0;
                IO=add&0x01;
                _nop_();
                add=add>>1;
                SCLK=1;
        }
        for(i=0;i<8;i++)
        {        SCLK=0;
                if(IO==1)
                {
                        temp=temp|0x80;
                }
                temp=temp>>1;
                SCLK=1;
                _nop_();
        }
        RST=0;
        SCLK=1;
        return temp;        
}
void write(uchar add,uchar temp)
{
        uchar i=0;
        RST=0;
        SCLK=0;
        RST=1;
        for(i=0;i<8;i++)
        {        
                SCLK=0;
                IO=add&0x01;
                _nop_();
                add=add>>1;
                SCLK=1;
               
        }
        for(i=0;i<8;i++)
        {        SCLK=0;
                IO=temp&0x01;
                _nop_();
                temp=temp>>1;
                SCLK=1;
        }
        SCLK=1;
        RST=0;
        
        
               
}
void init()
{
        RST=0;
        SCLK=0;
        RST=1;
        write(0x8E,0x00); //写保护
        write(0x80,buf[2]); //秒
        write(0x82,buf[1]);  //分
        write(0x84,buf[0]);  //时
        
}
void disp()
{
        uchar j=0,i=0,hex=0;        
        for(i=0;i<7;i++)
        {
               
                buf=read(0x85-2*j)/16;
                buf[++i]=read(0x85-2*j)%16;
                j++;
               
        }
        for(i=0;i<7;i++)
        {
                P2=wei;
                P0=duan[buf];
                delay1ms(3);
                P0=0x00;
                P2=0xff;
        }

}
void main()
{
        init();
        while(1)
        {
                disp();
        }
}


仿真中出现的图,可就是在数码管上显示不出



QQ截图20121213170011.png (7 KB, 下载次数: 0)

yjligu
5楼-- · 2019-07-16 22:42
 精彩回答 2  元偷偷看……
j249081716
6楼-- · 2019-07-16 23:08
911119qianhao 发表于 2012-12-13 16:59
哥,这是我写的全部程序,就是不知是哪错了,望指教#include
#include
#define uchar unsigned char

for(i=0;i<8;i++)
        {        SCLK=0;
                if(IO==1)
                {
                        temp=temp|0x80;
                }
                temp=temp>>1;
                SCLK=1;
                _nop_();
        }
        RST=0;
        SCLK=1;
        return temp;        
}
这个移位要在读数据之前移好,否则读的数据是错误的

一周热门 更多>