unsigned char Ds1302Read(unsigned char addr)
{
unsigned char n,dat,dat1;
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);
SCLK =1;
_nop_();
SCLK=0;//DS1302下降沿时,放置数据
_nop_();
}
RST=0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return dat;
}
DSIO = addr& 0x01 ;//数据从低位开始传送 这句话为什么要加&0x01,不加有什么后果,举例说明下
dat = (dat>>1) | (dat1<<7);
这语句不懂,举例说明下,谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
addr>>=1;
这两句需要一起看,而且还需要清楚他们是在一个8次for循环中。说明:将addr的每一位都赋值给DSIO一次,起到通信的作用,若各没有&x01,DSIO输出就乱了也没有意义了。
2.dat = (dat>>1) | (dat1<<7);这句话,仍需要结合dat1=DSIO;和清楚起处在8次for循环中。
可以理解为:你需要读取8位数据,每次读取一位,但是单片机的变量是8位的,所以每次读的数据都处在中间变量dat1 8位中的最低位,所以当处理中间变量dat1时先把最低位的数据(就是读出来的数)先向左以7位让它处于最高位然后给到向右移一位的dat,经过8次,dat就是所读8位数据(从低位开始)可以拆分如下
dat1 = dat1 << 7;
dat = dat >> 1;
dat = dat1 | dat;
仍有问题可以微信交流(头像是我的二维码):WM13804014772
都是电子爱好者,真心希望能帮到你 最佳答案
一周热门 更多>