极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14559|回复: 5

《博哥Arduino学习笔记系列》- 第七课 EEPROM断电保存数据

[复制链接]
发表于 2016-12-25 23:21:53 | 显示全部楼层 |阅读模式
本帖最后由 单片机菜鸟 于 2016-12-25 23:21 编辑

一、前言

      EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合。简而言之,若想断电后Arduino仍然记住数据,就可以使用EEPROM。至于板子是否支持EEPROM,可以自主去查看板子的简洁。常见Arduino的EEPROM如下:
      
      Arduino EEPROM类库中,EEPROM的地址被设定从0开始,每个地址可以存储1B数据。所以当数据大于1B时,需要逐个字节读写。
      Arduino UNO、Arduino Leonardo 的EEPROM有1KB=1024B的存储空间,对应地址则为0~1023;
      Arduino Mega2560的EEPROM有4KB=4096B的存储空间,对应地址则为0~4095;

      
       Arduino有EEPROM类库,只需要调用EEPROM.h头文件,然后使用write()和read()函数就可以对EEPROM进行读写操作;
       1) write() 对指定地址写入数据
       语法:EEPROM.write(address,value);
       参数:address,EEPROM地址,起始地址为0
                value 写入的数据,byte型,意味着如果传入数据大于这个范围会被截断
       返回值:无

       2) read()  从指定地址读出数据。一次读取1B数据。如果指定地址没有数据,则读出值为255
       语法:EEPROM.read(address)
       参数:address,EEPROM地址,起始地址为0
       返回值:byte型,返回指定地址存储的数据;

       注意:EEPROM有10万次的擦写寿命,一次EEPROM.write会占用3ms,如果程序不断擦写EEPROM,则不用多久就损坏EEPROM,随意注意不要频繁擦写,在真正需要的时候再考虑使用,加入什么延时之类的。

二、实验内容
        1.在setup中往地址0~3中依次写入2~5,然后在loop中读取地址0~3然后把数据打印到串口显示器
三、实验过程
直接上代码:
  1. /**
  2. * @Desc  测试EEPROM
  3. * @author 单片机菜鸟
  4. * @Date  2016/12/25
  5. *
  6. * 注意:Arduino Mega 2560的EEPROM空间是4KB
  7. * 也就是4*1024 B = 4096B
  8. * 也就是地址是0~4095
  9. */

  10. #include<EEPROM.h>

  11. //表示EEPROM的当前地址,也就是即将要写入的地址
  12. int addr = 0;

  13. void setup() {

  14.   // 初始化串口
  15.   Serial.begin(9600);
  16.   //等待串口准备好
  17.   while(!Serial);
  18.   
  19.   int value = 2;
  20.   //在地址0~3依次写入2~5
  21.   for(int i = addr;i<4;i++){
  22.     EEPROM.write(i,value++);
  23.     //延时100ms 等待写入
  24.     delay(100);
  25.   }
  26. }

  27. void loop() {
  28.   // put your main code here, to run repeatedly:
  29.   Serial.println("read data start");
  30.   int value;
  31.   for(int i = addr;i<4;i++){
  32.     value = EEPROM.read(i);
  33.     Serial.print("addr:");
  34.     Serial.print(i);
  35.     Serial.print("\n");
  36.     Serial.print("value:");
  37.     Serial.print(value);
  38.     Serial.print("\n");
  39.   }
  40.   Serial.println("read data end");
  41.   
  42.   while(1);
  43. }
复制代码


效果:


效果如我预期那样,存入什么就显示什么。

四、总结

整体上这课还是非常简单的,唯一需要注意就是不要擦写频繁。讲完这课后,我就可以在蓝牙多彩灯加入这个功能了,记录存储当前灯颜色然后下次打开就可以使用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-12-26 12:28:40 | 显示全部楼层
楼主坐顶楼
回复 支持 反对

使用道具 举报

发表于 2017-1-14 10:03:23 | 显示全部楼层
学习,学习,你不得再加个清除教程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-14 10:40:07 | 显示全部楼层
ignore 发表于 2017-1-14 10:03
学习,学习,你不得再加个清除教程

清除不难 也没有什么清除 你可以全写0
回复 支持 反对

使用道具 举报

发表于 2017-10-25 13:17:10 | 显示全部楼层
学习了,请问怎么存入一组数?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-25 14:33:54 | 显示全部楼层
  陈大憨 发表于 2017-10-25 13:17
学习了,请问怎么存入一组数?

要么for循环  要么用结构体
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 18:13 , Processed in 0.054725 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表