⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 51单片机I2C总线的万用驱动程序源代码
💻 C
字号:

      /*------------------------------------------------------------------------------------------
      [文件名] I2C.c
      [版本] 1.1b
      [作者] 鞠春阳
      [最后修改时间] 2003年5月12日
      [版权所有] www.mcuzb.com
      [资料] 请到www.mcuzb.com下载
      ===========================================================================================*/
      #include "reg51.h"
      #include "intrins.h"
      unsigned char SystemError;
      sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义
      sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的需要来定义
      #define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
      /*--------------------------------------------------------------------------------
      调用方式:void AD7416_I2CStart(void) 2003/05/04
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CStart(void)
      {
      EA=0;
      SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
      SDA=0; SomeNOP(); 
      SCL=0;
      }
      /*--------------------------------------------------------------------------------
      调用方式:void AD7416_I2CStop(void) 2003/05/04
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CStop(void)
      {
      SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
      SCL=1; SomeNOP(); SDA=1; 
      EA=1;
      }
      /*--------------------------------------------------------------------------------
      调用方式:I2CAck(void) 2003/05/13
      函数说明:私有函数,I2C专用,等待从器件接收方的应答
      ACK BY AD7416
      ---------------------------------------------------------------------------------*/
      WaitAck(void)
      {
      unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
      SDA=1;
      SCL=1;
      SystemError=0x10; 
      while(SDA)
      { errtime--;
      if(!errtime)
      { AD7416_I2CStop();
      AD7416_SystemError=0x11; //出错后给全局变量赋值
      return;
      }
      }
      SCL=0; 
      }
      /*--------------------------------------------------------------------------------
      调用方式:void SendAck(void) ﹫2003/05/13
      函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
      ---------------------------------------------------------------------------------*/
      void SendAck(void)
      {
      SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
      SCL=1; SomeNOP();
      SCL=0;
      }
      /*--------------------------------------------------------------------------------
      调用方式:void SendAck(void) ﹫2003/05/13
      函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
      --------------------------------------------------------------------------------*/
      void SendNotAck(void)
      {
      SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
      SCL=1; SomeNOP();
      SCL=0;
      }
      /*--------------------------------------------------------------------------------
      调用方式:void I2CSend(uchar ch) 2003/05/13
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CSendByte(Byte ch)
      {
      unsigned char i=8;
      while (i--)
      {
      SCL=0;_nop_();
      SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据
      SCL=1; SomeNOP();
      }
      SCL=0;
      }
      /*--------------------------------------------------------------------------------
      调用方式:uchar I2CReceive(void) 2003/05/13
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      Byte I2CReceiveByte(void)
      {
      unsigned char i=8,data=0;
      SDA=1;
      while (i--)
      {
      data<<=1;
      SCL=0;SomeNOP();
      SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
      data|=SDA;
      }
      SCL=0;
      return data;
      }
      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -