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

📄 iic.c

📁 IIC测试程序
💻 C
字号:
#include <reg52.h>          /*头文件的包含*/
#include <intrins.h>
/*********************************************/
#define  uchar unsigned char /*宏定义*/
#define  uint  unsigned int
/*********************************************/
/* 常,变量定义区 */
 /*端口位定义*/
sbit SDA=P1^7;            /*模拟I2C数据传送位*/
sbit SCL=P1^6;            /*模拟I2C时钟控制位*/
/*状态标志*/
bit ACK;	         /*应答标志位*/
/*********************************************/
void	start_IIC(void);	/*启动总线*/
void	stop_IIC(void);		/*关闭总线*/
void	cack(void);			/*检查应答位子程序*/
void	mack(void);			/*发送应答信号子程序*/
void	mnack(void);		/*发送非应答信号*/
void	wrbyte(uint);		/*发送字节子程序*/
void	rdbyte(uint);		/*读取字节子程序*//***************关闭总线*********************/
void	stop_IIC()
{
	zdata=0;	/*p1.5=0,接ZLG7290的20脚SDA*/
	_nop_();
	clk=1;		/*发送结束条件的时钟信号*p1.4=1,接ZLG7290的19脚SCL*/
	_nop_();	/*结束总线时间大于4us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
/////////////////////////
	zdata=1;	/*结束总线*p1.5=1,接ZLG7290的20脚SDA*/
	_nop_();	/*保证一个终止信号和起始信号的空闲时间大于4.7us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}
/***************启动总线********************/
void	start_IIC()
{
	zdata=1;	/*p1.5=1,接ZLG7290的20脚SDA*/
	_nop_();
	clk=1;		/*p1.4=1,接ZLG7290的19脚SCL*/
	_nop_();	/*起始条件建立时间大于4.7us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
//////////////////////////////
	zdata=0;	/*p1.5=0,接ZLG7290的20脚SDA*/
	_nop_();	/*起始条件锁定时大于4us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	clk=0;		/*钳住总线,准备发数据,p1.4=0,接ZLG7290的19脚SCL*/
	_nop_();	
}
/***************读取字节子程序*****************/
void	rdbyte(x)
{
	
}
/****************发送字节子程序**********************/
void	wrbyte(data1)
{
	uint	i;
	ACC=data1;
	for(i=8;i>0;i--)
	{
		ACC<<=1;
		switch(CY)
		{
			case	0:zdata=0;_nop_();clk=1;_nop_();_nop_();_nop_();_nop_();_nop_();clk=0;break;	/*发送0*/
			case	1:zdata=1;_nop_();clk=1;_nop_();_nop_();_nop_();_nop_();_nop_();clk=0;break;	/*发送1*/
			default	:break;
		}
	}
}
/***************发送非应答信号*******************/
void	mnack()
{
	zdata=1;	/*p1.5=1,接ZLG7290的20脚SDA*/
	_nop_();
	_nop_();
	clk=1;		/*p1.4=1,接ZLG7290的19脚SCL*/
	_nop_();	/*保持数据时间,即clk为高时间大于4.7us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
/////////////////////////////
	clk=0;
	_nop_();
	_nop_();	
}
/**************发送应答信号子程序**************/
void	mack()
{
	zdata=0;	/*p1.5=0,接ZLG7290的20脚SDA*/
	_nop_();
	_nop_();
	clk=1;		/*p1.4=1,接ZLG7290的19脚SCL*/
	_nop_();	/*保持数据时间,即clk为高时间大于4.7us*/
	_nop_();
	_nop_();
	_nop_();
	_nop_();
/////////////////////////////
	clk=0;
	_nop_();
	_nop_();
}
/*************检查应答位子程序******************/
void	cack()	/*ACK=1时表示有应答*/
{
	zdata=1;	/*p1.5=1,接ZLG7290的20脚SDA*/
	_nop_();
	_nop_();
	clk=1;		/*p1.4=1,接ZLG7290的19脚SCL*/
	ACK=0;
	_nop_();
	_nop_();
	if(zdata==0)
	{
		ACK=1;	/*判断应答位*/
	}
	_nop_();
	clk=0;
	_nop_();
}

/*************向器件指定子地址写N字节数据*****************/
void	iwrnbyte()
{
	f_4=1;
	f_5=1;
	while(f_4==1||f_5==1)
	{
		f_4=0;
		f_5=0;
		start_IIC();	/*启动总线*/
		wrbyte(SLA);	/*发送器件从地址*/
		cack();			/*检查应答位子程序*/
		if(ACK==1)
		{
			wrbyte(SUBA);
			cack();
			while((NUMBYTE-->0)&&(f_5==0))
			{
				wrbyte(data_1[NUMBYTE]);
				cack();/*检查应答位子程序*/
				if(ACK==0)
				{
					f_5=1;
				}
				else
				{
					i++;	
				}	
			}
		}
		else
		{
			stop_IIC();	/*关闭总线*/
		}
	}
}

⌨️ 快捷键说明

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