单片机操作at24c02c程序.docx
《单片机操作at24c02c程序.docx》由会员分享,可在线阅读,更多相关《单片机操作at24c02c程序.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机操作at24c02c程序.docx](https://file1.bdocx.com/fileroot1/2022-10/29/954180a1-da12-497a-9268-daf5491086e3/954180a1-da12-497a-9268-daf5491086e31.gif)
单片机操作at24c02c程序
#include
#include
#defineucharunsignedchar
sbitSCK=P3^0;//串行时钟端
sbitSDA=P3^1;//串行数据端
/******************************************************************************************/
/*start();
stop();
write_b();
read_b();
ACKwrite();//写入一个字节数据接收IC的低电平响应信号
ACKread();//读出一个字节数据,MCU给出一个低电平的响应信号给IC
readbyte();//从指定地址读出一个数据
read_byte();//从指定地址读出一串数据
writebyte();//向指定地址内写入一位数据
write_byte();//从指定地址写入1页数据,at24c02每页一次只能写入4个字节数据,写入地址为高六位(低两位均视为0)(at24c04每页可写入16个数据)
cur_addr_read();//从当前地址中读出多位数据
sequential_read();//从指定地址中读出连续的多位数据
*/
/******************************************************************************************/
voiddelay(intx)
{
uchari;
for(;x>0;x--)
for(i=110;i>0;i--);
}
/******************************************************************************************/
voidstart()
{
SCK=0;
SDA=1;
SCK=1;
_nop_();
SDA=0;
_nop_();
SCK=0;
}
/******************************************************************************************/
voidstop()
{
SCK=0;
SDA=0;
SCK=1;
_nop_();
SDA=1;
_nop_();
SCK=0;
}
/******************************************************************************************/
voidACKread()//读出一个数据,MCU给出一个低电平的响应信号
{
SDA=0;
SCK=1;
_nop_();
_nop_();
SCK=0;
}
bitACKwrite()//写入一个数据,检测24C02返回的响应信号
{
biterror;
_nop_();
SCK=1;
_nop_();
_nop_();
_nop_();
error=SDA;
SCK=0;
returnerror;
}
/******************************************************************************************/
voidwrite_b(uchardat)//写数据
{
chari;
SCK=0;
for(i=0;i<8;i++)
{
dat<<=1;
SDA=CY;
SCK=1;
_nop_();
_nop_();
SCK=0;
}
ACKwrite();
}
/******************************************************************************************/
ucharread_b()//读数据
{
chari;
uchartemp=0;
SDA=1;//读数据需释放总线让总线处于空闲(很重要8嫠逫C可以进行读写操作,否则芯片没有动作┅
for(i=0;i<8;i++)
{
SCK=1;
_nop_();
_nop_();
temp=temp<<1|SDA;//高电平后数据稳定,开始读操作
SCK=0;
_nop_();
_nop_();
}
returntemp;
}
/******************************************************************************************/
ucharreadbyte(ucharaddr)//从任意地址中读出数据
{
start();
write_b(0xa0);
write_b(addr);
start();
write_b(0xa1);
ACC=read_b();
SDA=1;
SCK=1;
stop();
returnACC;
}
/******************************************************************************************/
voidcurrent_addr_read(ucharcount,ucharq[])//从当前地址开始读出多个数据
{
uchari;
start();
write_b(0xa1);
for(i=0;i{
q[i]=read_b();
ACKread();
}
q[i]=read_b();
SDA=1;
_nop_();
SCK=1;
SCK=0;
stop();
}
/******************************************************************************************/
voidsequential_read(ucharaddr,uchari,uchar*p)//从当前地址ADDR连续读出i个数据,放在P数组中
{
start();
write_b(0xa0);
write_b(addr);
current_addr_read(i,p);
}
/******************************************************************************************/
voidwritebyte(ucharaddr,uchardat)//单个字节写入指定地址addr
{
start();
write_b(0xa0);
write_b(addr);
//stop();
//start();
//write_b(0xa0);也可以这么写,只是浪费MCU时间
write_b(dat);
stop();
delay(10);
}
/******************************************************************************************/
voidpage_write(ucharaddr,uchar*p)//pagewrite每次可写入4字节数据
{
chari;
start();
write_b(0xa0);
write_b(addr&0xfc);
for(i=0;i<4;i++)
{
write_b(*p);
p++;
}
stop();
delay(10);
}
/******************************************************************************************/
/******************************************************************************************/
voidmain()
{
inti;
uchar*p;
uchart[8]={0,0,0,0};
p="abcd1234";
writebyte(0x00,0x11);
for(i=0;i<8;i++)
writebyte(i,0xff);
sequential_read(0x00,8,t);
//current_addr_read(8,t);
page_write(0,p);
page_write(0x04,p+4);
sequential_read(0x00,8,t);
while
(1)
for(i=0;i<8;i++)//测试写入的与读出的是否相等
{
P1=t[i];
delay(100);
P2=readbyte(0x00+i);
if(t[i]==readbyte(0x00+i))
P0=0;
else
P0=0xff;
}
}
Proteus里的仿真图片