单片机操作at24c02c程序.docx

上传人:b****2 文档编号:2470635 上传时间:2022-10-29 格式:DOCX 页数:9 大小:39.30KB
下载 相关 举报
单片机操作at24c02c程序.docx_第1页
第1页 / 共9页
单片机操作at24c02c程序.docx_第2页
第2页 / 共9页
单片机操作at24c02c程序.docx_第3页
第3页 / 共9页
单片机操作at24c02c程序.docx_第4页
第4页 / 共9页
单片机操作at24c02c程序.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

单片机操作at24c02c程序.docx

《单片机操作at24c02c程序.docx》由会员分享,可在线阅读,更多相关《单片机操作at24c02c程序.docx(9页珍藏版)》请在冰豆网上搜索。

单片机操作at24c02c程序.docx

单片机操作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里的仿真图片

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1