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中的值是不确定的,不过,断电后再加电就能够看到,显现是继上一次的。