您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > STC单片机EEPROM的应用和程序
STC单片机EEPROM的应用和程序(2009-04-2221:58:34)转载▼标签:杂谈分类:Program最近,由于工作的需要,用STC89C52来开发新产品,要用天STC的Eeprom的功能,上网也找了一点资料,得到很大帮助,真的非常感谢。程序是我在网上摘录的,调试通过了,不过我产品在用动态扫描显示的,由于在Eeprom擦除时要用几十毫秒,会有一闪烁的。不过这是正常的。单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM或FLASHROM等存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC或SPI等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC单片机中内置了EEPROM(其实是采用IAP技术读写内部FLASH来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。下面就详细介绍STC单片机内置EEPROM及其使用方法。STC各型号单片机内置的EEPROM的容量各有不同,见下表:(内部EEPROM可以擦写100000次以上)上面提到了IAP,它的意思是“在应用编程”,即在程序运行时程序存储器可由程序自身进行擦写。正是是因为有了IAP,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。要使用IAP功能,与以下几个特殊功能寄存器相关:ISP_DATA:ISP/IAP操作时的数据寄存器。ISP/IAP从Flash读出的数据放在此处,向Flash写的数据也需放在此处ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。ISP_TRIG:ISP/IAP操作时的命令触发寄存器。当ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入0x46,再写入0xb9,ISP/IAP命令才会生效。单片机芯片型号起始地址内置EEPROM容量(每扇区512字节)STC89C51RC,STC89LE51RC0x2000共八个扇区STC89C52RC,STC89LE52RC0x2000共八个扇区STC89C54RD+,STC89LE54RD+0x8000共五十八个扇区STC89C55RD+,STC89LE55RD+0x8000共五十八个扇区STC89C58RD+,STC89LE58RD+0x8000共五十八个扇区寄存器标识地址名称76543210初始值ISP_DATA0xE2ISP/IAP闪存数据寄存器11111111ISP_ADDRH0xE3ISP/IAP闪存地址高位00000000ISP_ADDRL0xE4ISP/IAP闪存地址低位00000000ISP_CMD0xE5ISP/IAP闪存命令寄存器MS2MS1MS0xxxxx000ISP_TRIG0xE6ISP/IAP闪存命令触发xxxxxxxxISP_CONTR0xE7ISP/IAP控制寄存器ISPENSWBSSWRSTWT2WT1WT000xx000B7B6B5B4B3B2B1B0命令/操作模式选择保留命令选择-----000待机模式,无ISP/IAP操作-----001对用户的应用程序Flash区及数据Flash区字节读-----010对用户的应用程序Flash区及数据Flash区字节编程-----011对用户的应用程序Flash区及数据Flash区扇区擦除ISP_CONTR:ISP/IAP控制寄存器。ISPEN:ISP/IAP功能允许位。0:禁止ISP/IAP编程改变Flash,1:允许编程改变FlashSWBS:软件选择从用户主程序区启动(0),还是从ISP程序区启动(1)。SWRST:0:不操作,1:产生软件系统复位,硬件自动清零。ISP_CONTR中的SWBS与SWRST这两个功能位,可以实现单片机的软件启动,并启动到ISP区或用户程序区,这在“STC单片机自动下载”一节,亦有所应用。如:ISP_CONTR=0x60?则可以实现从用户应用程序区软件复位到ISP程序区开始运行程序。ISP_CONTR=0x20?则可以实现从ISP程序区软件复位到用户应用程序区开始运行程序。用IAP向Flash中读写数据,是需要一定的读写时间的,读写数据命令发出后,要等待一段时间才可以读写成功。这个等待时间就是由WT2、WT1、WT0与晶体振荡器频率决定的。(以上的建议时钟是(WT2、WT1、WT0)取不同的值时的标称时钟,用户系统中的时钟不要过高,否则可能使操作不稳定。)#includereg52.h#includeeeprom.h//******************关闭ISP,IAP功能**************voidISP_IAP_Disable(void){ISP_CONTR=0x00;ISP_CMD=0X00;ISP_TRIG=0x00;EA=1;//开中断}//*******************字节读***************************ucharByte_read(uintbyte_addr){ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间ISP_CMD=Read_COM;//送字节读命令字ISP_ADDRH=(uchar)(byte_addr8);//送地址高字节ISP_ADDRL=(uchar)(byte_addr&0X00FF);//送地址低字节EA=0;//关中断ISP_TRIG=0X46;//送触发命令字0X46、0XB9ISP_TRIG=0XB9;_nop_();ISP_IAP_Disable();//关闭ISP/IAP功能EA=1;//开中断return((unsignedchar)ISP_DATA);}//********************字节编程***********************voidByte_program(uintbyte_addr,ucharisp_iap_data){ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间ISP_CMD=Prog_COM;//送字节编程命令字ISP_ADDRH=(uchar)(byte_addr8);//送地址高字节ISP_ADDRL=(uchar)(byte_addr&0X00FF);//送地址低字节ISP_DATA=isp_iap_data;//送数据进ISP_DATAEA=0;//关中断ISP_TRIG=0X46;//送触发命令字0X46、0XB9ISP_TRIG=0XB9;_nop_();ISP_IAP_Disable();//关闭ISP/IAP功能EA=1;//开中断}//*********************扇区擦除*********************voidSector_erase(uintsector_addr){ISP_CONTR=En_Wait_TIME;//开启ISP/IAP;并送等待时间//ISP_CONTR=0xc1;ISP_CMD=Dele_COM;//送扇区擦除命令字ISP_ADDRH=(uchar)(sector_addr8);//送地址高字节ISP_ADDRL=(uchar)(sector_addr&0X00FF);//送地址低字节EA=0;//关中断ISP_TRIG=0X46;//送触发命令字0X46、0XB9ISP_TRIG=0XB9;_nop_();ISP_IAP_Disable();//关闭ISP/IAP功能EA=1;}#ifndef_eeprom_h#define_eeprom_H//*********************EEPROM定义命令字节******************#defineRead_COM0X01//字节读数据存储区#defineProg_COM0X02//字节编程数据存储区#defineDele_COM0X03//扇区擦除数据存储区#defineEn_Wait_TIME0X81//设置等待时间,并使能ISP/IAP//从用户区启动程序//0X00==40MHZ以下,0X01==20MHZ以下//0X02==10MHZ以下,0X03==5MHZ以下,现在设置了20MHZ以下的,//#defineStart_ADDRH0X20//扇区地址高位,STC89C/LE52RC#defineStart_ADDRL0X00//扇区地址低位#endif注意了,要写数据时,一定要对该扇区先擦除后写数据的,所以要写的数据尽量不要多,也可以对不同功能的数据存在不同的扇区里。如:Sector_erase(0X2e00);//扇区擦除,第八个扇区Byte_program(0X2e00,Eeprom_ReadCode);//写EEPROM,保存可读命令要读数据时,就直接读就可以了。ReadData=Byte_read(0X2002);//读取该地址的数据读一个字节、编程一个字节、擦除一个扇区分别用时10us、60us、10ms关于STC系列51单片机的片内EEPROM应用(转载自虚V界的博客eeworld)(2011-12-1012:22:43)转载▼标签:stc内部eeprom杂谈分类:51EEPROM都知道,做单片机的都知道EEPROM是什么东西,或许一说到很多人都会想到24C02这片子,但这东西只有2K,而且与单片机分离的IC传输速度明显较慢。另外很多初学者可能认为数据就这么传进EEPROM就算是完成任务了,但实际EEPROM并不是这么用着的,以一片EEPROM资料称能存储10万次的算,假若程序设置的是一秒一次存储,3600S/h30个小时就做了108000次存储,基本达到报废这EEPROM的条件了。所以EEPROM一般是做存储的数据保存后,产品需要做断电存储的功能,这样才能实现再次启动产品后使用上一次状态中的数据。因此EEPROM的存储设定要有条件式的触发。在我最近做的一个小项目中,客户要求希望产品能在断电后的再次上电后做断电前的动作,这样断电便成了这个存储的触发条件,断电后的供电模式有两种一种是电池式供电,一种采用大电容供电。存储数据量小的话当然是电容供电的更好啦。然而这又会出现断电后的一个低压工作问题,一般5V单片机最低工作电压能有3.8左右。但EEPROM通常需要4.1V以上,这样片外存储的时间很可能会跟不上。如今单片机很多都集成了片内存储的EEPROM,存储速度远远高于片外存储十几倍,电容放电的瞬间完全可以胜任。网上实在太少这方面的资料和例子了,琢磨了一番STC的几个单片机后发现同一品牌的单片机内部EEPROM存储模式打进相同。在这我就放出一个STC单片机内部EEPROM的例子,童鞋们可以根据片内的寄存器与相应的控制位修改即可使用,强调这只能使用与STC的一部分单片机,主要有STC11FXX系列、STC10FXX系列、STC125AXX系列、STC89C5X系列.......其他的没试过,但只要对比资料结构大体相同都可使用。贴程序:我这是做成一个头文件方便使用的,以STC11F16XE为例#ifndef__EEPROM_H__#define__EEPROM_H__#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsfrISP_DATA=0XC2;sfrISP_ADDH=0XC3;sfrISP_ADDL=0XC4;sfrISP_CMD=0XC5;sfrISP_TRIG=0XC6;sfrISP_CONTR=0XC7;#defineRED_ISP0X01#defineWITE_ISP0x02#
本文标题:STC单片机EEPROM的应用和程序
链接地址:https://www.777doc.com/doc-2860772 .html