标题:
单片机DS1302芯片程序不太懂(地址右移问题)求指点
[打印本页]
作者:
15348420767
时间:
2020-12-24 13:00
标题:
单片机DS1302芯片程序不太懂(地址右移问题)求指点
/*******************************************************************************
* 函数功能 : 读取一个地址的数据
*******************************************************************************/
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);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
这个DS1302的程序有点看不懂,请问那个地址右移一位之后,它的地址会是哪一个?如果它的地址是0x81,它右移一位不是变成了0x40了吗?DS1302没有这个地址啊!
作者:
wulin
时间:
2020-12-24 17:17
串行传输数据是把1个字节8位数据按位逐个传输,根据不同器件特性要求由低到高或由高到低传输。
DSIO = addr & 0x01;是把 addr的最低位分离出来赋值于DSIO
addr >>= 1;等效addr = addr>>1; addr 右移1位后,最低位溢出,最高位补0。循环8次就把1个字节数据由低到高传输出去。
作者:
csmyldl
时间:
2020-12-25 00:50
如果它的地址是0x81,它右移一位不是变成了0x40了吗?DS1302没有这个地址啊!
你只看到了右移1位,实际上是右移8位才把该数据赋值给DS1302,确定要读出的地址单元,读出时即先送入地址,DS1302才会有数据输出,写入时也需先送地址,才会把要写入的数据写入指定的地址中
作者:
人人学会单片机
时间:
2020-12-25 12:58
建议你先去看看《人人学会单片机》视频教程第13课、14课 595的移位发送。视频讲解很详细的!
595和1302是一样的移位传输方式
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1