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

📄 iic.c

📁 基于51系列单片机的介绍IIC的原理与应用的软件设计
💻 C
字号:
#include <reg52.H>
#include <intrins.h>

sbit SCL	=	P1^6;		/*IIC时钟线*/
sbit SDA	=	P1^7;		/*IIC数据线*/

static	unsigned char Mode;
/*----------------------------全局符号定义----------------------------*/
#define	SomeNop(); _nop_(); _nop_();  _nop_();  _nop_();  _nop_(); 

/******************************************************************
	I2CStart:发动IIC总线起始信号
******************************************************************/
void	I2CStart	(void)
	{
		SomeNop();

		SCL	=	1;
		SomeNop();

		SDA	=	0;
		SomeNop();
		SCL	=	0;
		SomeNop();
	}
/*****************************************************************
	I2CStop:发出IIC总线结束信号
*****************************************************************/
void	I2CStop(void)
	{
		SDA	=	0;
		SomeNop();
		SCL	=	1;
		SomeNop();

		SDA	=	1;
		SomeNop();
		SCL	=	0;
	}
/***************************************************************
	I2CInit:I2C总线初始化程序
***************************************************************/
void	I2CInit	(void)
	{
		SCL=0;
		SomeNop();
		I2CStop();
	}
/**************************************************************
	I2Cclock:	发送总线时钟信号,并返回时钟电平为高期间SDA上的状态,
				可用于发送,也可用于接收。
***************************************************************/							
bit	I2CClock (void)
	{
    	bit	sample;
		SomeNop();
		SCL	=	1;
		_nop_();	_nop_();	_nop_();
		sample	=	SDA;
		_nop_();	_nop_();	
		SCL	=	0;
		SomeNop();
		return(sample);
	}
/************************************************************
	I2CSendByte:	向I2C总线发送一个字节,并请求应答,若收到应答
					则返回1,否则返回0
**************************************************************/
bit	I2CSendByte	(char	I2CData)	
	{
		register	unsigned	char	i;
		for	(i=0; i<8; i++){
			SDA	=	(bit)	(I2CData&0x80);
			I2CData	<<=	1;
			I2CClock();
		}
		SDA	=	1;
		return(~I2CClock());
	}
/************************************************************
	I2CReceiveByte:	从总线接收1 个字节,并返回该字节,不回送
					该字节,不回送应答信号,主函数调用本函数
					应保证SDA为1
************************************************************/
char	I2CReceiveByte (void)
	{
		unsigned	char	I2CData	=	0;
		register	unsigned	char	i;
		for	(i=0; i<8; i++)
			{
				I2CData	<<=	1;
				if	(I2CClock())
					I2CData++;
			}
			return(I2CData);
	}
/************************************************************
	I2CSendAck:	向I2C总线发送应答信号ACK
************************************************************/
void	I2CSendAck(void)
		{
			SDA=0;
			I2CClock();
			SDA	=	1;
		}
/***********************************************************
	I2CSendNotAck:	发送非应答信号到I2C总线
**********************************************************/
void	I2CSendNotAck	(void)
	{
		SDA	=	1;
		I2CClock();
	}
/*********************************************************
	WRBYTES:	读写RAM单元
			参数:
					Ramaddr: 指定的RAM单元地址
					buf:  	 读写数据缓存区首地址
					num:  	 从addr开始读写的数据字节个数
					wr:   	 读写标志,1为主机读,0为主机写
**********************************************************/
void	WRBYTES(unsigned masteraddr,unsigned char Ramaddr,unsigned char buf[],unsigned char num,bit wr)
	{
		unsigned char index;
		EA = 0;
		I2CInit();
		I2CStart();
		I2CSendByte(masteraddr);
		I2CSendByte(Ramaddr);
		if (wr==0)
			{
				for(index=0; index<num; index++)
					{	I2CSendByte(buf[index]);
						}
					}
			else if (wr==1)
				{
				I2CStart();
				I2CSendByte(masteraddr|0x01);
					for (index=0; index<num-1; index++)
						{ 	SDA	=	1;
							buf[index] = I2CReceiveByte();
							I2CSendAck	();
						}
				buf[index] = I2CReceiveByte();
				I2CSendNotAck();
				}
			I2CStop();
		EA = 1;
}


⌨️ 快捷键说明

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