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

📄 file15.c

📁 单片机学习系统附的实验源代码
💻 C
字号:
/*
这里是at24cxx读写c语言代码,本例子实现了将一组数据写入at24cxx芯片,
并读出来用数码管的小数点加以显示读出来的数据的二进制表示。
比如,数码管最后一个显示的是'm'的二进制(6DH)的结果。
*/
#include  <8051.h>

#define uchar unsigned char
#define uint  unsigned int
#define AddWr 0xa0 /*器件地址选择及写标志*/
#define AddRd 0xa1 /*器件地址选择及读标志*/

#define segdata  P0   //数据 输出
#define sege  P2_7    //显示 选中
#define segb  P2_6    //位 选
#define segd  P2_5    //段 选


/*有关全局变量*/

#define Sda P2_3 /*串行数据*/
#define Scl P2_4/*串行时钟*/
#define WP  P2_5/*硬件写保护*/

void i2c_delay(void);
void mDelay(uint j);
void Start(void);
void Stop(void);
void Ack(void);

void NoAck(void);
void Send(uchar Data) ;
uchar Read(void);
void writeROM(uchar Data[],uchar Address,uchar Num);
void readROM(uchar Data[],uchar Address,uchar Num);


void main()

{

	uchar code  Number[]={'h','e','j','o','i','n','.','c','o','m',1,2,3,4};
	uchar f;
	uchar buf[10];
	
	P3_7 = 0;
	P0 = 0;
	P2=255;
	
	P1=255;
	WP= 1;
	
	writeROM(Number,0,10); /*将初始化后的数值写入EEPROM*/
	
	mDelay(20);
	
	readROM(buf,0,10);
	mDelay(20);
	
	sege = 0;
	
	for(f=0;f<10;f++)
	{
	    segdata = buf[f];
	    segd = 1;
	    segd = 0;
	    
	    segdata = 1;
	    segb = 1;
	    segb = 0;
	    
	    mDelay(5535);	    	    
	    
	}
	while(1){};

}

// 下面是at24cxx的读写程序  

void i2c_delay(void)
{ 
      uchar i;
   for(i=1;i<255;i++){}
}

void mDelay(uint j)

{ 
    uchar i;
	for(;j>0;j--)
	{ 
	    for(i=0;i<255;i--)
		{;}
	}
}

/*发送起始条件*/

void Start(void) /*起始条件*/

{

	Sda=1;
	Scl=1;
	
	i2c_delay();
	
	Sda=0;
	
	i2c_delay();
}

void Stop(void) /*停止条件*/

{

	Sda=0;
	
	Scl=1;
	
	i2c_delay();
	Sda=1;
	
	i2c_delay();

}

void Ack(void) /*应答位*/

{
	
	Sda=0;
	
	i2c_delay();
	
	Scl=1;
	
	i2c_delay();
	Scl=0;

}

void NoAck(void) /*反向应答位*/

{

	Sda=1;
	
	i2c_delay();
	Scl=1;
	
	i2c_delay();
	
	Scl=0;

}

void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/

{

	uchar BitCounter=8; /*位数控制*/
	
	uchar temp; /*中间变量控制*/

	do
	
	{
	
		temp=Data;
		
		Scl=0;
		
		i2c_delay();
		
		if((temp&0x80)==0x80)/* 如果最高位是1*/
		
			   Sda=1;
		else   Sda=0;
		
		Scl=1;
		
		temp=Data<<1; /*RLC*/
		
		Data=temp;
		
		BitCounter--;
	
	}while(BitCounter);

     Scl=0;

}


uchar Read(void) /*读一个字节的数据,并返回该字节值*/

{

	uchar temp=0;
	
	uchar temp1=0;
	
	uchar BitCounter=8;
	
	Sda=1;

	do{
	
		Scl=0;
		
		i2c_delay();
		
		Scl=1;
		
		i2c_delay();
		if(Sda)                 /*如果Sda=1;*/
			    temp=temp|0x01; /*temp的最低位置1*/
		else	temp=temp&0xfe; /*否则temp的最低位清0*/
		
			if(BitCounter-1)
			
			{ 
			      temp1=temp<<1;
			      temp=temp1;
			
			}
		
			BitCounter--;
		
	}while(BitCounter);

return(temp);

}


void writeROM(uchar Data[],uchar Address,uchar Num)

{

	uchar i;
	
	uchar *PData;
	
	PData=Data;
	
	for(i=0;i<Num;i++)
	
	{
	
		Start();         /*发送启动信号*/
		
		Send(0xa0);      /*发送SLA+W*/
		
		Ack();
		
		Send(Address+i); /*发送地址*/
		
		Ack();
		
		Send(*(PData+i));
		
		Ack();
		
		Stop();
		
		mDelay(20);
	
	}

}

void readROM(uchar Data[],uchar Address,uchar Num)

{

	uchar i;
	
	uchar *PData;
	
	PData=Data;
	
	for(i=0;i<Num;i++)
	
	{
		
		Start();
		
		Send(0xa0);
		
		Ack();
		
		Send(Address+i);
		
		Ack();
		
		Start();
		
		Send(0xa1);
		
		Ack();
	
		*(PData+i)=Read();
		
		Scl=0;
		
		NoAck();
		
		Stop();
	
	}

}

⌨️ 快捷键说明

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