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

📄 i2c.h

📁 此程序为51,可以接收红外遥控,读温度18b20.非常好懂.欢迎下载
💻 H
字号:
#ifndef _I2C_H_
#define _I2C_H_

#define I2C_ACK				0
#define I2C_NOACK			1

#define I2C_RD_ERROR			0x20
#define I2C_RD_BUSY			0x30
#define I2C_WR_ERROR			0x10
#define EVENT_COM			0xe0

#define IC24C02_DEVICE_NUM		0xA0
sbit	P_SDA =  P2^3;
sbit	P_SCL =  P2^2;


typedef unsigned char BYTE;



//声明函数
void I2cDelay(void);
void I2cStart(void);
void I2cStop(void);
unsigned char I2cGetAck(void);
void I2cWaitAck(void);
void I2cSetAck(unsigned char Hi);
void I2cWriteByte(BYTE nData);
BYTE I2cReadByte(void);
unsigned char I2cWrite(BYTE nDev,BYTE nAddr,BYTE nData);
unsigned char I2cRead(BYTE nDev,BYTE nAddr,BYTE *val);
//===================================================
//	I2C延时
//===================================================
void I2cDelay(void)
{
	BYTE i;
	for(i = 0; i < 50; i++);	
}

//===================================================
//	I2c开始
//===================================================
void I2cStart(void)
{
	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 0;
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2c停止
//===================================================
void I2cStop(void)
{
 	P_SDA = 0;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	P_SDA = 1;
	I2cDelay();
}

//===================================================
//	I2c读应答
//===================================================
unsigned char I2cGetAck(void)
{
	unsigned char iAck = 0;

	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	iAck = ((P_SDA)?0:1);
	I2cDelay();

	P_SCL = 0;
	I2cDelay();

	return iAck;
}

//===================================================
//	I2c读应答
//===================================================
void I2cWaitAck(void)
{
	P_SDA = 1;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();

	while(P_SDA)
	{

		I2cDelay();
	}

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2c 主应答
//===================================================
void I2cSetAck(unsigned char Hi)
{
	P_SDA = Hi;
	I2cDelay();

	P_SCL = 1;
	I2cDelay();
	I2cDelay();

	P_SCL = 0;
	I2cDelay();
}

//===================================================
//	I2C 写入一个字节
//===================================================
void I2cWriteByte(BYTE nData)
{
	BYTE i;
	for(i = 0;i < 8;i ++)
	{

		if(nData & 0x80)
		{
			P_SDA = 1;
		}
		else
		{
			P_SDA = 0;
		}
		I2cDelay();

		nData <<= 1;

		P_SCL = 1;
		I2cDelay();
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}
	I2cDelay();
}

//===================================================
//	I2c读取一个字节
//===================================================
BYTE I2cReadByte(void)
{
	BYTE nData = 0;
	BYTE i = 0;

	for(i = 0;i < 8;i ++)
	{

		nData <<= 1;
		I2cDelay();	
		
		P_SCL = 1;
		I2cDelay();
	
		if(P_SDA)
		{
			nData |= 1;	
		}
		else
		{
			nData &= 0xfe;
		}
		I2cDelay();

		P_SCL = 0;
		I2cDelay();
	}
	I2cDelay();

	return nData;
}



//===================================================
//	写I2C设备
//===================================================
unsigned char I2cWrite(BYTE nDev,BYTE nAddr,BYTE nData)
{
	unsigned char iAck = 0;

	I2cStart();

	I2cWriteByte(nDev);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;
	
	I2cWriteByte(nAddr);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;

	I2cWriteByte(nData);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;

	I2cStop();

	return 1;
}

//===================================================
//	读I2C设备
//===================================================
unsigned char I2cRead(BYTE nDev,BYTE nAddr ,BYTE *val)
{
	
	unsigned char iAck = 0;
	*val = 0;
	I2cStart();

	I2cWriteByte(nDev);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;

	I2cWriteByte(nAddr);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;

	I2cStart();
	I2cWriteByte(nDev | 0x01);
	iAck = I2cGetAck();
	if(!iAck)
		return 0;
 	
	*val = I2cReadByte();
	I2cSetAck(0); 
	I2cStop();

	return 1;
}



#endif

/*EOF*/

⌨️ 快捷键说明

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