I2C通讯的C语言程序

来源:互联网 发布:游戏编程视频教程 编辑:程序博客网 时间:2024/05/16 19:41

I2C通讯的C语言程序

I2C通讯的C语言程序
I2C通讯的C语言程序

#include <INTRINS.H>
#include <stdio.h>
#include <reg51.h>

sbit SCK=0x91;//时钟线端口
sbit SDA=0x90;//数据线端口

#define  I2C_Address 0xa0 //I2C芯片地址
#define  nop _nop_()  
#define  NOP nop;nop;nop;nop;nop;nop//延时应大于4.7us

//开始信号
//在时钟线为高电平时,数据线由高向低跳变. 
void StartI2C(void)
  SCK=1;
    SDA=1;
    NOP;
    SDA=0;
    NOP;
    SCK=0;
    NOP;
}
//停止信号
//在时钟线为高电平时,数据线由低向高跳变.
void StopI2C(void)
  SDA=0;
    NOP;
    SCK=1;
    NOP;
    SDA=1;
}

//发送一个字节.
bit SendChar(unsigned char SendData)
  unsigned char i;
    bit ACK;
    for(i=0;i<8;i++)
    {   if((SendData<<i)&0x80)SDA=1;
        else SDA=0;
        SCK=1;
        NOP;
        SCK=0;
        NOP;
    }
//发送一个字节后,读取来自I2C芯片的响应.
//即在发送完8个字节后,在第九个时钟内,SDA总线应为低电平,表示I2C芯片已经读取了数据.
//否则为高电平.即发送收败.
    SDA=1;
    SCK=1;
    NOP;
    ACK=SDA;
    SCK=0;
    NOP;
    return ACK;

}
//在读取完来自I2C的8位数据后,发出读取正确位.
//即发送一个低电平,表示已经读取到来自I2C的数据,并允许I2芯片发送下一字节.
void ACK(void)
  SDA=0;
    NOP;
    SCK=1;
    NOP;
    SCK=0;
}
//在读取完来自I2C的8位数据后,发送不响应位.
//即发送一个高电平,表示已经读取完来自I2C的数据,并且不允许I2C发送下一字节.
void NAK(void)
{
    SDA=1;
    NOP;
    SCK=1;
    NOP;
    SCK=0;
}
//读入一个字节的数据.
unsigned char ReadChar(void)
  unsigned char i,BackData;
    BackData=0;
    SDA=1;
    for(i=0;i<8;i++)
    {   SCK=1;
        nop;nop;nop;
        BackData=BackData<<1;
        if(SDA)BackData++;
        SCK=0;
    }
    return BackData;
}

//以下所有为测试使用...
//应注意,在读I2C芯片时,在发送完I2C片内地址后,
//一定要发送一个重开始信号,然后再发送读命令.

bit WriteI2C(unsigned char Address,unsigned char WriteData)
  SENDSTART:
    StartI2C();
    if(SendChar(I2C_Address)) goto SENDSTART;
    SENDADD:
    if(SendChar(Address)){StartI2C;goto SENDADD;}
    SENDDATA:
    if(SendChar(WriteData)){StartI2C;goto SENDDATA;}
    if(SendChar(WriteData)){StartI2C;goto SENDDATA;}
    StopI2C();
    return 0;
}


unsigned char ReadI2C(unsigned char Address)
  unsigned char BackData;
    ReadSTART:
    StartI2C();
    if(SendChar(I2C_Address)) goto ReadSTART;
    ReadADD:
    if(SendChar(Address)){StartI2C;goto ReadADD;}
    ReadSTART2:
    StartI2C();
    if(SendChar(I2C_Address+1)) goto ReadSTART2;
    BackData=ReadChar();
    ACK();
    BackData=ReadChar();
    NAK();
    StopI2C();
    return BackData;
}

void Delay(unsigned int ms)
  unsigned int i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<240;j++);
}

void main(void)
  bit j;
    unsigned char i,BackData=0;
    unsigned char Address=0x00,ReadData=0x00;
    while(1)
    {   ResetI2C;
        ReadData=ReadI2C(Address);
        ReadData++;
        Delay(5);
        WriteI2C(Address,ReadData);
        Delay(5);
        Address++;Address++;

    }
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 摩托车驾驶证副本丢了怎么办 人被全险车撞了怎么办 被全险车撞了怎么办 驾驶证和行驶证遗失怎么办 户口迁移身份证没换驾照怎么办 户口迁回时身份证掉了怎么办 户口毕业托管身份证掉了怎么办 身份证和户口都掉了怎么办 毕业生户口迁回原籍没身份证怎么办 落户上海后怎么办医保卡 小车临时牌过期了怎么办 驾驶证地址错了一个字怎么办 驾驶证名下车辆有违章怎么办 a2如果扣12分怎么办 b2一次超速12分怎么办 b2本扣了12分怎么办 驾照扣了27分怎么办 大车一次扣12分怎么办 a2驾照扣10分怎么办 驾驶证强制降级没给驾驶证怎么办 6P升11.2卡了怎么办 b2驾照记满12分怎么办 c1驾驶证没分了怎么办 驾照扣了15分怎么办 驾驶证暂扣六个月后怎么办 醉驾交警不通知怎么办 参军后地方驾驶证年审怎么办 军人驾驶证到期身份证注销了怎么办 资格证脱审30天怎么办 驾驶证c证扣6分怎么办 驾照被扣了9分怎么办 驾驶证被扣了9分怎么办 a2驾驶本扣3分怎么办 c1e没过扣了满分怎么办 c1一下扣12分怎么办 换证体检过不了怎么办 唐山驾驶本到期换本怎么办 北京居住证变更地址了怎么办 眼睛弱视驾驶证换证不了怎么办? 驾照的分扣完了怎么办 驾照被扣了3分怎么办