打印

帮我看看

[复制链接]
1515|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zl040901|  楼主 | 2008-7-31 12:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用51的IO口模拟IIC口,发送一位数据之后,为什么要置SDA为1啊,可以不置吗,下面有一个例子




unchar read(uchar *p)
  { 
     unchar temp,n=8;
     temp=*p;  /要传送的数据
     while(--n)
      {
        if(temp&0x80==1)
         { 
          SDA=1;
          SCL=1;
          DELAY();/延时4.7us
          SCL=0;
          SDA=0;
         }
        else
         {
          SDA=0;
          SCL=1;
          DELAY();/延时4.7us
          SCL=0;
         }
        temp<<=1;
      } 

相关帖子

沙发
cumtnj| | 2008-7-31 13:30 | 只看该作者

SDA 置1是用来释放数据总线的

我认为发送完一帧数据后是要置1来释放数据总线的 ,这样才能等待下一条指令来继续传输数据啊

使用特权

评论回复
板凳
huangqi412| | 2008-7-31 13:39 | 只看该作者

51是准双向

使用特权

评论回复
地板
zl040901|  楼主 | 2008-7-31 19:15 | 只看该作者

不好意思

是发送完了一位之后,SDA置0,这是为什么,可以不吗

使用特权

评论回复
5
grady1125| | 2008-7-31 22:05 | 只看该作者

此程序一优化就省一半代码

为什么写那么多重复?

使用特权

评论回复
6
太阳之母| | 2008-7-31 22:28 | 只看该作者

嘿嘿

#define uchar unsigned char
//... ...
void DELAY()
{
//    ... ...
}
//... ...
unchar read(uchar dat)

    unchar n=8;
    while(--n)
    {
        SDA = (dat >= 0x80);   //原来定义的那个temp&0x80永远不==1!
        SCL = 1;
        DELAY();                //延时4.7us,注释前面是"//"不是"/"
        SCL = 0;
        dat <<= 1;
    }
    SDA = 1;                   //释放总线,51的IO是准双向的
}

使用特权

评论回复
7
zl040901|  楼主 | 2008-8-1 12:23 | 只看该作者

谢谢

谢谢6楼的帮我写了更优化的代码,我把我的程序(temp&0x80!=0)应该可以吧
我在好多程序里看到发送完了一位之后,把SDA置0 ,这有什么做用呢,能解释一下吗

使用特权

评论回复
8
zl040901|  楼主 | 2008-8-2 20:58 | 只看该作者

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

61

帖子

0

粉丝