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

📄 i2c.c

📁 I2C接口的读写程序
💻 C
字号:
/************************************************************************
24C01的读写子函数
单字节随机地址读写
*************************************************************************/
#include <reg52.h>//加载头文件
#include <intrins.h>
#define uchar unsigned char//变量类型的宏定义
#define uint unsigned int//变量类型的宏定义

sbit SCL=P1^0;
sbit SDA=P1^1;
sbit LED=P1^2;

bdata uchar com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;

/******************************************************************************
函数:Delay()
功能:延时10mS
******************************************************************************/
void Delay()
{
	uchar i,j,k;
	for(i=0;i<=1;i++)
	{
		for(j=0;j<=200;j++)
		{
			for(k=0;k<=200;k++)
				_nop_();
		}
	}
}
/******************************************************************************
函数:I2C_Delay()
功能:模拟I2C总线延时
说明:请根据具体情况调整延时值
******************************************************************************/
void I2C_Delay()
{
	unsigned char t;
	t = 10;
	_nop_();
	while ( --t != 0 );		//延时2*t个机器周期
}
/***************************

***************************************/
void start()//启动读写时序
{
	SDA=1;I2C_Delay();
	SCL=1;I2C_Delay();
	SDA=0;I2C_Delay();
	SCL=0;I2C_Delay();
}
//*****************************************
void stop()//停止操作
{
	SDA=0;I2C_Delay();
	SCL=1;I2C_Delay();
	SDA=1;I2C_Delay();
}
//***********************
void ack()//slave应答
{
	SCL=1;I2C_Delay();
	SCL=0;I2C_Delay();
}
//***********************
/*void ack_master()//master应答
{
	SDA=0;I2C_Delay();
	SCL=1;I2C_Delay();
	SCL=0;_nop_();
	SDA=1;I2C_Delay();
}
*/
//***********************
void shift8(uchar a)//8位移位输出
{
	data uchar i;
	com_data=a;
	for(i=0;i<8;i++)
{
	SDA=mos_bit;
	SCL=1;I2C_Delay();
	SCL=0;I2C_Delay();
	com_data=com_data*2;
}
}
//******************
uchar rd_24c01(uchar a)//读24C01A中a地址单元的数据
{
	data uchar i,command;
	SDA=1;I2C_Delay();
	SCL=0;I2C_Delay();
	start();
	command=0xA0;		 
	shift8(command);   //写从器件地址:EEPROM 10100000b,最后一位0:写控制命令
	ack();
	shift8(a);           //写字节地址
	ack();
	start();
	command=0xA1;	   
	shift8(command);  //重新起始写从器件地址:EEPROM 10100001b,最后一位1:读控制命令
	ack();
	SDA=1;I2C_Delay(); //释放SDA
	for(i=0;i<8;i++)	//8位移位输入
	{
		com_data=com_data*2;
		SCL=1;I2C_Delay();
		low_bit=SDA;
		SCL=0;I2C_Delay();
	}
	stop();
	return(com_data);
}
//*****************
void wr_24c01(uchar a,uchar b)//将RAM中b地址单元的数据写入24C01A中a地址单元中
{
	data uchar command;
	I2C_Delay();
	SDA=1;I2C_Delay();
	SCL=0;I2C_Delay();
	start();
	command=0xA0;
	shift8(command);   //写从器件地址:EEPROM 10100000b,最后一位0:写控制命令
	ack();
	shift8(a);	       //写字节地址
	ack();
	shift8(b);		   //写入数据
	ack();
	stop();
	I2C_Delay();
}
main()
{
 	uchar x,k;
	for(k=0;k<=10;k++)
	{
		LED=0;
		Delay();
		LED=1;
		Delay();	
	}
 	wr_24c01(0x00,0x45);
	Delay();
	x=rd_24c01(0x00);
 	if(x==0x45)
	{
		LED=0;
		Delay();
		Delay();
		Delay();
		Delay();
		Delay();
		LED=1;
		Delay();
		LED=0;
		Delay();
		Delay();
		Delay();
		Delay();
		Delay();
		LED=1;
		Delay();
		LED=0;
		Delay();
		Delay();
		Delay();
		Delay();
		Delay();
	}
	else
	{
		for(k=0;k<=10;k++)
		{
			LED=0;
			Delay();
			Delay();
			Delay();
			Delay();
			Delay();
			LED=1;
			Delay();
			Delay();
			Delay();
			Delay();
			Delay();	
		}
	}		 
}

⌨️ 快捷键说明

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