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

📄 i2c.c

📁 该工程的功能是51单片机模拟i2c器件的工作时序
💻 C
字号:
#include<string.h>
#include<reg51.h>
#define TIME 4
#define TRUE 1
#define FALSE 0
sbit SCL=P1^2;				/*定义时钟信号线*/
sbit SDA=P1^1; 				/*定义数据信号线*/
sbit wp=P1^0;
void WriteOneByte(char addr,char d);
char Read_One_Byte(char addr);      
void delay(unsigned int t);    
void main()
{
    char i;
	wp=0;    
	for(i=0;i<10;i++)
	{
	  WriteOneByte(i,i+1);
	 }
    while(1)
	{wp=1;
	 for(i=0;i<10;i++)
	    {  
	     P2=Read_One_Byte(i);
	     delay(50000);
		 }
	}
}
 
	/*延时函数*/
void delay(unsigned int t)
{
    unsigned int i;
	for (i=0;i<t;i++);
}

	/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
void  Start(void)
	{
	SDA=1;
	SCL=1;
	delay(TIME);
	SDA=0;
	delay(TIME);
	SCL=0;
	delay(TIME);
	}

	/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
void  Stop(void)
{
	SDA=0;
	SCL=1;
	delay(TIME);
	SDA=1;
	delay(TIME);
	SCL=0;
	delay(TIME);
}

	/*发送完一个字节后检验设备的应答信号*/
bit Check_Ack (void)
{
	bit q;
	SDA=1;
	SCL=1;
	delay(TIME/2);
	q=SDA;
	delay(TIME/2);
	SCL=0;
	delay(TIME);
	if  (q==1)
		return(FALSE);
	else
		return(TRUE);
}

	/*发送1,在SCL为高电平时使SDA信号为高*/
void SEND_1 (void)
{
	SDA=1;
	SCL=1;
	delay(TIME);
	SCL=0;
	delay(TIME);
}

	/*发送0,在SCL为高电平时使SDA信号为低*/
void SEND_0(void)
{
	SDA=0;
	SCL=1;
	delay(TIME);
	SCL=0;
	delay(TIME);
}
       
	/*从I2C总线读一个字节*/
char ReadI2CByte(void)  
{
	bit q;
	char b=0,i;
	for (i=0;i<8;i++)
		{
		SDA=1;    			/*释放总线*/
		SCL=1;    			/*接受数据*/
		delay(10);
		q=SDA;
		delay(10);
		SCL=0;
		if  (q==1)
			{
			b=b<<1;
			b=b|0x01;
			}
		else
			b=b<<1;
		}
	return(b);
}

	/*向I2C总线写一个字节*/ 
void WriteI2CByte(char b)
{
	char i;
	for (i=0;i<8;i++)
		if ((b<<i)&0x80)
			SEND_1();
		else
			SEND_0();
}

	/**********以下为读写24c02的函数**********/
void WriteOneByte(char addr,char d)			//单字节写
{
	bit ack=1;
	Start();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			//地址
	ack=Check_Ack();
	WriteI2CByte(d);			//数据
	ack=Check_Ack();
	Stop();
}
char Read_One_Byte(char addr)
{
	bit ack=1;
	char mydata;
	Start();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			/* 地址 */
	ack=Check_Ack();
	Start();
	WriteI2CByte(0xa1);
	ack=Check_Ack();
	mydata=ReadI2CByte();
	ack=Check_Ack();
	return(mydata);
	Stop();
}

⌨️ 快捷键说明

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