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

📄 24cxx.h

📁 带有24C02的红外数据接收程序
💻 H
字号:
#ifndef I2C_2003_7_24
#define I2C_2003_7_24

#include "USER.H"
sbit  SDA=P3^7;
sbit  SCL=P3^6;

void I2C_Start();  // 开启总线       (内部函数)
void I2C_Stop();   // 结束总线函数   (内部函数)
void I2C_Init();   // 初始化函数     (内部函数)
bit  I2C_Clock();  // 发送或接收1Bit (内部函数)

void  I2C_SendByte(uchar Data);  // 发送一个字节(内部函数)
uchar I2C_ReceiveByte();         // 接收从器件传来的数据(内部函数)
void  I2C_Ack(bit a);            // 发送应答信号  I2C_Ack(TRUE); 
                                 // 发送非应答信号I2C_Ack(FALSE);

bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n);                       
             // 将n个字节的数据写入/读出, Control为控制字符, Addr为地址
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n);

void Write24CXX(uint Addr, uchar *Buffer, uchar n);
             // 对AT24C16读写数据, Addr为16位地址 0x0000~0x07FF
void Read24CXX(uint Addr, uchar *Buffer, uchar n);


bit Ack;	      // 应答标志位
   
void I2C_Start()  // 开启总线
{
  	Delay1us();
  	SCL=1;        // 初始化高电平
  	Delay5us();    
  	SDA=0;   	  // 发送开始信号
  	Delay5us();   	  
  	SCL=0;   	  // 拉低时钟信号,以锁定总线
  	Delay5us();
}

void I2C_Stop()   // 结束总线函数
{
  	SDA=0;  	  // 发送结束条件的数据信号
  	Delay1us();   	
  	SCL=1;  	  // 发送结束条件的时钟信号 
  	Delay5us();
  	SDA=1;  	  // 发送I2C总线结束信号
  	Delay5us();
  	SCL=0;        // 关闭总线
}

void I2C_Init()   // 初始化函数
{
	SCL=0;
    Delay5us();
	I2C_Stop();
}

bit I2C_Clock()   // 用于发送1Bit(调用前要将数据送到SDA)
{                 // 也可用于接收(接收时钟上升3us后的数据)
	bit Sample;
	
	Delay2us();
	SCL=1;             // 拉高时钟	
	Delay3us();
	Sample=SDA;        // 读取数据线状态
	Delay2us();
	SCL=0;             // 恢复时钟低电平
	Delay5us();
		
	return Sample;
}

void  I2C_SendByte(uchar Data)  // 发送一个字节
{
 	uchar i; 
 
 	for(i=0; i<8; i++)  
 	{
	 	SDA=(bit)(Data&0x80);
	 	I2C_Clock();                
     	Data=Data<<1;
	}
    
    SDA=1;
	Ack=!I2C_Clock();
}

uchar  I2C_ReceiveByte()    //接收从器件传来的数据
{
  	uchar Data=0, i;
	SDA=1;
  	for(i=0; i<8; i++)
    {               
        Data=Data<<1;
        if(I2C_Clock()) Data++;		  
    }
	return Data;
}

void I2C_Ack(bit a)         // 发送应答信号   I2C_Ack(TRUE);
{                           // 发送非应答信号 I2C_Ack(FALSE);
  	if(a==FALSE) SDA=1;
  	else SDA=0;

  	Delay3us();      
  	SCL=1;
  	Delay5us(); 
  	SCL=0;                  // 清时钟线,钳住I2C总线以便继续接收
  	Delay2us();   
}

bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n)
{                        
	              // 将n个字节的数据写入器件中, Control为控制字符, Addr为地址
	uchar i;

   	I2C_Init();	 
   	I2C_Start();                  // 启动总线
   	I2C_SendByte(Control);        // 发控制字符
   	if(Ack==0)
   		return(0);

   	I2C_SendByte(Addr);           // 发送器件地址
   	if(Ack==0)
   		return(0);

   	for(i=0;i<n;i++)
   	{   
     	I2C_SendByte(*Buffer);    // 发送数据
    	if(Ack==0)
	 		return(0);
     	Buffer++;
   	} 
   	I2C_Stop();                   // 结束总线 
   	return(1);
}

bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n)
{
	        // 从器件中读出n个字节的数据到Buffer中, Control为控制字符, Addr为地址
   	uchar i;

   	I2C_Init();
   	I2C_Start();                  // 启动总线
   	I2C_SendByte(Control);        // 发控制字符
   	if(Ack==0)
		return(0);

   	I2C_SendByte(Addr);           // 发送器件地址
   	if(Ack==0)
   		return(0);

   	I2C_Start();			      // 重新启动总线
   	I2C_SendByte(Control|0x01);
   	if(Ack==0)
		return(0);

   	for(i=0; i<n-1; i++)
   	{   
     	*Buffer=I2C_ReceiveByte();// 接收数据
    	I2C_Ack(TRUE);            // 发送应答信号  
     	Buffer++;
   	} 
   	*Buffer=I2C_ReceiveByte();
   	I2C_Ack(FALSE);               // 发送非应答信号
   	I2C_Stop();                   // 结束总线 
   	return 1;
}

/** 对AT24CXX写数据, Addr为16位地址 0x0000~0x07FF **/
void Write24CXX(uint Addr, uchar *Buffer, uchar n)
{
	uchar h, l;
	h = (Addr>>7)&0x0E;
	l = Addr&0x00FF;
	I2C_Write(0xA0|h, l, Buffer, n);
}

/** 读取AT24CXX数据, Addr为16位地址 0x0000~0x07FF **/
void Read24CXX(uint Addr, uchar *Buffer, uchar n)
{
	uchar h, l;
	h = (Addr>>7)&0x0E;
	l = Addr&0x00FF;
	I2C_Read(0xA0|h, l, Buffer, n);
}

#endif

⌨️ 快捷键说明

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