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

📄 9702-iic.c

📁 此为51单片机的iic程序,可按需要修改
💻 C
字号:
/***************************************
*项目:××××
*模块:I2C.c //I2C 程序模块
*说明:I2C 程序,SCL,及SDA 在主程序中定义为MCUIO
该模块共有:
1,I2CDelay();//延时程序,给I2C 总线提供必要的延时
2,I2CStart();//开始程序
3,I2CStop();//结束程序
4,I2CSendByte();//送一个字节
5,I2CReceiveByte();//接收一个字节
6,I2CReceiveACK();//接受应答信号
7,I2CAcknowledge();//发送应答信号
8,I2CSendWord();//送字
9,I2CReceiveWord();//接受字
10,I2CPageWrite();//发送页
11,I2CReceiveWords();//接收多字
***************************************/
#include"89c51.h"
#define SDA P3.1
#define SCL P3.0
#define SDA_1 SDA = 1
#define SDA_0 SDA = 0
#define SCL_1 SCL = 1
#define SCL_0 SCL = 0
#define SDA_IN SDA
#define DIR_IN SDA = 1
#define TIME 5 //I2C 时序延时时间
unsigned int uiSendDataBuffer[8];
unsigned int uiReceiveDataBuffer[8];
/****************************************
*FUNCTION NAME: I2CDelay();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线必要的延时程序
*MODIFY DATE:
*INPUT:n->延时时间数相当于指令周期数
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CDelay(unsigned int n)
{
	unsigned int i;
	for(i = 0;i < n;i++)
	{
		;
	}
}
/****************************************
*FUNCTION NAME: I2CStart();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线启动时序
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CStart(void)
{
	SDA_1;
	I2CDelay(TIME);
	SCL_1;
	I2CDelay(TIME);
	SDA_0;
	I2CDelay(TIME);
	SCL_0;
}
/****************************************
*FUNCTION NAME: I2CStop();
*CREATE DATE:2006.09.07
*CREATED BY:DreamHW
*FUNCTION:I2C 总线停止时序
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CStop(void)
{
	SDA_0;
	I2CDelay(TIME);
	SCL_1;
	I2CDelay(TIME);
	SDA_1;
}
/****************************************
*FUNCTION NAME: I2CSendByte();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:I2C 送一个字节的数据
*MODIFY DATE:
*INPUT:ucWRData
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CSendByte(unsigned char ucWRData)
{
	unsigned int i;
	for(i = 0;i < 8;i++)
	{
		SCL_0;
		I2CDelay(TIME);
		if ((ucWRData >> 7) & 0x01) SDA_1;//最高位是否为1,为则SDA= 1
		else SDA_0; //否则SDA=0
		I2CDelay(TIME);
		SCL_1;
		I2CDelay(TIME);
		ucWRData <<= 1; //数据左移一位,进入下一轮送数
	}
	SCL_0; //
	SDA_1; //等待ack
	I2CDelay(TIME);
}
/****************************************
*FUNCTION NAME: I2CReceiveACK();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:等待接受ACK 信号,完成一次操作
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CReceiveACK(void)
{
	SCL_1;
	I2CDelay(TIME);//
	DIR_IN;
	while(SDA_IN);
	SCL_0;
	I2CDelay(TIME);
}
/****************************************
*FUNCTION NAME: I2CReceiveByte();
*CREATE DATE:2006.09.08
*CREATED BY:DreamHW
*FUNCTION:接受一个字节的数据
*MODIFY DATE:
*INPUT:nop
*OUTPUT:ucRDData
*RETURN:ucRDData
****************************************/
unsigned char I2CReceiveByte(void)
{
	unsigned char i;
	unsigned char ucRDData = 0;//返回值
	unsigned char ucDataBit = 0;//每一个clk 接受到的数据

	SCL_0;
	I2CDelay(TIME);
	SDA_1;
	DIR_IN;
	for(i = 0;i < 8;i++)
	{
		SCL_1;
		I2CDelay(TIME);
		ucDataBit = SDA_IN;
		I2CDelay(TIME);
		ucRDData = ((ucRDData << 1) | ucDataBit);//将数据依次存入ucRDData
		SCL_0;
		I2CDelay(TIME);
	}
	return(ucRDData);
}
/****************************************
*FUNCTION NAME: I2CAcknowledge();
*CREATE DATE: 2006.09.08
*CREATED BY:DreamHW
*FUNCTION:接受数据后发送一个ACK 信号
*MODIFY DATE:
*INPUT:nop
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CAcknowledge(void)
{
	SCL_0;
	SDA_0;
	I2CDelay(TIME);
	SCL_1;
	I2CDelay(TIME);
	SCL_0;
}
/****************************************
*FUNCTION NAME: I2CSendWord();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:送一个双字节程序
*MODIFY DATE:
*INPUT:ucWRAddress`usWRData
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CSendWord(unsigned char ucWRAddress,unsigned int uiWRData)
{
	unsigned char ucLowData;
	unsigned char ucHighData;

	ucLowData = uiWRData & 0x00ff;
	uiWRData >>= 8;
	ucHighData = uiWRData;
	I2CStart();
	I2CSendByte(0xa0);
	I2CReceiveACK();
	I2CSendByte(ucWRAddress);
	I2CReceiveACK();
	//送数据
	I2CSendByte(ucLowData);
	I2CReceiveACK();
	I2CSendByte(ucHighData);
	I2CReceiveACK();
	I2CStop();
}

extern int WriteTopulsusI2cMode(BYTE uCAddress,BYTE subAddress,BYTE tmp1[2],unsigned int WordCnt)
{
	unsigned char ucLowData;
	unsigned char ucHighData;

	ucLowData = tmp1[0];
	ucHighData = tmp1[1];
	I2CStart();
	I2CSendByte(uCAddress);
	I2CReceiveACK();
	I2CSendByte(subAddress);
	I2CReceiveACK();
	//送数据
	I2CSendByte(ucLowData);
	I2CReceiveACK();
	I2CSendByte(ucHighData);
	I2CReceiveACK();
	I2CStop();
}

/****************************************
*FUNCTION NAME: I2CReceiveWord();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:接受双字节程序
*MODIFY DATE:
*INPUT:ucRDAddress
*OUTPUT:uiDataReg
*RETURN:uiDataReg
****************************************/
unsigned int I2CReceiveWord(unsigned char ucRDAddress)
{
	unsigned char ucLowData;//接收到的低位数据
	unsigned char ucHighData;//接收到的高位数据
	unsigned int uiDataReg;//ReceiveWord

	//启动送地址
	I2CStart();
	I2CSendByte(0xa0); //DEVICE DATA :1010_000_0_WRITE
	I2CReceiveACK();
	I2CSendByte(ucRDAddress);
	I2CReceiveACK();
	//启动改为读操作
	I2CStart();
	I2CSendByte(0xa1);//DEVICE DATA:1010_000_0_READ
	I2CReceiveACK();
	//开始读取数据,先低后高,存入int 型
	ucLowData = I2CReceiveByte();
	I2CAcknowledge();
	ucHighData = I2CReceiveByte();
	//结束时没有ACK
	I2CStop();
	uiDataReg = ucHighData;
	uiDataReg <<= 8;
	uiDataReg += ucLowData;
	I2CDelay(1000);
	return (uiDataReg);
}
/****************************************
*FUNCTION NAME: I2CReceiveWords()
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:送多个字程序
*MODIFY DATE:
*INPUT:ucRDAddress
*OUTPUT:uiReceiveDataBuffer[]
*RETURN:nop
****************************************/
void I2CReceiveWords(unsigned char ucRDAddress)
{
	unsigned char ucLowData;
	unsigned char ucHighData;
	unsigned int i;

	//启动方式输入,输入地址
	I2CStart();
	I2CSendByte(0xa0);
	I2CReceiveACK();
	I2CSendByte(ucRDAddress);
	I2CReceiveACK();
	//启动改为读操作
	I2CStart();
	I2CSendByte(0xa1);//DEVICE DATA:1010_000_0_READ
	I2CReceiveACK();
	//读取数据将数据放入uiReceiveDataBuffer[]
	for(i = 0;i < 7;i++)
	{
		ucLowData = I2CReceiveByte();
		I2CAcknowledge();
		ucHighData = I2CReceiveByte();
		I2CAcknowledge();
		uiReceiveDataBuffer[i] = (ucHighData << 8) + ucLowData;
	}
	ucLowData = I2CReceiveByte();
	I2CAcknowledge();
	ucHighData = I2CReceiveByte();
	//结束时没有ACK
	I2CStop();
	uiReceiveDataBuffer[7] = (ucHighData << 8) + ucLowData;
	I2CDelay(1000);
}
/****************************************
*FUNCTION NAME: I2CPageWrite();
*CREATE DATE:2006.09.12
*CREATED BY:DreamHW
*FUNCTION:页写程序
*MODIFY DATE:
*INPUT:ucRDAddress;uiSendData[]
*OUTPUT:nop
*RETURN:nop
****************************************/
void I2CPageWrite(unsigned char ucRDAddress,unsigned int uiSendData[])
{
	unsigned int *p;
	unsigned char ucHighData;
	unsigned char ucLowData;
	unsigned char i;

	p = uiSendData;//送数组首地址到指针
	//I2C 开始通信,写起始地址
	I2CStart();
	I2CSendByte(0xa0);
	I2CReceiveACK();
	I2CSendByte(ucRDAddress);
	I2CReceiveACK();
	//数据传输
	for(i = 0;i < 8;i++)
	{
		ucLowData = *p;
		ucHighData = (*p >> 8);
		p++;
		I2CSendByte(ucLowData);
		I2CReceiveACK();
		I2CSendByte(ucHighData);
		I2CReceiveACK();
	}
	I2CStop();
	I2CDelay(1000);
}

⌨️ 快捷键说明

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