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

📄 iic.h

📁 这个是通过两个IO口虚拟IIC的C51程序
💻 H
字号:
/*********************************************************************/
/* IIC读写程序芯片型号*/
/*********************************************************************/
/*********************************************************************/
#include <C8051F310.h>
#include <intrins.h>
sbit I2C_SCK=P1^5; /*实时时钟时钟线引脚 */
sbit I2C_SDA=P1^4; /*实时时钟数据线引脚 */
/*********************************************************************/
#define ATIIcxxDriverAddressW 0xC0 
#define ATIIcxxDriverAddressR 0xC1 
#define _Nop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()    /*定义空指令*/
/*********************************************************************/
struct bytedata_2
{
 unsigned char ByteH;
 unsigned char ByteL;
};

union int2byte
{
 unsigned int IntData;
 struct bytedata_2 ByteData;
};
/*********************************************************************/
//启动I2C总线,退出时SCL为低
void I2C_Start(void) 
{ 
 I2C_SDA=1;    /*发送起始条件的数据信号*/
 _Nop();
 I2C_SCK=1;
 _Nop();     /*起始条件建立时间大于4.7us,延时*/
 _Nop();
 _Nop();
 _Nop();
 _Nop();    
 I2C_SDA=0;    /*发送起始信号*/
 _Nop();     /* 起始条件锁定时间大于4μs*/
 _Nop();
 _Nop();
 _Nop();
 _Nop();       
 I2C_SCK=0;    /*钳住I2C总线,准备发送或接收数据 */
}
//*停止I2C总线
void I2C_Stop(void) 
{ 
 I2C_SCK=0;
 I2C_SDA=0;   /*发送结束条件的数据信号*/
 _Nop();           /*发送结束条件的时钟信号*/
 I2C_SCK=1;   /*结束条件建立时间大于4μs*/
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 I2C_SDA=1;   /*发送I2C总线结束信号*/
} 
//MCU等待应答位(返回0表示应答)
bit I2C_WaitAck(void) 
{
 unsigned char ucErrTime = 800;   //因故障接收方无ACK,超时值。
 
 I2C_SCK=0;
 I2C_SDA=1;
 _Nop();
 I2C_SCK=1;
 _Nop();
   while(I2C_SDA)
   {
      ucErrTime--;
      if (ucErrTime == 0)
      {
         I2C_Stop();
         return 0;
       }
   }
   
   I2C_SCK=0;
   return 1;  
}
//MCU应答信号
void I2C_Ack(void)
{
 I2C_SCK=0;
 I2C_SDA=0;
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 I2C_SCK=1;
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 _Nop();
 I2C_SCK=0;
} 
//MCU发送非应答信号
void I2C_Noack(void) 
{ 
 I2C_SCK=0;
 I2C_SDA=1;
 _Nop();
 _Nop();
 I2C_SCK=1;
 _Nop();
 _Nop();
 I2C_SCK=0;
} 
void I2C_Send_Byte(unsigned char sendbyte) 
{ 
 unsigned char i = 8; 
 
 while( i-- ) 
 {
  I2C_SCK = 0;
  _Nop(); //_Nop(); 
  if ( sendbyte &0x80 ) I2C_SDA =1; 
  else I2C_SDA =0;
  _Nop(); //_Nop(); 
  I2C_SCK = 1;
  _Nop(); //_Nop(); 
  sendbyte <<= 1; 
 }
 
 I2C_WaitAck();
}
 
static unsigned char I2C_Receive_Byte(void) 
{ 
 unsigned char i = 8, data_buffer;
 
 I2C_SDA = 1; 
 while ( i--) 
 { 
  I2C_SCK =0;
  _Nop();_Nop();
  I2C_SCK =1; 
  _Nop();_Nop();
  data_buffer <<= 1; 
  
  if ( I2C_SDA ) data_buffer++;  
 } 
 return (data_buffer); 
} 

void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count) 
{ 
 I2C_Start(); 
 I2C_Send_Byte( ATIIcxxDriverAddressW ); 
   _Nop();_Nop();
 while(count--) 
 { 
  I2C_Send_Byte( *(unsigned char*)McuAddress ); 
  ((unsigned char*)McuAddress)++;
    _Nop();_Nop();
 } 
 _Nop();
 I2C_Stop(); 
 _Nop();
}

void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count) 
{ 
 I2C_Start(); 
 I2C_Send_Byte( ATIIcxxDriverAddressR ); 
 //_Nop();_Nop();
 while(count--) 
 {
  *McuAddress = I2C_Receive_Byte();

  I2C_Ack(); 
  McuAddress++; 
  //_Nop();_Nop(); 
 }
 //_Nop();
 I2C_Noack(); 
 I2C_Stop(); 
}

⌨️ 快捷键说明

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