搞不懂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;
}
* 函数功能 : 读取一个地址的数据
* 输 入 : 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,这样我就清楚了。谢谢大神