关于单片机模拟I2C的总线通信,读一个字节的问题。。
ucharread_byte(){uchari,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();...
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
求帮我解释一下为什么这样写?特别是SCL,SDA的变化问题。。百思不得其解啊。。 展开
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
求帮我解释一下为什么这样写?特别是SCL,SDA的变化问题。。百思不得其解啊。。 展开
2个回答
展开全部
uchar read_byte()
{
uchar i,k;
scl=0; //-IIC规定在SCL底电平的时候,允许SDA发生变化。所以,这里必须自定义为低
delay(); //-单片机端口变化需要一点时间,从机收到变化也需要一点时间,所以必须延时
sda=1; //-这肯定是用51单片机写的程序,因为51单片机在读取IO口时,必须把该口先写为1
delay();
for(i=0;i<8;i++)
{
scl=1; //-把SCL变为高电平时,SDA就不会变化了。数据也就稳定了。
delay();
k=(k<<1)|sda; //-这样写你会理解。K = K<<1; 先把缓冲左移
// K = K | SDA; 再把缓冲的最低位或操作一下,得到数据位
scl=0; //允许IIC发送下一个位
delay(); //-保证IIC能把数据送出
}
return k; 返回读取到的数据。
}
整个核心就在移位、或操作。
先移位后,则缓冲的最低位就为0了。该位与SDA或一下以后,如果数据为1.则缓冲的最低位为1.否则最低位仍然为0.由于FOR循环只有8次。所以,也就读取8次数据就完成了。
{
uchar i,k;
scl=0; //-IIC规定在SCL底电平的时候,允许SDA发生变化。所以,这里必须自定义为低
delay(); //-单片机端口变化需要一点时间,从机收到变化也需要一点时间,所以必须延时
sda=1; //-这肯定是用51单片机写的程序,因为51单片机在读取IO口时,必须把该口先写为1
delay();
for(i=0;i<8;i++)
{
scl=1; //-把SCL变为高电平时,SDA就不会变化了。数据也就稳定了。
delay();
k=(k<<1)|sda; //-这样写你会理解。K = K<<1; 先把缓冲左移
// K = K | SDA; 再把缓冲的最低位或操作一下,得到数据位
scl=0; //允许IIC发送下一个位
delay(); //-保证IIC能把数据送出
}
return k; 返回读取到的数据。
}
整个核心就在移位、或操作。
先移位后,则缓冲的最低位就为0了。该位与SDA或一下以后,如果数据为1.则缓冲的最低位为1.否则最低位仍然为0.由于FOR循环只有8次。所以,也就读取8次数据就完成了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询