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

📄 i2c_sub.c

📁 C51单片机模拟I2C双机通信协议
💻 C
字号:
#include"stdafx.h"
//#include"i2c_fun.h"
//SDA p1.7  SCL p3.3
#include"rt1602c_lcd.h"
sbit SDA=P1^7;
sbit SCL=P3^3;

#define UP 1
#define DOWN 0
#define ACK 0
#define FREE 1
#define N 2
#define SubAddr 0x5e

void job(void);

sbit P11=P1^1;

bit I2CStart;
//bit I2CStop;
bit WorkFlag;
bit I2CConnected;
//uchar num;
uchar ddata;
uchar SorceData[2]={5,8};

void main(void)
{
	uchar temp,temp1,i,j;
	Delay400Ms();
	//LCMInit();

	EX1=1;EA=1;IT1=1;
while(1){
	
ReSet:
	
		
	SDA=FREE;
	WorkFlag=0;
	I2CStart=I2CConnected=DOWN;
	
	while(I2CStart==DOWN){
	//job();
	if(WorkFlag)
		{
		WorkFlag=0;
		while(SCL==0);
		temp=SDA;
		while(SCL==1);
		temp1=SDA;
		if(temp!=temp1)
			if(temp==1 && temp1==0) I2CStart=UP;
		}
	}
	ddata=j=0; 
	for(i=0;i<8;i++)
		{
		while(WorkFlag==0);
		WorkFlag=0;
		while(SCL==0); 
		temp=SDA;
		ddata=(ddata<<1) | temp;
		}
	
	if((ddata/2)==(SubAddr/2)) I2CConnected=UP;
		else {I2CConnected=DOWN;I2CStart=DOWN;goto ReSet;}

	while(WorkFlag==0);WorkFlag=0;
	SDA=ACK;
	while(WorkFlag==0);
	SDA=FREE;
	//WorkFlag=0;

	if(ddata&0x01)
		{//主read
		while(1){
		
//		Resent:
		for(i=0;i<8;i++)
			{
			while(WorkFlag==0);
			SDA=(SorceData[j]&0x80);
			WorkFlag=0;
			
			SorceData[j]=SorceData[j]<<1; 
			}
		while(WorkFlag==0);
		SDA=FREE;
		WorkFlag=0;
		while(SCL==0);
		temp=SDA;
		if((temp==0)) goto Next;
			else {goto ReSet;}  //若主机产生NOT ACK信号时默认结束
		Next:
		/*while(WorkFlag==0);
		WorkFlag=0;
		while(SCL==0);
		temp=SDA;
		while(SCL==1);
		if(SDA!=temp) {I2CStart=DOWN;I2CConnected=DOWN;goto ReSet;}	*/	
		j++;
		j=j%N;
		}
		
		}
	else
		{//主write
//		 Receive:
		 //P1=0x55;while(1);
		 while(1){
		 temp=0;
		 
		 //while(WorkFlag==0);WorkFlag=0;
		 while(SCL==0);
		 temp=SDA;
		 while(SCL==1);
		 if(temp!=SDA) break; 
		 for(i=1;i<8;i++)
		 	{
			while(WorkFlag==0);WorkFlag=0;
			while(SCL==0);
			temp=(temp<<1) | SDA;

			}
		while(WorkFlag==0);WorkFlag=0;
		SDA=ACK;
		while(WorkFlag==0);WorkFlag=0;
		SDA=FREE;
		SorceData[j]=temp;
		j++;j=j%N;
		//P1=temp;while(1);

		}  		
		P1=SorceData[0];
		//DisplayOneChar(0,0,SorceData[0]|0x30);
		//DisplayOneChar(0,0,SorceData[1]|0x30);
		break;
		}

}
	LCMInit();
	DisplayOneChar(0,0,SorceData[0]|0x30);
}


void negtive(void) interrupt 2
	{
//	 bit i2c_temp;
	 WorkFlag=1;
	 return;
	}




/*
	 while(SCL==0);
	 i2c_temp=SDA;
	 while(SCL==high);
	 if(i2c_temp!=SDA)
	 	if((i2c_temp==high)&&(SDA==low)) {i2cstart=UP;num=1;}
			else i2cstop = DOWN;
	else {ddata=ddata<<1 |i2c_temp;num++;}

	} */

⌨️ 快捷键说明

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