基于AVR单片机的AT24C01-512eeprom读写程序

发布者:BlissfulJoy最新更新时间:2016-10-28 来源: eefocus关键字:AVR单片机  AT24C01  eeprom  读写程序 手机看文章 扫描二维码
随时随地手机看文章
针对AT24Cxx系列eeprom存储器,写的时候有越页功能,不用考虑页边界,I2C用软件模拟实现,完善中…
 
#define SDA1() PORTC|=1< #define SDA0() PORTC&=~(1< #define SDAout() DDRC|=1< #define SDAin() DDRC&=~(1< #define RSDA() PINC&(1< #define SCL1() PORTC|=1< #define SCL0() PORTC&=~(1< #define e2ptime 20
 
//起始
void WriteStart(void)
 {
  SDA1();
    Delay(e2ptime);//该函数为软件延时函数,根据需要自己去写吧
  SCL1();
    Delay(e2ptime);
  SDA0();
    Delay(e2ptime);
  SCL0();
 }

//输出ACK
void WACK(unsigned char a)
 {
 SCL0();
 Delay(e2ptime);
 SDA0();//
 if(a)SDA1();
 Delay(e2ptime);
 SCL1();
 Delay(e2ptime);
 SCL0();
 }
//读ACK
unsigned char RACK(void)
{
 unsigned char temp=4;
 SCL0();
 Delay(e2ptime);
 SDAin();//改成输入
 SDA1();//加上拉
 SCL1();
 Delay(e2ptime);
 while(RSDA()&&temp)temp--;
 SCL0();
 SDAout();
 if(temp)return(0);
 else return(1);
}
//写一个字节
unsigned char WriteByte(unsigned char a)
{
 unsigned char i;
 SCL0();
 for(i=0x80;i;i>>=1)
 {
  Delay(e2ptime);
  if(a&i)SDA1();
  else SDA0();
  Delay(e2ptime);
  SCL1();
  Delay(e2ptime);
  SCL0();
  Delay(e2ptime);
 }
 return(RACK());
}
 //停止
void Stop(void)
 {
  SCL0();
    Delay(e2ptime);
  SDA0();//
    Delay(e2ptime);
  SCL1();
    Delay(e2ptime);
  SDA1();
//    Delay(e2ptime);
//  SCL0();
 }
 //读一个字节数据
char ReadByte(void)
{
  unsigned char temp,i;
  SCL0();
  SDAin();
  SDA1();
  for(i=0,temp=0;i<8;i++)
   {
   temp<<=1;
   SCL1();
   Delay(e2ptime);
   if(RSDA())temp|=1;
   SCL0();
   Delay(e2ptime);
   }
  SDAout();
  return(temp);
 }
 /*
AT24C01 为128字节 (0x00-0x7f)
AT24C02 为256字节 (0x00-0xff)
AT24C04 为512字节 (0x000-0x1ff)
AT24C08 为1024字节(0x000-0x3ff)
AT24C16 为2048字节(0x000-0x7ff)

AT24C32 为4096字节(0x000-0xfff)
AT24C64 为8192字节(0x0000-0x1fff)
AT24C128 为16384字节(0x00-0x7ff)
AT24C256 容量为32768字节(0x0000-0x7fff)
AT24C512 容量为65536字节(0x0000-0xffff)
*/
 //写入数据,器件型号model,器件地址DevAddr,开始地址addr,数据*P_data,数据长度num
void AT24CxxWrite(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
 {
 unsigned char i,temp,*p,ICerror=0,page_size;
 unsigned long next_page_start_addr;
 if(model<2)page_size=8;
 else if(model<32)page_size=16;
   else if(model<128)page_size=32;
     else if(model<512)page_size=64;
       else page_size=128;
 next_page_start_addr=model;
 next_page_start_addr<<=7;//总容量
 while(next_page_start_addr)
 {
  next_page_start_addr-=page_size;
  if(next_page_start_addr<=addr){next_page_start_addr+=page_size;break;}
 }
 
Wagain:
 p=P_data;
 i=num;//数据个数
 if(ICerror<10)ICerror++;
 else goto Wstop;
 SDAout();
 WriteStart();      //启动
 temp=0xa0+(DevAddr<<1);
 if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 if(WriteByte(temp))   //头字节
 goto Wagain;
 if(model>16)//写器件24c32以上地址高位
 {
  if(WriteByte(addr>>8))//
  goto Wagain;
 }
 if(WriteByte(addr&0xff)) //写地址低位
 goto Wagain;
 while(i)//写入数据i个
 {
  i--;
  if(WriteByte(*(p++)))goto Wagain;
  addr++;
  if(addr==next_page_start_addr)break;
 }
Wstop:
 Stop();
 if(i)//写到了页末,重新开始写新一页
 { 
 Delay(100);
 num=i;
 P_data=p;
 next_page_start_addr+=page_size;
 if(addr==model*128){addr=0;next_page_start_addr=page_size;}
 goto Wagain;
 }
}
//读数据,器件型号model,器件地址DevAddr,地址addr,存放到 *P_data,数据长度num
unsigned char AT24CxxRead(unsigned int model,unsigned char DevAddr,unsigned int addr,unsigned char *P_data,unsigned char num)
{
 unsigned char temp,*p,ICerror=0;
Ragain:
 if(ICerror<10)ICerror++;
 else goto Rstop;
 SDAout();
 p=P_data;
 WriteStart();//
 temp=0xa0+(DevAddr<<1);
 if(model<16) temp+=((addr>>7)&0x0e);//器件24c32以下地址高位
 if(WriteByte(temp))//;//头字节
 goto Ragain;
 if(model>16)//器件24c32以上地址高位
 {
  if(WriteByte(addr>>8))//
  goto Ragain;
 }
 if(WriteByte(addr&0xff))//
 goto Ragain;
Ragain2:
 WriteStart();//
 if(WriteByte(temp|1))//
 goto Ragain2;
 while(num--)
 {
  *(p++)=ReadByte();//
  if(num)WACK(0);
  else WACK(1);
 }
 Rstop:
 Stop();//
 return(ICerror);
}
 
main()
{
unsigned char card[20],addr,temp;
……
   AT24CxxWrite(256,3,addr,&Card[0],12);//at24c256,a1,a0引脚都的接高电平,片内地址为addr为起始地址,从数组card[]中取12字节数据存到存储器中
  temp= AT24CxxRead(256,3,addr,&Card[0],12);//at24c256,a1,a0引脚都的接高电平,片内地址为addr为起始地址,从存储器中取数到数组card[]中。返回读操作是否出错信息到temp。
关键字:AVR单片机  AT24C01  eeprom  读写程序 引用地址:基于AVR单片机的AT24C01-512eeprom读写程序

上一篇:ATMega8 查询方式 A/D转换测试程序
下一篇:AVR M16 8M 的DS18B20头文件

推荐阅读最新更新时间:2024-03-16 15:18

单片机上Flash和EEPROM的异同
FLASH的全称是FLASHEEPROM,但跟常规EEPROM的操作方法不同。 FLASH和EEPROM的最大区别是FLASH按扇区操作,EEPROM则按字节操作,二者寻址方法不同,存储单元的结构也不同,FLASH的电路结构较简单,同样容量占芯片面积较小,成本自然比EEPROM低,因而适合用作程序存储器,EEPROM则更多的用作非易失的数据存储器。当然用FLASH做数据存储器也行,但操作比EEPROM麻烦的多,所以更“人性化”的MCU设计会集成FLASH和EEPROM两种非易失性存储器,而廉价型设计往往只有FLASH,早期可电擦写型MCU则都是EEPRM结构,现在已基本上停产了。 至于那个“总工”说的话如果不是张一刀记
[单片机]
如何使用AVR单片机进行自整定PID控制器的设计
本文介绍了基于AVR单片机的自整定PID控制器的设计.该控制器以FESTO水位为控制对象,控制核心为ATmega128单片机.采用继电自整定PID算法,并用LED数码管实时显示控制情况.实验结果表明,本设计可以根据实际情况在线自整定PID参数.控制效果快速,平稳,超调量小。 PID控制器是过程控制中所用的主要控制器-由于其算法简单.鲁棒性好和可靠性高等特点,被广泛应用于工业过程控制.但是PID参数的整定一般需要经验丰富的工程技术人员来完成.既耗时又费力,加之实际系统有滞后和非线性等因素,增加了PID参数整定的难度.如何在线自整定PID参数,以符合过程控制的要求。是目前控制器设计中的一个重要课题,它不仅能减少操作人员的负担,还可
[单片机]
如何使用<font color='red'>AVR单片机</font>进行自整定PID控制器的设计
STC51单片机EEPROM的使用方法
STC51单片机有类似flash的功能EEPROM,可以掉电保存数据,不同型号的可以保存不同大小的数据,以12C5A60S2为例,EEPROM的大小为2K,分为两个扇区,掉电保存在很多地方需要。 首先寄存器的问题,不同系列的STC单片机的与EEPROM有关的寄存器不同,比如10/11/12系列的sfr ISP_DATA = 0xC2;sfr ISP_ADDRH = 0xC3;sfr ISP_ADDRL = 0xC4;sfr ISP_CMD = 0xC5;sfr ISP_TRIG = 0xC6;sfr ISP_CONTR = 0xC7;89/90系列的sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe
[单片机]
STC51单片机<font color='red'>EEPROM</font>的使用方法
读写24LCxx系列的EEPROM的实例程序
读写24LCxx系列的EEPROM的实例程序 ;******************************************************** ;* * ;* ? PIC16F877A ?I2C Master 家Α???﹃?Α EEPROM ?絛ㄒ祘Α * ;* * ;* Written by: Richard Yang * ;* Sr. Corporate Application Engineer * ;* Microchip Technology Inc.
[模拟电子]
AVR单片机串行接口SPI接口应用设计
  使用的同步串行三线SPI接口,可以方便的连接采用SPI通信协议的外围或另一片AVR单片机,实现在短距离内的高速同步通信。ATmega128的SPI采用硬件方式实现面向字节的全双工3线同步通信,支持主机、从机和2种不同极性的SPI时序,通信速率有7种选择,主机方式的最高速率为1/2系统时钟,从机方式最高速率为1/4系统时钟。   ATmega128单片机内部的SPI接口也被用于程序存储器和数据E2PROM的编程下载和上传。但特别需要注意的是,此时SPI的MOSI和MISO接口不再对应PB2、PB3引脚,而是转换到PE0、PE1引脚上(PDI、PDO),其详见第二章中关于程序存储器的串行编程和校验部分的内容。   ATmega
[单片机]
【51单片机快速入门指南】4.1: I2C 与 AT24C02 (EEPROM) 的跨页连续读写
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《普中 51 单片机开发攻略》、《24C02/24C04/24C08/24C16/24C32/24C64芯片手册》 AT24Cxx 介绍 AT24C01/02/04/08/16…是一个1K/2K/4K/8K/16K 位串行 CMOS,内部含有 128/256/512/1024/2048 个 8 位字节,AT24C01 有一个 8 字节页写缓冲器, AT24C02/04/08/16 有一个 16 字节页写缓冲器。该器件通过 I2C
[单片机]
【51单片机快速入门指南】4.1: I2C 与 AT24C02 (<font color='red'>EEPROM</font>) 的跨页连续读写
51单片机控制K9K8G08U0C NAND Flash读写程序
#include STC12C5A60S2.H #include intrins.h #include SMG.h /********************************************/ sbit NF_CLE=P0^3; //命令锁存使能(输出) CLE D3 sbit NF_ALE=P3^4; //地址锁存使能(输出) ALE RS sbit NF_WE=P1^3; //NAND Flash写使能(输出) /WE DB4 sbit NF_RE=P1^2; //NAND Flash读使能(输出) /RE DB3 sbit NF_CE
[单片机]
AVR单片机I/O口位操作,置位、清位、取反
看到好多新手对AVR单片机位变量使用不明白,现在提供一个I/O口位操作方法供大家学习: 下面是我用的宏定义方式: #define LED_SET PORTD |= (1 PD5) //位置高 #define LED_CLR PORTD &= ~(1 PD5) //位置低 #define LED_COM PORTD ^= (1 PD5) //位取反 #define LED_R PIND & (1 PD5) //位读取 通过上面的定义就可以在程序中直接操作I/O了。 本帖链接文字,方便回帖时直接复制使用: AVR单片机I/O口位操作,置位、清位、取反。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved