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

📄 1233.c

📁 IIC总线的应用!本程序在测试实验中应用过!有别于网上常见的IIC协议程序!
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <intrins.h>
#define BYTE unsigned char
#define WORD unsigned int
#define uchar unsigned char
#define uint unsigned int

typedef unsigned char INT8U;
typedef unsigned int  INT16U;


sfr P1_ADC_EN	=0x97;
sfr ADC_CONSTR	=0xC5;
sfr ADC_DATA	=0xC6;

BYTE R_ARRAY[15];

BYTE RS232;

BYTE blnRev;

BYTE RL_DO[8];

BYTE K_DO;

BYTE PT_DO[8];

unsigned char chrI2c;			// 1:BUS_1 2:BUS_2 3:BUS_3 4:BUS_4
unsigned char tmpI2c;

bit ack;
bit blnT;
bit bitS;

//==================================================================================================
//NO.1 I2C BUS 
sbit scl_1=P3^5;       
sbit sda_1=P3^4;
//==================================================================================================
//NO.2 I2C BUS 
sbit scl_2=P3^7;      
sbit sda_2=P3^6;
//==================================================================================================
//NO.3 I2C BUS 
sbit scl_3=P3^7;      
sbit sda_3=P3^6;
//==================================================================================================

//==================================================================================================
//NO.4 I2C BUS 
sbit scl_4=P3^7;      
sbit sda_4=P3^6;
//==================================================================================================

//==================================================================================================
//Sleep time Program STRAT
void nc(int n);
void delay(WORD n);
//Sleep time Program STOP
//==================================================================================================

//==================================================================================================
//MUC INI INIT START
void int_init(void);
void config_init(void);
void port_init(void);
//MUC INI INIT START
//==================================================================================================

//==================================================================================================
void incept_int(void);
void Send_String(BYTE Str_Array[],BYTE Int_Len);//MCU RS23 SEND N BYTES
void Send(BYTE chrI);//MCU RS23 SEND BYTE
//==================================================================================================
bit even(BYTE my_byte);
//==================================================================================================
void RS232_INI();
//==================================================================================================
bit Execute_Command_0x01(BYTE intOut);
bit Execute_Command_0x02(BYTE intInput);
//==================================================================================================

//==================================================================================================
//I2C FUNCTION START
void i2c_start(void);		//I2C BUS WORK START
void i2c_stop(void); 		//I2C BUS WORK STOP
void i2c_ack(bit a1);		//I2C BUS RESPONSE
void SendByte(uchar c);		//I2C BUS SEND BYTE SUB FUNCTION
uchar RcvByte();			//I2C BUS RECEIVE BYTE SUB FUNCTION
void i2c_updata(uchar bln_scl_sda,uchar chr_data);		//I2C BUS UPDATA
bit ISendByte(uchar sla,uchar c);						//I2C BUS SEND BYTE
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);	//I2C BUS SEND STRING
bit IRcvByte(uchar sla,uchar *c);						//I2C BUS RECEIVE BYTE
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);	//I2C BUS RECEIVE STRING
bit Nsend(uchar sla,uchar suba,uchar *s,uchar no);		//I2C BUS SEND N BYTES
bit NRead(uchar sla,uchar suba,uchar *s,uchar no);		//I2C BUS READ N BYTES
bit PCF8574_Write(BYTE bWrite_Data,BYTE bWrite_Address);
uchar PCF8574_Read(BYTE bWrite_Address);
//I2C FUNCTION STOP
//==================================================================================================

void delay(WORD n)
{
	unsigned int k,j;
	for(k=0;k<n;k++)
		for(j=0;j<209;j++);
}

void nc(int n)
{
	unsigned int i;
	for(i=0;i<n;i++)
		_nop_();
}

bit even(BYTE my_byte)
{
	int i;

	BYTE bT;

	BYTE bT1;

	bT1=my_byte;

	bT=0;

	for(i=0;i<8;i++)
	{
		if((bT1&0x80)==0x80)
			bT++;
		bT1<<=1;
	}

	bT1=bT % 2;

	return(bT1);

}

//***************************MCU RS23 SEND BYTE***************************
void Send(BYTE chrI)//MCU RS23 SEND BYTE
{
	bit tag;

		TI=0;
		tag=even(chrI);
		TB8=tag;

		nc(10);
		SBUF=chrI;
		while(TI==0);
		TI=0;
		nc(10);
}
//***************************MCU RS23 SEND BYTE***************************

//***************************MCU RS23 SEND N BYTES***************************
void Send_String(BYTE Str_Array[],BYTE Int_Len)//MCU RS23 SEND N BYTES
{
	BYTE i;
	for(i=0;i<Int_Len;i++)
	{
		Send(Str_Array[i]);
		nc(10);
	}
}
//***************************MCU RS23 SEND N BYTES***************************

//==================================================================================================
//MCU INI INIT START

//***************************MCU INT INIT***************************
void int_init(void)//MCU INT INIT
{
   	//IT0=1;
	//ET0=1;
	//EX0=1;
	ES=1;
	EA=1;
}
//***************************MCU INT INIT***************************

//***************************MCU RS232 INIT***************************
void config_init(void)//MCU RS232 INIT
{
	TMOD=0x20;
	TL1=250;
	TH1=250;
	SCON=0xD8;
	PCON=0x80;
	TR1=1;
}
//***************************MCU RS232 INIT***************************

//***************************MCU PROT INIT***************************
void port_init(void)//MCU PROT INIT
{
	BYTE i;	

	P0=0xFF;
	P1=0xFF;
	P2=0xFF;
	P3=0xFF;

	RS232=0;

	for(i=0;i<15;i++)
		R_ARRAY[i]=1;

	chrI2c=1;

	RL_DO[0]=0xFF;
	PCF8574_Write(RL_DO[0],0);

	RL_DO[1]=0xFF;
	PCF8574_Write(RL_DO[1],1);

	RL_DO[2]=0xFF;
	PCF8574_Write(RL_DO[2],2);


}
//***************************MCU PROT INIT***************************
//MCU INI INIT STOP
unsigned char AD_Read(unsigned char iCH)
{
	INT8U	AD_finished;

	delay(100);

	ADC_DATA=0;
	ADC_CONSTR=iCH;
	delay(3);

	ADC_CONSTR |=0x08;

	AD_finished=0;

	while(AD_finished==0)
	{
		delay(2);
		AD_finished=(ADC_CONSTR & 0x10);
	}

	ADC_CONSTR &=0xF7;

	AD_finished=ADC_DATA;

	return(AD_finished);
}
//================================================================================================== 
//***************************MCU RS23 RECEIVE BYTES***************************
void incept_int(void) interrupt 4 using 0
{

 	BYTE R_Count;

	if(TI==1) 
		return;

	if(RI==1)
	{

		while(RI==0);
		RI=0;
		R_Count=SBUF;

		if(RS232>=15)
			return;

		R_ARRAY[RS232]=R_Count;
		RS232++;

		if(R_Count==0x0D)
			blnRev=1;

	}
	return;
}
//***************************MCU RS23 RECEIVE BYTES***************************
//==================================================================================================
//I2C FUNCTION START

//***************************I2C BUS UPDATA***************************
void i2c_updata(uchar bln_scl_sda,uchar chr_data)//I2C BUS UPDATA
{
	if(bln_scl_sda==0)//updata scl
	{
		switch(chrI2c)
		{
			case 1:
				scl_1=chr_data;
				break;
			case 2:
				scl_2=chr_data;
				break;
			case 3:
				scl_3=chr_data;
				break;
			case 4:
				scl_4=chr_data;
				break;
			default:
				break;
		}
	}
	else if(bln_scl_sda==1)
	{
		switch(chrI2c)
		{
			case 1:
				sda_1=chr_data;
				break;
			case 2:
				sda_2=chr_data;
				break;
			case 3:
				sda_3=chr_data;
				break;
			case 4:
				sda_4=chr_data;
				break;
			default:
				break;
		}
	}
	return;
}
//***************************I2C BUS UPDATA***************************

//***************************I2C BUS WORK START***************************
void i2c_start(void)//I2C BUS WORK START
{
		nc(4);
		i2c_updata(0,0);

		nc(4);
		i2c_updata(1,1);

		nc(4);
		i2c_updata(0,1);
  
		nc(12);
		i2c_updata(1,0);
    
		nc(12);
		i2c_updata(0,0);
		
		nc(4);
}
//***************************I2C BUS WORK START***************************

//***************************I2C BUS WORK STOP***************************
void i2c_stop(void) //I2C BUS WORK STOP 
{
		i2c_updata(1,0);

		_nop_();
		_nop_();
		i2c_updata(0,1);

		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		i2c_updata(1,1);

		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
}
//***************************I2C BUS WORK STOP***************************

//***************************I2C BUS RESPONSE***************************
void i2c_ack(bit a1)//I2C BUS RESPONSE
{
	if (a1==0) 
		i2c_updata(1,0);
	else 
		i2c_updata(1,1);

	nc(6);
	nc(6);
	i2c_updata(0,1);

	nc(6);
	nc(6);
	i2c_updata(0,0);

	nc(6);
}
//***************************I2C BUS RESPONSE***************************

//***************************I2C BUS SEND BYTE SUB FUNCTION***************************
void SendByte(uchar c)//I2C BUS SEND BYTE SUB FUNCTION
{
	uchar BitCnt;
	for(BitCnt=0;BitCnt<8;BitCnt++)
	{
		if ((c<<BitCnt)&0x80)
			i2c_updata(1,1);
		else 
			i2c_updata(1,0);

		nc(6);
		i2c_updata(0,1);

		nc(6);
		i2c_updata(0,0);
		nc(6);
	}
	nc(6);
	i2c_updata(1,1);

	nc(15);
	i2c_updata(0,1);

	nc(5);
	switch(chrI2c)
	{
		case 1:
			{if(sda_1==1)
				ack=0;
			else
				ack=1;}
			break;
		 case 2:
			{if(sda_2==1)
				ack=0;
			else
				ack=1;}
			break;		 
		case 3:
			{if(sda_3==1)
				ack=0;
			else
				ack=1;}
			break;
		 case 4:
			{if(sda_4==1)
				ack=0;
			else
				ack=1;}
			break;
		 default:
		 	break;
	}
	i2c_updata(0,0);
	nc(6);
}
//***************************I2C BUS SEND BYTE SUB FUNCTION***************************

//***************************I2C BUS RECEIVE BYTE SUB FUNCTION***************************
uchar RcvByte()//I2C BUS RECEIVE BYTE SUB FUNCTION
{
	uchar retc;
	uchar BitCnt;
	retc=0;
	i2c_updata(1,1);

	for(BitCnt=0;BitCnt<8;BitCnt++)
	{
		nc(6);
		i2c_updata(0,0);

		nc(6);

		i2c_updata(0,1);

		nc(6);
		retc=retc<<1;
		switch(chrI2c)
		{
			case 1:
				if(sda_1==1) retc=retc+1;
				break;
			case 2:
				if(sda_2==1) retc=retc+1;
				break;
			case 3:
				if(sda_3==1) retc=retc+1;
				break;
			case 4:
				if(sda_4==1) retc=retc+1;
				break;
			default:
				break;
		}
		nc(6);
	}	
	i2c_updata(0,0);

	nc(6);
	return(retc);
}
//***************************I2C BUS RECEIVE BYTE SUB FUNCTION***************************

//***************************I2C BUS SEND BYTE***************************
bit ISendByte(uchar sla,uchar c)//I2C BUS SEND BYTE
{
	i2c_start();
	SendByte(sla);
	if(ack==0)
		return(0);
	SendByte(c);
	if(ack==0)
		return(0);
	i2c_stop();
	return(1);
}
//***************************I2C BUS SEND BYTE***************************	

//***************************I2C BUS SEND STRING***************************
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)//I2C BUS SEND STRING
{
	uchar i;
	i2c_start();
	SendByte(sla);
	if(ack==0)
		return(0);
	SendByte(suba);
	if(ack==0)
		return(0);
	for(i=0;i<no;i++)
	{
		SendByte(*s);
		if(ack==0)
			return(0);
		s++;
	}
	i2c_stop();
	return(1);
}
//***************************I2C BUS SEND STRING***************************

//***************************I2C BUS RECEIVE BYTE***************************
bit IRcvByte(uchar sla,uchar *c)//I2C BUS RECEIVE BYTE
{
	i2c_start();
	SendByte(sla);
	if(ack==0)
		return(0);
	*c=RcvByte();
	i2c_ack(1);
	i2c_stop();
	return(1);
}
//***************************I2C BUS RECEIVE BYTE***************************

//***************************I2C BUS RECEIVE STRING***************************
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)//I2C BUS RECEIVE STRING
{

⌨️ 快捷键说明

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