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

📄 iic.c

📁 I2C总线的读写 EEPROMAT2402存储器的读写编程
💻 C
字号:
#include"reg51.h"
sbit IIC_SDA=P3^7;							/*IIC总线SDA引脚定义*/
sbit IIC_SCL=P3^6;							/*IIC总线SCL引脚定义*/
#define uchar unsigned char
#define uint  unsigned int
#define IC24X_ORDER_WRITE 0xa0  					/*AT24C02写指令*/
#define IC24X_ORDER_READ 0xa1   					/*AT24C02读指令*/
#define IIC_TLOW 10             					/*IIC总线等待时间*/

void IicDelay();
void IicStart();
void IicStop();
void IicAck();
void IicNAck();
void IicWrite(uchar ucData);
uchar IicRead();
void AT24C02WriteByte(uint uiAddr,uchar ucData);
uchar AT24C02ReadByte(uint uiAddr);
/*****************************************************************************
名称: AT24C02WriteByte()
说明: AT24C02写操作
参数: uint uiAddr 地址
      uchar ucData 数据
返回: 无
*****************************************************************************/
void AT24C02WriteByte(uint uiAddr,uchar ucData)
{
	IicStart();
	IicWrite(IC24X_ORDER_WRITE);
	IicAck();
	IicWrite(uiAddr);
	IicAck();
	IicWrite(ucData);
	IicAck();
	IicStop();
	IicDelay();	
}

/*****************************************************************************
名称: AT24C02ReadByte()
说明: AT24C02读操作
参数: uint uiAddr 地址   
返回: uchar 数据
*****************************************************************************/
uchar AT24C02ReadByte(uint uiAddr)
{
	uchar ucData;

 	IicStart();
	IicWrite(IC24X_ORDER_WRITE);
	IicAck();
	IicWrite(uiAddr);
	IicAck();
	IicStart();
	IicWrite(IC24X_ORDER_READ);
	IicAck();
	ucData=IicRead();
	IicNAck();
	IicStop();
	return ucData;
}

/****************************************************************************
说明: IIC总线处理函数
*****************************************************************************/
void IicDelay(void)		/*内部涵数*/
{
	uchar a;
	for(a=0;a<IIC_TLOW;a++);
}

void IicStart(void)		/*内部涵数*/
{
	IIC_SDA=1;
	IicDelay();	
	IIC_SCL=1;
	IicDelay();	
	IIC_SDA=0;
	IicDelay();
	IIC_SCL=0;
}

void IicStop(void)		/*内部涵数*/
{
	IIC_SCL=0;
	IIC_SDA=0;
	IIC_SCL=1;
	IIC_SDA=1;
}

void IicAck(void)		/*内部涵数*/
{
	IIC_SDA=0;
	IIC_SCL=1;
	IicDelay();	
	IIC_SCL=0;
	IIC_SDA=1;
}
void IicNAck(void)		/*内部涵数*/
{
	IIC_SDA=1;
	IIC_SCL=1;
	IicDelay();
	IIC_SDA=0;
	IIC_SCL=0;
}

void IicWrite(uchar ucData)	/*内部涵数*/
{
	uchar a;

	for(a=0;a<8;a++)
	{
		if(ucData&0x80)
		{
			IIC_SDA=1;
		}
		else
		{
			IIC_SDA=0;
		}
		IIC_SCL=1; 
		IIC_SCL=0;
		ucData=ucData<<1;
	}
}

uchar IicRead(void)		/*内部涵数*/
{
	uchar a,ucData=0;
			 
	for(a=0;a<8;a++)
	{
		IIC_SDA=1;
		IIC_SCL=1; 		
		ucData<<=1;
		if(IIC_SDA==1)
		{
			ucData|=0x01;
		}
		else
		{
			ucData&=0xfe;
		}			 
		IIC_SCL=0; 
	}
	return ucData;
}
/*********************************************************************/
void delay(uchar j)                   	/*延时*/
{
  	uchar  k,l;
  	for(l=0;l<=j;l++)
    	for(k=0;k<=250;k++);
}
/*********************************************************************/
void main(void)
{
	//uchar i;

		IIC_SDA=1;
		IIC_SCL=1; 
																			 /*IIC时钟引脚至0*/
	AT24C02WriteByte(22,0x99);
	delay(80);  
	    	/*将dsp数组的数据写入24c02*/
        while(1)
		   {
			P0=AT24C02ReadByte(22);
			delay(80);	/*读出24c02中的数据并送P0口显示*/
	        }
	
}

⌨️ 快捷键说明

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