微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 搞不懂DS1302接收数据中的一段程序,求大神帮忙

搞不懂DS1302接收数据中的一段程序,求大神帮忙

时间:10-02 整理:3721RD 点击:
函 数 名         : Ds1302Read
* 函数功能                   : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();
        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();
        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);//不懂的就是这一处,当把dat1的数据左移7位后,那么岂不是每次都是DSIO的最后一位放到dat的第一位吗?可是实际需要时把DSIO从低到高放到dat中呀?实在是想不通
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}

dat1接收DSIO数据,但是是在最低位,ds1302是先发送低位数据的,所以dat的数据要右移,从DSIO接收到的数据要放在dat的高位,这样右移后,DSIO接收到的数据才会移到正确的位置,因为要把DSIO接收到的数据放在dat的高位,所以dat1要左移到高位。

应该是对的把,执行有先后顺序的

谢谢您的回答,您讲的这个关于dat的移动我是懂的,我不懂的是dat1的移动,dat1左移7位后,比如原来dat1是0000 0001 就变成了1000 0000 ,经过dat = (dat>>1) | (dat1<<7)的运算,dat就成了1xxx xxxx;第二次循环时,data右移1位,dat1仍然左移7位,那么,经过dat = (dat>>1) | (dat1<<7)的运算后,dat就成了11xx xxxx 。如此循环,每次都是把dat1的最低位放到dat的最高位去,这样显然是不对的。

你还是没懂,这里的重点不是dat1,而是dat,ds1302是先发送低位数据的,这样把da1302的数据放在dat的高位,再进行右移,就可以得到正确格式的数据。
根据c语言的规则,dat1 = DSIO是把一个位数据赋给字节,这个位数据会在字节的最低位,而dat的右移是把高位向低位移动,那么dat1的数据就必须在最高位,才能赋给dat的最高位,这样dat1就必须左移将最低位移到最高位。

哦哦,我懂了,原来DSIO每一次循环只接收到一个位的数据并赋给字节dat1,这样我就清楚了。谢谢大神

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top