找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1953|回复: 1
打印 上一主题 下一主题
收起左侧

这个IIC总线单片机函数中的SDA怎么只有一位啊

[复制链接]
跳转到指定楼层
楼主
ID:302886 发表于 2018-4-21 23:52 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用软件在51上模拟IIC
void delay10us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=10;a>0;a--);
}

void delay10ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=47;a>0;a--);
}

void init()
{
    SCL=1;
    delay10us();
    SDA=1;
    delay10us();

}

void startIIC(void)     //启动IIC
{
    SDA=1;
    delay10us();
    SCL=1;
    delay10us();
    SDA=0;
}

void respond()  //等待应答
{
    char i;
    SCL=1;
    delay10us();
    while(SDA==1&&i<256)         //SCL=1时,若SDA接收到低电平则表明接收正常,至于i是防止程序在此处锁死,防止IIC锁死,一定时间未接收到型号后退出
        i++;
    SCL=0;
    delay10us();
}

void stopIIC()
{
    SCL=1;
    SDA=0;
    delay10us();
    SDA=1;
    delay10us();
    SCL=0;
}

void senddata(char udata)
{
    char i, temp;
    temp=udata;
    for(i=0;i<8;i++)
    {
        temp=temp<<1;
        SCL=0;
        delay10us();
        SDA=CY;
        SCL=1;
        delay10us();
    }

    SCL=0;                            //这之后还要发个1
    delay10us();
    SDA=1;
    delay10us();
}

char readdata()
{
    char i, k;
    SCL=0;
    delay10us();
    SDA=1;
    for(i=0;i<8;i++)
    {
        SCL=1;
        delay10us();
        k=(k<<1)|SDA;
        SCL=0;
        delay10us();
    }
    return k;
}
void write_address(char address, char udata)
{
    startIIC();
    senddata(0xa0);
    respond();
    senddata(address);
    respond();
    senddata(udata);
    respond();
    stopIIC();
}

char read_address(char address)
{
    char date;
    startIIC();
    senddata(0xa0);
    respond();
    senddata(address);
    respond();
    startIIC();
    senddata(0xa1);
    respond();
    date=readdata();
    respond();
    stopIIC();
    return date;
}   




这个函数中的这个的SDA怎么只有一位啊。发送的时候SDA都是一个字节,怎么到读取时就只有一位啊求指教

char readdata()
{
    char i, k;
    SCL=0;
    delay10us();
    SDA=1;
    for(i=0;i<8;i++)
    {
        SCL=1;
        delay10us();
        k=(k<<1)|SDA;
        SCL=0;
        delay10us();
    }
    return k;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:249026 发表于 2018-4-22 11:35 | 只看该作者
readdata()这个函数在读取的过程中循环了8次,刚好是8个位,一个字节
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表