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

📄 i2c.c

📁 51系列单片机的i2c总线通信的C语言程序。
💻 C
字号:
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char 
#define x 1

#if (x > 0)
	#define y 1
#else 
	#define y 4
#endif



sbit scl=P1^0;
sbit sda=P1^1;

unsigned char AD,AD1,AD2,AD3;

void delay1(uchar count)
{
	uchar i,j;
	for(i=count;i>0;i--)
		for(j=110;j>0;j--);
}
void delay()
{
	_nop_();
	_nop_();
}
void init()
{
	sda=1;
	delay();
	scl=1;
	delay();
}
void send_ack(bit i)			//发送应答信号
{
	sda = i;
	delay();
	scl = 1;
	delay();
	scl = 0;
}
void start()
{
	sda=1;
	delay();
	scl=1;
	delay();
	sda=0;
	delay();
	scl=0;		//退出时为SCL为低电平,允许下一步SDA数据(写或读数据)发生变化
}
void stop()
{
	sda=0;
	delay();
	scl=1;		//退出时为高电平,释放SCL总线
	delay();
	sda=1;		//退出时为高电平,释放SDA总线
//	delay();
}
bit write_dat(uchar dat)	//写一个字节
{
	uchar temp,i;
	bit j;
	temp=dat;
	sda=1;					//可以不要
	for(i=8;i>0;i--)
	{
		dat=_crol_(dat,1);
		if(dat&0x01)
			sda=1;
		else 
			sda=0;
		scl=1;
		delay();
		scl=0;		//退出时为SCL为低电平,允许下一步SDA数据(循环内部)发生变化
		delay();
	}
	sda=1;		//等待应答信号
	delay();
	scl=1;
	delay();
	j=sda;
	scl=0;			//退出时为SCL为低电平,允许下一步SDA数据发生变化
	delay();
	return j;

}


uchar read_dat()
{
	uchar temp=0;
	uchar j;

	for(j=0;j<8;j++)
	{	
		scl=1;		//放TEMP之后也可以
		delay();
		temp<<=1;
		if(sda) temp|=0x01;
		scl=0;
		delay();
	}
	return temp;
}


void i2cbyte_write(uchar device ,uchar ctrl,uchar dat)
{
	uchar i;		//循环变量
	bit ack;
	for(i=0;i<10;i++)		//循环次数
	{
		start();
		ack=write_dat(device);
		if(ack)
		{
			stop();
			continue;
		}
		ack=write_dat(ctrl);
		if(ack==1)
		{
			stop();
			continue;
		}
		ack=write_dat(dat);
		if(ack)
		{
			stop();
			continue;
		}		
		stop();			//传送成功,最后发送停止信号
		if (ack==0) break;	//传送成功则退出循环
	}	
	delay1(10);
}

uchar i2cbyte_read(uchar device)
{
	uchar dat;
	uchar i,ack;
	for(i=0;i<10;i++)
	{
		ack=write_dat(device);
		if(ack)
		{
		stop();
		continue;
		}

		dat=read_dat(); 
	    send_ack(1);		
		stop();
	}
	return dat;	
}


void main()
{
	bit test;
	init();
	while(1)
	{
/*		i2cbyte_write(0x90,0x40,AD);
		start();
		write_dat(0x91);
		AD=read_dat();
		P0 = AD;
*/
		start();
		test = write_dat(0x91);
		if(!test)  				//8591应答
		{
			AD=read_dat();

		}
		P0 = AD;
		i2cbyte_write(0x90,0x40,AD);

	}
}

⌨️ 快捷键说明

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