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

📄 iic.c

📁 51单片机相关驱动程序 51单片机最小系统测试程序
💻 C
字号:
/*
-----------------------------------------------------------------
			I2C总线器件24C16驱动程序
	本程序是我开始这个编程训练计划开始后编程风格最好的
	一个程序.他的许多编程规范我会做为以后编程的习惯.
	同时,本程序中没有带器件名的函数是I2C总线的通用函数
	在其它同总线器件程序中可以随便调用.另外,本程序是建
	立在运用I/O口对I2C总线进行模拟前提下,如果是有I2C控
	制器的单片机,就没有必要采用本程序了.

文件名:
	iic.c						
										2006.4.3
										张培华
-----------------------------------------------------------------
*/


#include <IIC.H>

/*
------------------------------------------------------------------
函数名:IIC_SomeNop(void)
功能:	简单小延时程序
输入:
调用:
		库函数:
			 _nop_();
返回:
说明;
------------------------------------------------------------------
*/
void IIC_SomeNop(void)
{
 _nop_();
 _nop_();
 _nop_();
 _nop_();
}
/*
------------------------------------------------------------------
函数名:IIC_Start(void)
功能:	开始总线,准备数据或命令传送
输入:
调用:
		IIC_SomeNop();	
返回:
说明;
------------------------------------------------------------------
*/

void IIC_Start(void)
{
	SDA=1;
	SCL=1;
	IIC_SomeNop();
	SDA=0;
	IIC_SomeNop();
	SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_Stop(void)
功能:	停止总线
输入:
调用:
		IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/

void IIC_Stop(void)
{
	SCL=0;
	IIC_SomeNop();
	SDA=0;
	IIC_SomeNop();    
	SCL=1;
	IIC_SomeNop();
	SDA=1;
}
/*
------------------------------------------------------------------
函数名:IIC_WaitACK(void)
功能:	等待器件的应答信号
输入:
调用:
		IIC_SomeNop();
返回:
说明;
------------------------------------------------------------------
*/

void IIC_WaitACK(void)   
{	
	uint8 i=10;
	SDA=1;
	IIC_SomeNop();
	SCL=1;
	IIC_SomeNop();
	do{
	IIC_SomeNop();
	if(!i--)break;           //这儿是为了防止进入死循环设置的
		}
	while(SDA);

 
	IIC_SomeNop();
	SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_ACK(void)
功能:  应答
输入:
调用:
返回:
说明;
------------------------------------------------------------------
*/


void IIC_ACK(void)
{
	SDA=0;
	IIC_SomeNop();
	SCL=1;
	IIC_SomeNop();
	SCL=0;
}
/*
------------------------------------------------------------------
函数名:IIC_NO_ACK(void)
功能:	没有应答信号
输入:
调用:
返回:
说明;
------------------------------------------------------------------
*/
void IIC_NO_ACK(void)
{
	SDA=1;
	IIC_SomeNop();
	SCL=1;
	IIC_SomeNop();
	SCL=0;
	
}
/*
------------------------------------------------------------------
函数名:IIC_Sendbyte(uint8 wdata)
功能:	发送一个字节的数据
输入:	
		wdata:
			要发送的数据;
调用:
		IIC_SomeNop();	
返回:
说明;
------------------------------------------------------------------
*/

void IIC_Sendbyte(uint8 wdata)
{
	uint8 i;
	for(i=0;i<8;i++){
			SCL=0;
 			IIC_SomeNop();		
			if(wdata&0x80)SDA=1;         //检查wdata的第7位是否为1
				else SDA=0;
		   
			SCL=1;
			IIC_SomeNop();
			wdata<<=1;                   //总共移位7次,这和IIC_RcvByte(void)中不同,可以好好想想.
			}
	 SCL=0;
}

/*
------------------------------------------------------------------
函数名:IIC_RcvByte(void)
功能:	接收一个字节数据
输入:
调用:	
		IIC_SomeNop();
返回:	
		rdata:
		接受到的数据;
说明;
------------------------------------------------------------------
*/

uint8 IIC_RcvByte(void)
{
	uint8 i;
	uint8 rdata=0;
	SDA=1;
	for(i=0;i<8;i++){
			rdata<<=1;	        //移位8次,与IIC_Sendbyte(uint8 wdata)不同,可以好好想想.
			SCL=0;
			IIC_SomeNop();
			SCL=1;
			IIC_SomeNop();
			if(SDA)rdata++;		//检查SDA是否为1
			SDA=1;
					}
	SCL=0;
	return(rdata);

}

/*
------------------------------------------------------------------
函数名:	IIC_24c16_ReadOneChar(uint8 Addr)
功能:		从24C16中读出一个字符
输入:
			Addr:
				要读出字符的地址;
调用:		
			IIC_Start();
			IIC_SendByte();
			IIC_WaitACK();
			IIC_Stop();
			IIC_SomeNop();
			IIC_NO_ACK();
返回:
			rdata:
			从指定地址读出来的数据;
说明;
------------------------------------------------------------------
*/
uint8  IIC_24c16_ReadOneChar(uint8 Addr)
{	
	uint8 rdata;
	IIC_Start();
	IIC_SendByte(0x0a0);	
	IIC_WaitACK();
	IIC_SendByte(Addr);
	IIC_WaitACK();
	IIC_Start();
	IIC_SendByte(0x0a1);
	IIC_WaitACK();
	rdata=IIC_RcvByte();
	IIC_NO_ACK();
	IIC_Stop();
	IIC_SomeNop();
	IIC_SomeNop();
	IIC_SomeNop();
	IIC_SomeNop();
	IIC_SomeNop();
	IIC_SomeNop();
	return (rdata);
}


/*
------------------------------------------------------------------
函数名:IIC_24c16_WriteOneChar(uint8 Addr,uint8 wdata)
功能:	向24C16中写一个字符
输入:  
		Addr:
			要写字符的地址;
		wdata:
			要写入的字符数据;
		
调用: 
		IIC_Start();
		IIC_SendByte();
		IIC_WaitACK();
		IIC_Stop();
		IIC_SomeNop(); 
返回:  
说明;
------------------------------------------------------------------
*/

uint8  IIC_24c16_WriteOneChar(uint8 Addr,uint8 wdata)
{	
 
	IIC_Start();
	IIC_SendByte(0x0a0);
	IIC_WaitACK();
	IIC_SendByte(Addr);
	IIC_WaitACK();
	IIC_SendByte(wdata);
	IIC_WaitACK();
	IIC_Stop();
	IIC_SomeNop();
	IIC_SomeNop();
	IIC_SomeNop();
 
}

⌨️ 快捷键说明

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