如何使用单片机模拟读写24C01EEPROM数据

控制/MCU

1878人已加入

描述

实验目的:

熟悉使用单片机模拟读写24C01EEPROM

1、首先向24C01EEPROM写入数据

2、在从24C01EEPROM中读取数据,并用LED显示

硬件设置:

1、SW4开关全部闭合

2、SW2开关1闭合,其它断开

3、SW3开关7和8闭合,其它断开

#include

__CONFIG(0x3545);

//FLASH代码不保护,RB6和RB7为调试模式,FLASH不写保护,数据代码不保护

//RB3为数字IO口,低电压复位使能,上电延时开,看门狗开,4M晶体XT振荡器

#defineucharunsignedchar

#defineuintunsignedint

#defineSCLTRISC3

#defineSDATRISC4

定义写入EEPROM数据

ucharcode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

定义读取EEPROM数据变量

ucharack,data[8];

//函数名:delayus(uchartime);

//入口参数:time

//出口参数:无

//函数作用:微妙延时

//说明:

voiddelayus(uchartime)

{

while(time--)

{

asm(“nop”);

}

}

//函数名:delayms(uchartime);

//入口参数:time

//出口参数:无

//函数作用:延时

//说明:

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

voiddelayms(uchartime)

{

uinti;

while(time--)

{

for(i=93;i》0;i--){;}

}

}

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

//函数名:i2c_start(void);

//入口参数:无

//出口参数:无

//函数作用:产生启动信号

//说明:

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

voidi2c_start(void)

{

SDA=1;//当SCL为高电平时使SDA产生一个负跳变

delayus(1);

SCL=1;

delayus(5);

SDA=0;

delayus(2);

SCL=0;//钳住I2C总线,准备发送数据或接收数据

delayus(2);

}

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

//函数名:i2c_stop(void);

//入口参数:无

//出口参数:无

//函数作用:产生停止信号

//说明:

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

voidi2c_stop(void)

{

SDA=0;//当SCL为高电平时使SDA产生一个正跳变

delayus(1);

SCL=1;

delayus(5);

SDA=1;

delayus(4);

}

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

//函数名:i2c_writebyte(uchardata);

//入口参数:data

//出口参数:无

//函数作用:写一个字节函数

//说明:

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

voidi2c_writebyte(uchardata)

{

uchari;

for(i=0;i《8;i++)//写8位数据

{

if(data&0x80){SDA=1;}//先写高位

else{SDA=0;}

delayus(1);

SCL=1;

delayus(5);

SCL=0;

data=data《《1;//写下一位

}

delayus(2);

SDA=1;

delayus(2);

SCL=1;

delayus(3);

while(RC4){;}//等待应答信号,RC4=0则有应答

SCL=0;

delayus(2);

}

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

//函数名:i2c_writedata(ucharaddr,uchar*ptt);

//入口参数:addr,*ptt

//出口参数:无

//函数作用:按地址向EEPROM写数据块

//说明:

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

voidi2c_writedata(ucharaddr,uchar*ptt)

{

uchari;

i2c_start();//产生启动信号

i2c_writebyte(0XA0);//I2C写指令和IC地址

i2c_writebyte(addr);//写EEPROM地址

for(i=0;i《8;i++,ptt++)//写8个数据

{

i2c_writebyte(*ptt);

}

i2c_stop();//产生停止信号

}

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

//函数名:i2c_readbyte(void);

//入口参数:无

//出口参数:SSPBUF

//函数作用:从EEPROM读取一个字节数据

//说明:

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

unsignedchari2c_readbyte(void)

{

uchardata,i;

data=0;

SDA=1;

for(i=0;i《8;i++)//读8位数据

{

delayus(1);

SCL=0;

delayus(5);

SCL=1;

delayus(2);

data=data《《1;

if(RC4)//判断读取数据是否为1

{

data=data|0x01;

}

delayus(2);

}

SCL=0;

delayus(2);

return(data);//返回读取的数据

}

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

//函数名:i2c_readdata(ucharaddr);

//入口参数:addr

//出口参数:data[8]

//函数作用:按地址从EEPROM读取数据块

//说明:

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

voidi2c_readdata(ucharaddr)

{

uchari;

for(i=0;i《8;i++,addr++)

{

i2c_start();//产生启动信号

i2c_writebyte(0xA0);//I2C写指令和IC地址

i2c_writebyte(addr);//读EEPROM数据的地址

i2c_start();//重新产生启动信号

i2c_writebyte(0xA1);//I2C读指令和IC地址

data[i]=i2c_readbyte();//读取数据

i2c_stop();//产生停止信号

}

}

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

//函数名:main(void);

//入口参数:无

//出口参数:无

//函数作用:MAIN函数

//说明:

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

voidmain(void)

{

uchari;

TRISA=0X00;//设置RA口为输出口

PORTA=0X00;//RA口输出低电平

ADCON1=0X07;//设置RA口和RE口为普通IO口

TRISC=0Xff;//RC3和RC4为输入,RC3为SCL线,RC4为SDA线。

TRISD=0X00;//RD口为输出

OPTION=0X8F;//分频给WDT,分频比为128

PORTC=0X00;

PORTD=0X00;

i2c_writedata(0x00,code);//调用写数据函数,写EEPROM地址,要写的数据

delayms(250);

CLRWDT();//清看门狗

i2c_readdata(0x00);//调用读数据函数,读EEPROM数据地址

while(1)

{

for(i=0;i《8;i++)

{

CLRWDT();//清看门狗

PORTD=data[i];//输出指示

delayms(250);

}

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分