51模拟I2C

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit SCL = P1^0;
sbit SDA = P1^1;
void Delayus(uchar us)
{
    while(us--)
    {
    _nop_();
    _nop_();
    _nop_();
    }
}
void I2CStart()   //I2C起始信号
{
    SDA=1;
    _nop_();
    SCL=1;  //首先保证SDA SCL都是1;
    Delayus(4);
    SDA=0;
    Delayus(4);
    SCL=0;  //钳住I2C总线,准备发送或接受数据;
    _nop_();
    _nop_();
}
void I2CStop() //I2C终止信号
{
    SDA=0;   //首先保证SDA SCL都为0
    _nop_();
    SCL=1;
    Delayus(4);
    SDA=1;
    Delayus(4);
}

bit I2C_Write_Byte(uchar dat) //I2C写字节函数 返回从机应答值,为1时,接受成功,否则失败;
{
    bit ACK;       //暂存从机应答值
    uchar Mask;    //用于探测字节内某一位值的掩码变量
    for(Mask=0x80;Mask!=0;Mask>>=1)
    {
        if((Mask&dat)==0)    SDA=0;
        else    SDA=1;
        _nop_();
        SCL=1;
        Delayus(4);
        SCL=0;
    }
    _nop_();
    _nop_();
    SDA = 1;
    _nop_();
    _nop_();
    SCL=1;
    Delayus(3);
    if(SDA==0)ACK=0;
    else ACK=1;
    SCL=0;
    Delayus(2);
    return (~ACK);   //0写入失败,1写入成功
}

uchar I2C_Rec_Byte()     //I2C读字节函数;返回读取的字节;发送应答信号;(若发送非应答信号只要将最后发送的0改为1即可)
{
    uchar Dat=0x00;  //定义返回值
    uchar Mask; //设置掩码;
    SDA = 1;     //首先确保主机释放SDA
    for(Mask=0x80;Mask!=0;Mask>>=1)   //从高位到低位依次进行;
    {
        Delayus(1);
        SCL=1;         //拉高SCL
        if(SDA==0)Dat&=~Mask;  
        else Dat|=Mask;
        Delayus(1);
        SCL=0;
    }
    SDA=0;  //应答信号(非应答信号为1)  //这里的0或1是主机的应答信号;应答0——表示继续读取;应答1——表示停止读取
    Delayus(2);;
    SCL=1;
    Delayus(4);
    SCL=0;
    return Dat;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值