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
}
}