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

📄 24cxx.c

📁 at89s51实验例程代码
💻 C
字号:
/*实验名称:读写AT24C02实验
  功能:用串口发送指令读出或写入00-7FH单无的内容,显示结果在LCD上显示
  读出(16进制数):AA 地址
  写入(16进制数):BB 地址 内容
  作者:http://www.mcuyjf.com.cn
        05-02-01
*/
#include <reg51.h>
#define Uchar unsigned char
#define Uint  unsigned int
#define SomeNOP(); _nop_();_nop_();_nop_(); 
//定义变量
Uchar recip,recsum,myflag,recdata[2];	//接收指针,接收个数,用户标志,接收存放数组
sbit readbit = myflag^0;	//读EEPROM标志
sbit writebit = myflag^1;	//写EEPROM标志
sbit rs232okbit = myflag^2;	//接收完一拍完整的指令

/*I2C要用到的口线定意*/
sbit SDA = P2^7;
sbit SCL = P2^6;
/*控制的口线定意*/
//LCD口线的定义
sbit E = P3^5;
sbit RW = P3^6;
sbit RS = P3^7;	

//LCD驱动要用到的一些子程序
//-------------------------------------
void Delay(unsigned int t)   // delay 40us
{
 for(;t!=0;t--) ;
}
//=============================================
void SendCommandByte(unsigned char ch)
{
   RS=0;
   RW=0;
   P0=ch;
   E=1;
    Delay(1);
   E=0;
   Delay(100);  //delay 40us
}
//-------------------------------------------------------
void SendDataByte(unsigned char ch)
{  RS=1;
   RW=0;
   P0=ch;
   E=1;
       Delay(1);
   E=0;
   Delay(100); //delay 40us
}
//-------------------------------------------------
void InitLcd()
{SendCommandByte(0x30);
 SendCommandByte(0x30);
 SendCommandByte(0x30);
 SendCommandByte(0x38);	//设置工作方式
 SendCommandByte(0x0c); //显示状态设置
 SendCommandByte(0x01); //清屏
 SendCommandByte(0x06); //输入方式设置
}



/*----------------------I2C要用到的一些子程序---------------------------------*/
/***********************以下为一些用到的子程序*********************************/
/*延时子程序*/
void Delay_1ms(Uchar time)
{
	Uchar j;
	while(time--)
	{
		for(j=163;j!=0;j--)
		{;}
	}
}

/*I2C的起动程序*/
void I2CStart(void)	
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 0;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

/*I2C的停止程序*/
void I2CStop(void)
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}

void ACK(void)			//Acknowledge信号
{
	SDA = 0;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void NACK(void)			//没有Acknowledge信号
{
	SDA = 1;
	SomeNOP();
	SCL = 1;
	SomeNOP();
	SCL = 0;
	SomeNOP();
}

void AutoACK(void)		//在一定的时间内自动确定ACK的信号//
{
	Uchar i = 0;
	SCL = 1;
	SomeNOP();
	while((SDA == 1)&&(i<255))i++;
	SCL = 0;
	SomeNOP();
}

	
/*I2C写数据程序(向数据线上写一个BYTE)*/
void Writex(Uchar j)
{
	Uchar i,temp;
	temp = j;
	for (i=0;i<8;i++)	//串行移位,先送高位,再送低位//
	{
		temp =temp<<1;
		SCL = 0;
		SomeNOP();
		SDA = CY;
		SomeNOP();
		SCL = 1;
		SomeNOP();
	}
	SCL = 0;
	SomeNOP();
	SDA = 1;
	SomeNOP();
}
/*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
Uchar Readx(void)
{
	Uchar i,j,k=0;
	SCL = 0;
	SomeNOP();
	SDA = 1;
	for (i=0;i<8;i++)	// 串行移位,先读出高位,后读出低位//
	{
		SomeNOP();
		SCL = 1;
		SomeNOP();
		if(SDA ==1) j=1;
		else	j=0;
		k =(k<<1)|j;
		SCL = 0;
	}
	SomeNOP();		
	return(k); 		//返回读出的值//
}

//******************以下为对24CXX系列的读写程序******************************//
//*************24CXX的device address 为写0A0H,读为0A1H*********************//
/*某个地址写数据*/
void X24_Write(Uchar Addresslow,Uchar Write_date)
{
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	Writex(Write_date);
	AutoACK();
	I2CStop();
	Delay_1ms(10);
}

/*对某个地址读操作,函数值为读出的数据*/
Uchar X24_Read(Uchar Addresslow)
{	
	Uchar i;
	I2CStart();
	Writex(0xA0);
	AutoACK();
	Writex(Addresslow);
	AutoACK();
	I2CStart();
	Writex(0xA1);
	AutoACK();
	i =Readx();
	//ACK();	//注意:这里不能有ACK应答信号//
	I2CStop();
	Delay_1ms(0);
	return(i);
}

//以下为串行口中断程序,用于接收串行数据
void rs232(void) interrupt 4
{
	if(RI==1)
	{
		RI=0;
		if(SBUF==0xaa)
		{
			recsum=0x01;
			readbit=1;
			recip=0x00;
		}
		else
		{
			if(SBUF==0xbb)
			{
				recsum=0x02;
				writebit=1;
				recip=0x00;
			}
			else
			{
				recdata[recip]=SBUF;
				recip++;
				recsum--;
				if(recsum==0x00){rs232okbit=1;}
			}
		}
		
	}
}


//以下为定时器中断程序,
void time0(void) interrupt 1
{
	Uchar 	temp;
	TH0=0xfc;
	TL0=0x67;
	if(rs232okbit==1)
	{
		rs232okbit=0;
		if(readbit==1)
		{
			readbit=0;
			temp=X24_Read(recdata[0]);
			
		}
		
	}
}

void main(void)
{
	
}

⌨️ 快捷键说明

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