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

📄 iic.c

📁 I2C总线的一个实例,有原理图的设计,和程序的设计,可直接用在项目开发中,节约开发时间,提高效率.
💻 C
字号:
#include<reg51.h>
#include"IIC.h"

//短延时函数:ShortDelay()
void nNop(uint i)
{
	for(;i>0;i--) ;
	}
	
//长延时函数:LongDelay()
void LongDelay(uint i)
{
	uint j;
	for(;i>0;i--)
		{ for(j=1000;j>0;j--);}
	}

//IC起始信号:
void StartIIC(void)
{
	PinSDA = 1;
	nNop(20);
	PinSCL = 1;
	nNop(20);
	PinSDA = 0;
	nNop(20);
	PinSCL = 0;
	//nNop(50);
	}

//IIC停止信号:
void StopIIC(void)
{
	PinSDA = 0;
	nNop(20);
	PinSCL = 1;
	nNop(20);
	PinSDA = 1;
	nNop(50);
	}

//读取从机应答信号函数:
bit GetACK(void)
{
	bit ack;
	PinSDA = 1;
	PinSCL = 1;
	nNop(50);
	ack = PinSDA;
	PinSCL = 0;
	nNop(50);
	return(ack);
	}

//向IIC总线发出应答信号函数:
void PutACK(bit ack)
{
	PinSDA = ack;
	PinSCL = 1;
	nNop(50);
	PinSCL = 0;
	nNop(50);
	}

//初始化IIC总线函数:
void InitIIC(void)
{
	PinSCL = 1;
	nNop(10);
	PinSDA = 1;
	nNop(50);
	}

//功能向IIC总线写一字节数据函数:
void IIC_WriteByte(uchar temp)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		PinSDA = (bit)(temp & 0x80);
		temp = temp << 1;
		nNop(20);
		PinSCL = 1;
		nNop(20);
		PinSCL = 0;
		//nNop(50);
		}
	}

//从IIC总线读一字节数据函数:
uchar IIC_ReadByte(void)
{
	uchar i;
	uchar temp;
	PinSDA = 1;
	for(i=0;i<8;i++)
	{
		temp = temp << 1;
		PinSCL = 1;
		while(PinSDA) temp++;
		PinSCL = 0;
		nNop(20);
		}
	return(temp);
	}

//向IIC总线上的从机写多字节数据函数:
bit IIC_Puts(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
{
	uchar i;
	
	//确保从机地址最低位是0
	SlaveAddr &= 0xfe;
	
	//启动I2C总线
	StartIIC();
	
	//发送从机地址
	IIC_WriteByte(SlaveAddr);
	if ( GetACK() )
	{
		StopIIC();
		return 1;
		}
	
	//发送子地址
	IIC_WriteByte(SubAddr);
	if ( GetACK() )
	{
		StopIIC();
		return 1;
		}
	
	//发送数据
	for(i=0;i<size;i++)
	{
		IIC_WriteByte(*dat++);
		if ( GetACK() )
		{
			StopIIC();
			return 1;
			}
		}

	//发送完毕,停止I2C总线,返回
	StopIIC();
	return 0;
	}

//从IIC总线上的从机读多字节数据函数:
bit IIC_Gets(uchar SlaveAddr, uchar SubAddr, uint size, uchar *dat)
{
	//确保从机地址最低位是0
	SlaveAddr &= 0xfe;
	
	//启动I2C总线
	StartIIC();
	
	//发送从机地址
	IIC_WriteByte(SlaveAddr);
	if ( GetACK() )
	{
		StopIIC();
		return 1;
		}
	
	//发送子地址
	IIC_WriteByte(SubAddr);
	if ( GetACK() )
	{
		StopIIC();
		return 1;
		}
	
	//发送重复起始条件
	StartIIC();
	
	//发送从机地址
	SlaveAddr |= 0x01;
	IIC_WriteByte(SlaveAddr);
	if ( GetACK() )
	{
		StopIIC();
		return 1;
		}
	
	//接收数据
	for(;;)
	{
		*dat++ = IIC_ReadByte();
		if ( --size == 0 )
		{
			PutACK(1);
			break;
			}
		PutACK(0);
		}
	
	//接收完毕,停止I2C总线,返回
	StopIIC();
	return 0;
	}	

⌨️ 快捷键说明

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