I2C通讯的C语言程序.txt

2025-10-22 19:24:48

1、#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;}//停止信号//在时钟线为高电平时,数据线由低向高跳变.

2、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;}

3、//发送一个字节.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芯片已经读取了数据.//否则为高电平.即发送收败.

4、  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;}

5、//以下所有为测试使用...//应注意,在读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 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++;    }}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢