eeprom的读写操作测试程序24C64,课设题目

#include "regx51.h"

#include"intrins.h"

#define uchar unsigned char
#define uint unsigned int

/**************************************
定义I2C总线数据线
***************************************/
#define SDL P2_7

/**************************************
定义I2C总线时钟线
***************************************/
#define SCL P2_6

#define ch451_dsp 0x0500

uchar tag = 1, i=0;;

bdata uchar ReceiveData;

bdata uchar TransmitData;

uchar BufData[10];

uchar ReadTo[8] = {0x10,0x11,0x12,0x13,0x14,0x05,0x06,0x07};

//uint Contrl[4] = {0x0800,0x0900,0xa00,0xb00};

//uint PASS[4] = {0x73,0x77,0x6d,0x6d};
//uint FALL[4] = {0x71,0x77,0x38,0x38};

sbit ReceiveData_0=ReceiveData^0;

sbit TransmitData_7=TransmitData^7;


////////////////////////////////////////////////////////////////////////////////


#define DIN P1_0

#define DCLK P1_1

#define LOAD P1_2

#define CLOCK P1_3

/************************************

定义变量位于位寻址区

************************************/
uchar bdata WS_8bit,WS_4bit;

sbit WS_8bit_0=WS_8bit^0;

sbit WS_4bit_0=WS_4bit^0;

/************************************

延时函数

************************************/
void Delay(void)
{
unsigned int i;

for(i=0;i<35000;i++);
}

/************************************

数码管写12BIT数据函数

************************************/
void Write_12bit_data(uchar WX_8bit,uchar WX_4bit)
{
uchar Time8s,Time4s;

WS_8bit=WX_8bit;

WS_4bit=WX_4bit;

LOAD=0;

for(Time8s=0;Time8s<8;Time8s++)
{

DCLK=0;

DIN=WS_8bit_0;

DCLK=1;

WS_8bit>>=1;

}
for(Time4s=0;Time4s<4;Time4s++)
{

DCLK=0;

DIN=WS_4bit_0;

DCLK=1;

WS_4bit>>=1;

}

LOAD=1;

}

/************************************

数码管驱动使能

************************************/
void ENch451(void)
{

DIN=1;

DIN=0;

DCLK=1;

LOAD=1;


}

///////////////////////////////////////////////////////////////////////////////

void Delay10us(void)
{
uchar m=3;

while(--m);
}

void DELAY10MS(void)
{
unsigned int k,j;

for(k=0;k<800;k++);

for(j=0;j<800;j++);
}
/**************************************
函数: START_BUS(void)

功能: I2C总线启动

原理: SCL为高时,SDL由高变低启动总线
***************************************/
void START_BUS(void)
{
SDL=1;

Delay10us();

SCL=1;

Delay10us();

SDL=0;

Delay10us();

SCL=0;


}

/**************************************
函数: STOP_BUS(void)

功能: I2C总线启动

原理: SCL为高时,SDL由低变高启动总线
***************************************/
void STOP_BUS(void)
{
Delay10us();


SDL=0;

Delay10

us();


SCL=1;

Delay10us();

SDL=1;

Delay10us();

SDL=0;

}
/**************************************
函数: WRITE_8BIT_DATA(uchar PRDATA)

功能: 写8个比特数据

原理: SCL为低时,总线数据SDL可以改变,

SCL为高电平的SDL不能改变,否则

被认为是重新启动总线或者停止传

输,传输顺序高位在前低位在后
***************************************/

void WRITE_8BIT_DATA(uchar PRDATA)
{
uchar i;

TransmitData=PRDATA;

for(i=0;i<8;i++)
{

SDL=TransmitData_7;

Delay10us();

SCL=1;

Delay10us();

SCL=0;

Delay10us();

TransmitData<<=1;

}

}

/**************************************
函数: READ_8BIT_DATA(void)

功能: 读8个比特数据

原理: SCL为高时可以从总线读数据
***************************************/
uchar READ_8BIT_DATA(void)
{
uchar i;

//SDL=1;

for(i=0;i<8;i++)
{
ReceiveData<<=1;

SCL=1;

Delay10us();

ReceiveData_0=SDL;

Delay10us();

SCL=0;

Delay10us();

}
return ReceiveData;

//Delay10us();

//SCL=1;

//Delay10us();

//SCL=0;

}
/**************************************
函数: ACK(void)

功能: ACK判断

原理: 每传输一个字节后,FLASH会向MCU返回

一个标志位,如果该位为0表明内部数

据处理完毕,如果为1说明器件内部还

在处理或者器件根本没有响应
***************************************/
void ACK(void)
{
Delay10us();

SCL=1;


while(SDL==1);


Delay10us();

SCL=0;

Delay10us();

}
void ACK1(void)
{

Delay10us();

SCL=0;

Delay10us();

SDL=0;

Delay10us();

SCL=1;

Delay10us();

SCL=0;

Delay10us();

SDL=1;



}

/***********************************************************************
函数:FLASH_WRITE_DATA(void)

功能:向FLASH里面写数据

原理及步骤:I2C总线写数据时首先需要I2C总线启动条件SCL为H时,SDA由H变为L,

然后写入器件的地址,配套实验箱已经将器件地址A2A1A0接地,即设

置为0,高4位为1010,写器件的命令R/W为0,因此器件地址为101000

00即0XA0;每次写完一个字节数据FLASH会向MCU返回一个ACK,通过判定

该ACK确定芯片是否工作正常,器件地址后紧跟存储区地址,2个字节地

址,然后紧跟的就是需要存储的数据


************************************************************************/

void FLASH_WRITE_DATA(uchar

num)
{

START_BUS();//启动总线

WRITE_8BIT_DATA(0XA0);//写器件地址

ACK();

WRITE_8BIT_DATA(0X00);//写存储区地址高位

ACK();

WRITE_8BIT_DATA(num);//写存储区地址低位

ACK();

WRITE_8BIT_DATA(num);//写数据

ACK();

WRITE_8BIT_DATA(num);//写数据

ACK();

STOP_BUS();

}




/***********************************************************************
函数:FLASH_READ_DATA(void)

功能:从FLASH里面读数据

原理及步骤:从FLASH里面某个地址单元读数据需要先写此单元的地址,然后再转换

读模式

************************************************************************/
void FLASH_READ_DATA(void)
{
START_BUS();//启动总线

WRITE_8BIT_DATA(0XA0);//写器件地址

ACK();

WRITE_8BIT_DATA(0X00);//写存储区地址高位

ACK();

WRITE_8BIT_DATA(0X00);//写存储区地址低位

ACK();



START_BUS();//启动总线

WRITE_8BIT_DATA(0XA1);//写器件地址同时使能读命令

ACK();

BufData[0] = READ_8BIT_DATA();

ACK1();

BufData[1] = READ_8BIT_DATA();

ACK1();

BufData[2] = READ_8BIT_DATA();

ACK1();

BufData[3] = READ_8BIT_DATA();

ACK1();

BufData[4] = READ_8BIT_DATA();

ACK1();

BufData[5] = READ_8BIT_DATA();

ACK1();
BufData[6] = READ_8BIT_DATA();

ACK1();
BufData[7] = READ_8BIT_DATA();

ACK1();

STOP_BUS();
}

void main()
{
//uint num = 0x55;

FLASH_WRITE_DATA(num);

DELAY10MS();

FLASH_READ_DATA();

for(i=0;i<8;++i)
{
if(BufData[i] == ReadTo[i])
{
tag = 0;
break;
}
}


if(tag == 0)
{
ENch451();
Write_12bit_data(0X01,0X04);

Write_12bit_data(0X80,0X00);//配置命令 显示fail

Write_12bit_data(0X71,0X08);//显示1

Write_12bit_data(0X77,0X09);//显示2

Write_12bit_data(0X06,0X0A);//显示3

Write_12bit_data(0X38,0X0B);//显示4
}

else
{
ENch451();

Write_12bit_data(0X01,0X04);

Write_12bit_data(0X80,0X00);//配置命令 显示pass

Write_12bit_data(0X73,0X08);//显示1

Write_12bit_data(0X77,0X09);//显示2

Write_12bit_data(0X6d,0X0A);//显示3

Write_12bit_data(0X6d,0X0B);//显示4

}
}


相关文档
最新文档