×
单片机 > 单片机程序设计 > 详情

AVR EEPROM 读写实验

发布时间:2020-06-04 发布时间:
|
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中的值是不确定的,不过,断电后再加电就可以看到,显示是继上一次的。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容