关于DS1302程序问题

2019-07-15 12:07发布

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);
这语句不懂,举例说明下,谢谢了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
MENGXIN91
1楼-- · 2019-07-15 14:36
1.DSIO=addr&0x01;//数据从低位开始传送
  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
都是电子爱好者,真心希望能帮到你 最佳答案
枫林之上
2楼-- · 2019-07-15 19:43
DSIO = addr& 0x01 ;//数据从低位开始传送
因为你的DSIO是一位的数据,,你需要发送的数据addr是八位的数据,八位数据不能直接发送,所以需要把它拆开成八个一位的数据发送
dat = (dat>>1) | (dat1<<7);
这个就是把dat中原数据右移后将新数据填补到空缺位,八次后得到的数据就是你接收到的数据
枫林之上
3楼-- · 2019-07-15 22:20
例如你的dat是1011 1101,接收到的数据是1,那经过移动后就是0101 1110在与上dat1左移七位就是1101 1110,这样七次后就能将接收到的八位数替换到dat中
chenwei6991627
4楼-- · 2019-07-16 01:36
移位的时候要用到的数据
boiled_water
5楼-- · 2019-07-16 02:26
 精彩回答 2  元偷偷看……
MENGXIN91
6楼-- · 2019-07-16 05:16
boiled_water 发表于 2017-1-12 14:05
你有QQ吗?

奥,原来昨天是你加我,华仔!

一周热门 更多>