微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR EEPROM 读写实验

AVR EEPROM 读写实验

时间:11-13 来源:互联网 点击:
iccavr教程之

ATMEGA8 中有1024字节的SRAM 、8096字节的FLASH 和 512字节的EEPROM,他们之间的区别是,FLASH是用来保存你的程序代码的,在程序运行过程中,程序本身不可以修改其内容,掉电内容不会丢失,只在烧写单片机时修改。SRAM 是保存程序运行过程中产生的临时数据,例如你定义的变量都保存在这里。1K 大小的空间,可以让你随意的定义变量,一般情况下不用担心不够用,只要你能记得住。与51单片机相比,这一点要好得多。在51里只有128 或256 字节的空间,而PIC系列更是少的可怜,往往要省着使用。SRAM具有掉电数据丢失的特点,如果想要在开机时得到上一次掉电时的一些数据,这些数据就不能保存在SRAM中了,而需要保存在EEPROM里。在AVR系列单片机中都有EEPROM,只是大小不同,利用AVR单片机设计电路可以省掉像24XX、93XX等外部EEPROM,可以简化电路,还提高了存储速度。

这个实验中我们做一个时钟程序,显示分钟和秒。并将时间保存在EEPROM中,在加电时读取时间,这样就可以接着上一次运行了。对EEPROM的操作很简单,只要在头文件中包含 eeprom.h 文件即可。读取数据调用 EEPROMread(addr) 函数,用addr指明读取的地址,该地址的数据在返回值中;写入数据调用 EEPROMwrite(addr,x),即将x写入地址addr中。

首先定义全局变量
unsigned char display[4]; // 显示缓冲区
unsigned char dis; // 当前显示
unsigned char s,m; // 时间

显示刷新的程序同上一节,用timer0中断来完成。用timer1做一个1秒钟的定时,在定时中断中记数时间并保存到EEPROM,程序如下:

if(++s == 60){ // 秒
s = 0;
if(++m == 60) m = 0; // 分钟
}
EEPROMwrite(1,s); // 保存时间
EEPROMwrite(2,m);
display[0] = s % 10; // 刷新显示缓冲
display[1] = s / 10;
display[2] = m % 10;
display[3] = m / 10;

在程序初始化中读取时间,并填入显示缓冲内

s = EEPROMread(1); // 读取时间
m = EEPROMread(2);
display[0] = s % 10; // 刷新显示缓冲
display[1] = s / 10;
display[2] = m % 10;
display[3] = m / 10;

这样就达到了目的,在写入程序第一次运行时显示的可能有点乱,因为第一次EEPROM中的值是不确定的,不过,断电后再加电就可以看到,显示是继上一次的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top