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

📄 i2c.h

📁 AT89S52模拟IIC总线对一些IIC设备AT24C01进行读写。
💻 H
字号:
/*--------------------------------------------------------------------------
I2C.H
自编I2C函数 可修改控制口
--------------------------------------------------------------------------*/

#ifndef __I2C_H__
#define __I2C_H__

sbit	SDA=P2^1;				//定义控制口
sbit	SCL=P2^2;

void	start(void);				//声明启动I2C函数
void	stop(void);					//声明停止I2C函数
void	ack(void);					//声明应答函数
void	noack(void);				//声明非应答函数
void	sendbyte(uchar);			//声明发送一个字节函数
uchar	readbyte(void);				//声明接受一个字节函数
void	writetorom(uchar dt[],uchar,uchar);	//声明写数据函数
void	readfromrom(uchar dt[],uchar,uchar);//声明读数据函数




void	start(void)
{
	SDA=1;
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SCL=0;
}

void	stop(void)
{
	SDA=0;
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SDA=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SCL=0;
}

void	ack(void)
{	
	SDA=0;
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SCL=0;
	SDA=1;
}

void	noack(void)
{
	SDA=1;
	SCL=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	SCL=0;
	SDA=0;
}

void	sendbyte(uchar idata d)
{
	uchar	idata	n=8;
	uchar	idata	temp;
	temp=d;
	while(n--)
	{
		if((temp&0x80)==0x80)
		{
			SDA=1;
			SCL=1;
			_nop_();_nop_();_nop_();_nop_();_nop_();
			SCL=0;
			SDA=0;
		 }
		 else
		 {
		 	SDA=0;
			SCL=1;
			_nop_();_nop_();_nop_();_nop_();_nop_();
			SCL=0;
 	     }
		 temp=temp<<1;
	}
}

uchar	readbyte(void)
{
	uchar	idata	temp=0;
	uchar	idata	n=8;
	SDA=1;
	do{
	
		SCL=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		SCL=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		if(SDA)
		temp=temp|0x01;
		else
		temp=temp&0xfe;
		if(n-1)
		{
			temp=temp<<1;
		}
		n--;
	}
	while(n);
	return(temp);
}

void	writetorom(uchar dt[],uchar address,uchar n)
{
	uchar	idata	i;
	uchar	idata	*pdt;
	pdt=dt;
	for(i=0;i<n;i++)
	{
		start();
		sendbyte(0xa0);
		ack();
		sendbyte(address+i);
		ack();
		sendbyte(*(pdt+i));
		ack();
		stop();
		delay(5);
	}
}

void	readfromrom(uchar dt[],uchar address,uchar n)
{
	uchar	idata	i;
	uchar	idata	*pdt;
	pdt=dt;
	for(i=0;i<n;i++)
	{
		start();
		sendbyte(0xa0);
		ack();
		sendbyte(address+i);
		ack();
		start();
		sendbyte(0xa1);
		ack();
		*(pdt+i)=readbyte();
		SCL=0;
		noack();
		stop();
	}
}

#endif

⌨️ 快捷键说明

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