关于单片机模拟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的变化问题。。百思不得其解啊。。
展开
 我来答
兰色的闪电
2012-08-15 · TA获得超过934个赞
知道小有建树答主
回答量:558
采纳率:0%
帮助的人:314万
展开全部
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次数据就完成了。
蔚蓝语风
2012-08-10 · TA获得超过505个赞
知道小有建树答主
回答量:248
采纳率:0%
帮助的人:47.7万
展开全部
不为什么啊 芯片资料上不是画着么,只是按照它画着的顺序写的啊

SCL高 SDA下降沿为起始
SCL高 SDA上升沿为终止

一个字节为8。它是读一个左移一个,移动一次进一个,进到一个字节为止,所以是八次
好像每次要延时大于4.7us,所以加个延时吧。

~~~~~~~
追问
那个不是开始的信号,开始有独立的函数,。。。
追答

晕哦 筒子~~

你不开始怎么读数据啊?

这个完全是按图来的

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式