单片机,AT24C02,EEPROM的驱动?

请问下面这几个函数,为什么不能出正确结果?
void At24c02_start(void)
{At24c02_date=1;
At24c02_clk=1;
Delay(3);
At24c02_date=0;
Delay(3);
At24c02_clk=0;
}

void At24c02_stop(void)
{At24c02_date=0;
At24c02_clk=1;
Delay(3);
At24c02_date=1;
Delay(3);
At24c02_date=0;
At24c02_clk=0;
}

bit At24c02_check_ack(void)
{At24c02_date=1;
At24c02_clk=1;
Delay(3);
}

bit At24c02_send_ack(void)
{At24c02_date=0;
At24c02_clk=1;
Delay(3);
At24c02_clk=0;
At24c02_date=1;
}

void At24c02_write_byte(uchar dat)
{uchar i;
ACC=dat;
for(i=0;i<8;i++)
{At24c02_date=Acc7;
At24c02_clk=1;
Delay(3);
At24c02_clk=0;
ACC=ACC<<1;
}
while(At24c02_check());
At24c02_clk=0;
}

uchar At24c02_read_byte(void)
{uchar i;
for(i=0;i<8;i++)
{ACC=ACC<<1;
At24c02_date=1;
At24c02_clk=1;
Delay(3);
Acc0=At24c02_date;
At24c02_clk=0;
}
At24c02_send_ack();
return(ACC);
}

void At24c02_write(uchar address,uchar dat)
{At24c02_start();
At24c02_write_byte(0xa0);
At24c02_write_byte(address);
Delay(3);
At24c02_write_byte(dat);
At24c02_stop();
Delay(5000);
}

uchar At24c02_read(uchar address)
{uchar dat;
At24c02_start();
At24c02_write_byte(0xa0);
At24c02_write_byte(address);
At24c02_start();
At24c02_write_byte(0xa1);
dat=At24c02_read_byte();
Delay(5000);
At24c02_stop();
return(dat);
}
如果您没耐心,给出一个能实现的C写的,你自证实能用的驱动也行.谢谢(网上抄的,没证实能用的最好不要贴来)

第1个回答  2009-04-23
//****************************11.0592MHz晶振,延时8.69*Count US****************************
void DelayUS(unsigned int Count)
{
while(--Count){;}
}

//****************************AT24C02B存储芯片代码****************************
/****************************************************************************/
void Write24C02B(unsigned char Wdata,unsigned char RomAddress)
{
AT24C02B_Start();
AT24C02B_Write8Bit(Write24C02BAddress);
AT24C02B_TestAck();
AT24C02B_Write8Bit(RomAddress);
AT24C02B_TestAck();
AT24C02B_Write8Bit(Wdata);
AT24C02B_TestAck();
AT24C02B_Stop();
DelayUS(11000);
}

/***************************************************************************/
unsigned char Read24C02B(unsigned char RomAddress)
{
unsigned char data temp;
AT24C02B_Start();
AT24C02B_Write8Bit(Write24C02BAddress);
AT24C02B_TestAck();
AT24C02B_Write8Bit(RomAddress);
AT24C02B_TestAck();
AT24C02B_Start();
AT24C02B_Write8Bit(Read24C02BAddress);
AT24C02B_TestAck();
temp=AT24C02B_Read8Bit();
AT24C02B_NoAck();
AT24C02B_Stop();
return temp;
}

/****************************************************************************/
void AT24C02B_I2CWait(void)
{
_nop_();
_nop_();
}

/****************************************************************************/
void AT24C02B_Start(void)
{
AT24C02B_SDA=1;
AT24C02B_SCL=1;
AT24C02B_I2CWait();
AT24C02B_SDA=0;
AT24C02B_I2CWait();
AT24C02B_SCL=0;
AT24C02B_I2CWait();
}

/****************************************************************************/
void AT24C02B_Stop(void)
{
AT24C02B_SCL=0;
AT24C02B_SDA=0;
AT24C02B_I2CWait();
AT24C02B_SCL=1;
AT24C02B_I2CWait();
AT24C02B_SDA=1;
AT24C02B_I2CWait();
}

/****************************************************************************/
void AT24C02B_NoAck(void)
{
AT24C02B_SDA=1;
AT24C02B_SCL=1;
AT24C02B_I2CWait();
AT24C02B_SCL=0;
AT24C02B_I2CWait();
}

/****************************************************************************/
unsigned char AT24C02B_TestAck(void)
{
unsigned char data ErrorBit;
AT24C02B_SDA=1;
AT24C02B_SCL=1;
AT24C02B_I2CWait();
ErrorBit=AT24C02B_SDA;
AT24C02B_I2CWait();
AT24C02B_SCL=0;
AT24C02B_I2CWait();
AT24C02B_I2CWait();
return(ErrorBit);
}

/****************************************************************************/
void AT24C02B_Write8Bit(unsigned char input)
{
unsigned char data temp;
for(temp=8;temp!=0;temp--)
{
if(input&0x80)
AT24C02B_SDA=1;
else
AT24C02B_SDA=0;
AT24C02B_I2CWait();
AT24C02B_SCL=1;
AT24C02B_I2CWait();
AT24C02B_SCL=0;
AT24C02B_I2CWait();
input=input<<1;
}
}

/****************************************************************************/
unsigned char AT24C02B_Read8Bit(void)
{
unsigned char data temp,rbyte=0;
for(temp=8;temp!=0;temp--)
{
AT24C02B_SCL=1;
AT24C02B_I2CWait();
rbyte=rbyte<<1;
if(AT24C02B_SDA)
rbyte=rbyte|0x1;
AT24C02B_I2CWait();
AT24C02B_SCL=0;
AT24C02B_I2CWait();
}
return(rbyte);
}

我的温湿度监控板子上的部分代码。本回答被提问者采纳
第2个回答  2009-04-23
#include<reg52.h>
#include<intrins.h> sda=P3^2; //IO口 //不同自己定义
sbit scl=P3^1;
/////////24C02读写驱动程序////////////////////
void delay1(unsigned char x)
{ unsigned int i;
for(i=0;i<x;i++);
;}
void flash()
{ ; ; }
void x24c02_init() //24c02初始化子程序
{scl=1; flash(); sda=1; flash();}
void start() //启动I2C总线
{sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();}
void stop() //停止I2C总线
{sda=0; flash(); scl=1; flash(); sda=1; flash();}
void writex(unsigned char j) //写一个字节
{ unsigned char i,temp;
temp=j;
for (i=0;i<8;i++)
{temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}
scl=0; flash(); sda=1; flash();
}
unsigned char readx() //读一个字节
{
unsigned char i,j,k=0;
scl=0; flash(); sda=1;
for (i=0;i<8;i++)
{ flash(); scl=1; flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;}
flash(); return(k);
}
void clock() //I2C总线时钟
{
unsigned char i=0;
scl=1; flash();
while ((sda==1)&&(i<255))i++;
scl=0; flash();
}
////////从24c02的地址address中读取一个字节数据/////
unsigned char x24c02_read(unsigned char address)
{
unsigned char i;
start(); writex(0xa0);
clock(); writex(address);
clock(); start();
writex(0xa1); clock();
i=readx(); stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c02_write(unsigned char address,unsigned char info)
{
EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
EA=1;
delay1(50);
}

我也是网上下载的,我已经加在了我的程序中能用
第3个回答  2009-04-22
/*********************************at24c04*******************************/
/*************************************delayMs*******************************/

/*************************I2C*START**************************************/
void Start() {
SDAE=1;
SCL=1;
SDAE=0;
SCL=0;
}

/*******************************I2C*STOP*******************************/
void Stop() {
SCL=0;
SDAE=0;
SCL=1;
SDAE=1;
}

/************************************************************************/
void Ack() {
SDAE=0;
SCL=1;
SCL=0;
SDAE=1;
}

/************************************************************************/
void NoAck() {
SDAE=1;
SCL=1;
SCL=0;
}

/***********************************************************************/
bit TestAck() {
bit ErrorBit;
SDAE=1;
SCL=1;
ErrorBit=SDAE;
SCL=0;
return(ErrorBit);
}

/***********************************************************************/
void Write8Bit(unsigned char input) {
unsigned char temp;
for(temp=8;temp!=0;temp--) {
SDAE=(bit)(input&0x80);
SCL=1;
SCL=0;
input=input<<1;
}
}

/***************************************************************************/
void WritNVSRAM16K(unsigned char *Wdata,unsigned int RomAddress,unsigned char number) {
unsigned char dd;
dd=((RomAddress&0x7ff)/256)<<1;
Start();
Write8Bit(WriteDeviceAddress|dd);
TestAck();
Write8Bit(RomAddress);
TestAck();
for(;number!=0;number--) {
Write8Bit(*Wdata);
TestAck();
Wdata++;
}
Stop();
DelayMs(10);
}

/***************************************************************************/
unsigned char Read8Bit() {
unsigned char temp,rbyte=0;
for(temp=8;temp!=0;temp--) {
SCL=1;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(SDAE));
SCL=0;
}
return(rbyte);
}

/***************************************************************************/
void ReadNVSRAM16K(unsigned char *RamAddress,unsigned int RomAddress,unsigned char bytes) {
unsigned char ddd;
ddd=(( RomAddress&0x7ff)/256)<<1;

Start();
Write8Bit(WriteDeviceAddress|ddd);
TestAck();
Write8Bit(RomAddress);
TestAck();
Start();
Write8Bit(ReadDviceAddress|ddd);
TestAck();
while(bytes!=1) {
*RamAddress=Read8Bit();
Ack();
RamAddress++;
bytes--;
}
*RamAddress=Read8Bit();
NoAck();
Stop();
}

这个程序是我产品上面的

arduino i2c EEPROM(AT24C02、AT24C08、AT24C16、AT24C32、AT24C64)驱...
EEPROM允许在不改变硬件的情况下对数据进行多次写入和读取,这使得它在存储用户配置信息、游戏进度或传感器数据等方面非常有用。ATMEL公司生产的AT24C系列EEPROM芯片(AT24C02、AT24C08、AT24C16、AT24C32、AT24C64)特别适用于这类应用。下面将解释如何使用Arduino的Wire库来驱动这些AT24C系列的EEPROM。首先,要...

STM32基础:IIC总线操作EEPROM存储模块AT24C02
在STM32的精密世界中,IIC总线以其高效和灵活,成为了驱动AT24C02 EEPROM存储模块的强大工具。这款2K存储容量、双线串行接口的AT24C02,还配备了写保护等实用特性,让我们一起深入探究其工作原理和操作技巧。首先,让我们理解IIC的精髓:这是一种全双工、串行通信接口,适用于低速、低功耗的设备连接。而AT24C...

谁知道AT24C02的中文资料,在单片机中是如何被利用的,他的功能是什么呢...
AT24C02是美国 ATMEL 公司的低功耗 CMOS 串行 EEPROM,它是内含256×8 位存储空间,具有工作电压宽(2.5~5.5V) 、擦写次数多(大于10000次) 、写入速 度快(小于10ms)等特点。AT24C02中带有片内寻址寄存器。每写入或读出一个数 据字节后,该地址寄存器自动加1,以实现对下一个存储单元的操作。...

既然51单片机有了存储的作用,那AT24C02行使EEPROM的作用是不是多余了...
现在很多单片机内置EEPROM,包括增强型51单片机,这为芯片的选型提供了便利。估计,单片机外挂EEPROM应用将日渐减少。

at24c02是什么
AT24C02是Ateml公司的2KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8 脚的DIP 封装,使用方便。简而言之,AT24C02是一个在突然掉电的情况下存储数据的芯片,即掉电存储...

【STM32Cube_13】使用硬件I2C读写EEPROM(AT24C02)
编写EEPROM驱动程序,确定IIC器件地址为0xA2(读地址)和0xA3(写地址)。根据AT24C02的数据手册,编写相关的宏定义和底层函数。实现任意地址写单个字节和读单个字节的函数。使用单个函数连续写入多个字节会导致数据覆盖同一页面,需要编写写一页的格式。连续读取多个字节不受限制,直接读取即可。测试字节读写...

STM32CubeMX学习笔记(9)——I2C接口使用(读写EEPROM AT24C02)
开发板中的 EEPROM 芯片型号:AT24C02。AT24C 系列为美国 ATMEL 公司推出的串行 COMS 型 EEPROM。芯片型号后两位表示芯片容量,例如 ATC24C02 为 2K。引脚图中 A0、A1、A2 为器件地址引脚,GND为地,VCC为正电源,WP为写保护,SCL为串行时钟线,SDA为串行数据线。 EEPROM 芯片中 WP 引脚具有写保护功能,当该引脚电平...

51单片机中不用锁存器怎么显示动态数码管
AT24C02是EEPROM芯片,与数码管毫无关系。要组成动态显示电路,可以不用锁存器,是数码管驱动电路是必须用的。如果,要是仿真,数码管的段控和位控是可以直接用单片机引脚的,不用锁存器,也不用驱动,真的可以做到不用74芯片,如下仿真图。但是,要是做实物,可以不用锁存器,但驱动必须用,不用74...

【蓝桥杯单片机】PCF8591和24C02综合应用-智能照明自动控制器_百度知 ...
AT24C02是2kBit的串行EEPROM存储器,包含256字节。具有8字节的页写缓冲器。其容量为2kBit,地址分为写地址和读地址,写地址为0xa0,读地址为0xa1。芯片寻址范围为00~FF,共256个寻址单位。AT24C02的读写操作分为写操作和读操作。写操作实现数据的写入,读操作则用于随机读取数据。编写AT24C02的读写模块...

单片机如何读取存储IC的代码
AT24C02作为一个EEPROM,用来存储一些数据 比如:掉电后,可以把掉电前的数据缓存到AT24C02 而AT24C02和单片机通讯的话一般使用的是II2C总线~~~你要读取的东西你可以通过II2C总线配置后进入里面读写数据!!学单片机,AT24C02应该是必须会使得 因为比较简单 相关II2C总线只是,相信你只要百度一下,一定会有你...

相似回答