X  
登录

还没有账号?立即注册

忘记密码?
登陆
X  
注册

已经有账号?马上登陆

获取验证码
重新获取(60s)
立即注册
统计
  • 建站日期:2021-03-10
  • 文章总数:68 篇
  • 评论总数:76 条
  • 分类总数:13 个
  • 最后更新:11月1日

51单片机IIC通信函数

海盗船长
首页 单片机例程 正文
广告
#define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
sbit I2C_SCL = P3^7;
sbit I2C_SDA = P3^6;

/*产生总线起始信号*/
void I2CStart()
{
    I2C_SDA = 1;                            //首先确保SDA,SCL都是高电平
    I2C_SCL = 1;
    I2CDelay();
    I2C_SDA = 0;                            //首先拉低SDA
    I2CDelay();
    I2C_SCL = 0;                            //再拉低SCL
}

/*产生总线停止信号*/
void I2CStop()
{
    I2C_SCL = 0;                            //首先确保SDA,SCL都是低电平
    I2C_SDA = 0;
    I2CDelay();
    I2C_SCL = 1;                            //首先拉高SCL
    I2CDelay();
    I2C_SDA = 1;                            //再拉高SDA
    I2CDelay();
}
/*I2C总线写操作,dat为待写入字节,返回值为从机应答位的值*/
bit I2CWrite(unsigned char dat)
{
    bit ack;                                //用于暂存应答位的值
    unsigned char mask;                     //用于探测字节内某一位值得掩码变量

    for(mask = 0x80; mask != 0; mask >>= 1)   //从高位到低位一次进行
    {
        if((mask & dat) == 0)               //该位的值输出到SDA上
            I2C_SDA = 0;
        else
            I2C_SDA = 1;
        I2CDelay();
        I2C_SCL = 1;                        //拉高SCL
        I2CDelay();
        I2C_SCL = 0;                        //再拉低SCL,完成一个位周期
    }

    I2C_SDA = 1;                            //8位数据发送完成后,主机释放SDA,以检测从机应答
    I2CDelay();
    I2C_SCL = 1;                            //拉高SCL
    ack = I2C_SDA;                          //读取此时的SDA值,既为从机的应答位
    I2CDelay();
    I2C_SCL = 0;                            //再次拉低SCL完成应答位,并保持住总线

    return ack;                             //返回从机应答值
}
/*I2C总线读操作*/
unsigned char  I2CRead(bit ack)
{
    unsigned char mask;
    unsigned char dat;

    I2C_SDA = 1;
    for(mask = 0x80; mask != 0; mask >>= 1)
    {
        I2CDelay();
        I2C_SCL = 1;
        if(I2C_SDA == 0)
            dat &= ~mask;
        else
            dat |= mask;
        I2CDelay();
        I2C_SCL = 0;
    }
    I2C_SDA = ~ ack;
    I2CDelay();
    I2C_SCL = 1;
    I2CDelay();
    I2C_SCL = 0;

    return dat;
}
此代码为学习《手把手教你学51单片机》后编写

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2017-7-10,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
51单片机读取EEPROOM(AT24C512)程序
« 上一篇
51单片机串口配置函数
下一篇 »

发表评论