Stc单片机eeprom使用心得
- 格式:doc
- 大小:17.00 KB
- 文档页数:2
STC89C52内部EEPROM单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC 单片机中内置了EEPROM(其实是采用IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC 单片机内置EEPROM 及其使用方法。
STC 各型号单片机内置的EEPROM 的容量各有不同,见下表:(内部EEPROM 可以擦写100000 次以上)上面提到了IAP,它的意思是“在应用编程”,即在程序运行时程序存储器可由程序自身进行擦写。
正是是因为有了IAP,从而可以使单片机可以将数据写入到程序存储器中,使得数据如同烧入的程序一样,掉电不丢失。
当然写入数据的区域与程序存储区要分开来,以使程序不会遭到破坏。
要使用IAP 功能,与以下几个特殊功能寄存器相关:ISP_DA T A: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,STC89LE51RC 0x2000 共八个扇区STC89C52RC,STC89LE52RC 0x2000 共八个扇区STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区寄存器标识地址名称7 6 5 4 3 2 1 0 初始值ISP_DA TA 0xE2 ISP/IAP闪存数据寄存器11111111ISP_ADDRH 0xE3 ISP/IAP 闪存地址高位00000000ISP_ADDRL 0xE4 ISP/IAP 闪存地址低位00000000ISP_CMD 0xE5 ISP/IAP闪存命令寄存器MS2MS1 MS0 xxxxx000ISP_TRIG 0xE6 ISP/IAP 闪存命令触发xxxxxxxxISP_CONTR 0xE7 ISP/IAP 控制寄存器ISPEN SWBS SWRST WT2WT1 WT0 00xx000B7 B6 B5 B4 B3 B2 B1 B0 命令/操作模式选择保留命令选择-----0 0 0 待机模式,无ISP/IAP 操作-----0 0 1 对用户的应用程序Flash 区及数据Flash 区字节读-----0 1 0 对用户的应用程序Flash 区及数据Flash 区字节编程-----0 1 1 对用户的应用程序Flash 区及数据Flash 区扇区擦除ISP_CONTR:ISP/IAP 控制寄存器。
STC单片机内部EEPROM的应用(转)STC单片机内部EEPROM的应用(转)2008-05-18 02:47:27| 分类:AVR与C51单片机技| 标签:|字号大中小订阅STC单片机内部EEPROM的应用单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM或FLASHROM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC或SPI等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC单片机中内置了EEPROM(其实是采用IAP技术读写内部FLASH来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC单片机内置EEPROM及其使用方法。
STC各型号单片机内置的EEPROM的容量各有不同,见下表: 单片机芯片型号 起始地址 内置EEPROM容量(每扇区512字节)  STC89C51RC,STC89LE51RC 0x2000 共八个扇区 STC89C52RC,STC89LE52RC 0x2000 共八个扇区  STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区  STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区  STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区。
STC单片机AD转换及EEPROM使用STC单片机AD转换及EEPROM使用随着各种电子设备的普及,信号处理的重要性日益凸显。
而一款好的ADC (Analog to Digital Convertor) 和一个高效的存储平台EEPROM (Electrically Erasable Programmable Read-Only Memory) 就成为建立可靠稳定的信号处理系统的重要组成部分。
本文将讨论STC单片机如何进行AD转换及EEPROM的使用。
首先,AD转换是将模拟信号转换成数字量的过程,是建立信号处理系统的关键步骤之一。
STC单片机内置了一个12位的AD转换器,也就是说,它可以将模拟信号转换成一个12位的数字信号,这是非常精确的。
下面我们来看看如何在代码中使用AD转换。
AD转换的原理很简单,即将待转换的模拟信号输入到AD口,接着启动AD转换。
当转换结束后,检测转换结束标志位,然后将转换结果读出。
这里具体介绍一下代码的实现方法。
首先,需要定义AD口的引脚、参考电压及转换效率等参数。
代码如下:#define ADC_PIN 0x01 //定义AD口所连接的引脚为P1.1#define ADC_REF 0x80 //定义参考电压为内部参考电压#define ADC_MODE 0xC0 //定义转换效率为最快接着,需要配置AD口所连接的引脚,使其成为输入口。
代码如下:P1ASF = 0x02; //定义P1.1为AD口输入接下来,启动AD转换,等待转换结束标志位的出现。
代码如下:ADC_CONTR = ADC_REF | ADC_MODE | ADC_PIN; //配置AD口ADC_CONTR |= 0x08; //启动AD转换while (!(ADC_CONTR & 0x20)); //等待转换结束标志位最后,将AD转换结果读出。
代码如下:uint16_t value;value = ADC_RES;value |= ADC_RESL << 8;我们可以看到,在STC单片机中使用AD转换非常方便,只需要简单的几行代码就可以完成。
STC单片机EEPROM读写程序在单片机中,EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以用于存储数据,即使在断电情况下,数据也会被保留。
因此,掌握STC单片机的EEPROM读写程序对于开发嵌入式系统非常重要。
一、EEPROM简介EEPROM是一种可重复擦写的存储器,可用于存储小量数据。
与Flash存储器相比,EEPROM具有更快的写入和擦除速度。
在STC单片机中,EEPROM的存储容量通常较小,一般在几个字节到几千字节之间。
二、EEPROM读操作在STC单片机中,进行EEPROM读操作需要按照以下步骤进行:1. 初始化I2C总线:STC单片机使用I2C总线进行EEPROM读写操作,因此需要先初始化I2C总线。
通过设置相关寄存器,设置I2C 总线的速度和地址。
2. 发送设备地址:确定要读取的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要读取的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送读命令:向EEPROM发送读命令,以启动读操作。
5. 读取数据:从EEPROM中读取数据,并保存到变量中。
6. 结束读操作:完成读操作后,关闭I2C总线。
三、EEPROM写操作类似于读操作,进行EEPROM写操作也需要按照一定的步骤进行:1. 初始化I2C总线:同样地,首先需要初始化I2C总线。
2. 发送设备地址:确定要写入的EEPROM设备的地址,并发送到I2C总线。
3. 发送寄存器地址:确定要写入的EEPROM寄存器地址,并将其发送到I2C总线。
4. 发送写命令:向EEPROM发送写命令,以启动写操作。
5. 写入数据:将要写入EEPROM的数据发送到I2C总线。
6. 结束写操作:完成写操作后,关闭I2C总线。
四、注意事项在进行EEPROM读写操作时,需要注意以下几点:1. 确保正确的设备地址:要与EEPROM的地址匹配,否则无法进行有效的读写操作。
关于STC单片机EEPROM的应用总结关于STC单片机EEPROM的应用总结当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。
什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。
具有掉电数据不丢失的特点。
比如常用的24C系列,93C系列的器件。
一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。
这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。
STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。
EEPROM可分为若干个扇区,每个扇区包含512字节。
使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。
数据存储器的擦除操作是按扇区进行的。
在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。
在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。
以免发生数据错误。
应用的步骤1、声明与EEPROM相关的寄存器2、编写EEPROM初始化函数3、编写字节擦除函数4、编写字节编程函数5、编写字节读取函数6、在需要读取EEPROM字节内容时直接调用字节读取函7、在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。
与EEPROM应用相关的寄存器符号描述地址位地址及符号复位值IAP_DATAISP/IAP flash data register1111 1111BIAP_ADDRHISP/IAP flash address highC3H0000 0000BIAP_ADDRLISP/IAP flash address lowC4HIAP_CMDISP/IAP flash command register C5HMS1MS0IAP_TRIGISP/IAP flash command trigger C6HxxxxxxxxxBIAP_CONTRISP/IAP control registerC7HSWRSTCMD_FAILWT2WT1WT00000X000BPCONPower control87HSOMDSMOD0LVDFPOFGF1GF0PDIDL00110000B1、IAP_DATA:ISP/IAP数据寄存器ISP/IAP操作时的数据寄存器。
单片机STC89C52RC 内部EEPROM单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。
在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。
这样不光会增加开发成本,同时在程序开发上也要花更多的心思。
在STC 单片机中内置了EEPROM(其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。
下面就详细介绍STC 单片机内置EEPROM 及其使用方法STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的EEPROM 的速度快很多。
STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1,那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。
深入重点:�传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。
�STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。
�STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。
STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRLISP_TRIG、ISP_CMD、ISP_CONTR。
stc系列单片机eeprom操作前言: stc单片机在中国大陆在中低端市场中占有大半壁江山.片内EEPROM是掉电保存数据的最理想选择.stc单片机的片内eeprom以扇区为单位,每个扇区大小是512 字节.以下是我亲自编写的对stc单片机(89系列除外)操作子函数,可以模块化使用,欢迎电子爱好者与我多多交流.本人QQ704157083 tel :186******** .工作地点:深圳..南山区. 从事软件和电子这行,爱好交朋友,一起开发有创意的产品.过目请留言!----------------------------------------------------------------------------------------------------------------------//增加寄存器sfr IAP_CONTR =0xC7; // ;软复位寄存器sfr IAP_DATA =0xC2 ; //数据寄存器;寄存器的地址不能改sfr IAP_adrRH =0xC3; // 地址高8位寄存器sfr IAP_adrRL = 0xC4; //命令触发器sfr IAP_CMD=0xC5; //;命令寄存器sfr IAP_TRIG=0xC6; //;命令触发器//************************************************************* **************** ****//增加通用函数.//(1) eeprom 函数写一个数据eg1: rom_writearea(1,100,0x99,12); 在片区1 地址100 中写入0x99 晶振12M// 读一个数据: eg2: rom_readarea(1,100,12); 在片区1 地址100 中读出数据晶振12M// 写一个数组:eg3: rom_write_array(1,100,a,10,12); 在片区1,起始地址100, 写入数组a ,数组大小10,晶振12Mxdata char xram[512] ; // 定义一个备份片区的数组.rom_readbyte(unsigned int adr,unsigned char fso);rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso);void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso);void rom_clear(unsigned int adr,unsigned char fso) ;void iap_disable();void rom_writearea(unsigned int area,unsigned int adr,unsigned char dat,unsigned char fso); // 写之前备份,扇区地址,字节地址,数据内容void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso);choose_area(unsigned char area); //选择片区//^^^^^^^^^^^^^^^^^^^^^^^^rom_readbyte(unsigned int adr,unsigned char fso){DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X01; //;01h为读取命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;// a=IAP_DATA; //;获取数据iap_disable();return(IAP_DATA);}//^^^^^^^^^^^^^^^^^^^^^^^^rom_readarea(unsigned int area,unsigned int adr_toread,unsigned char fso){unsigned int adr ; //扇区首地址adr=choose_area(area);IAP_DATA= rom_readbyte(adr+adr_toread,fso);//读取数据return(IAP_DATA);}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_writebyte(unsigned int adr,unsigned char dat,unsigned char fso){DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X02; //;02h为写入命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位IAP_DATA=dat; //把数据放入数据寄存器中,用于写//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;iap_disable();}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_writearea(unsigned int area,unsigned int adr_towrite,unsigned char dat,unsigned char fso){unsigned int i,j ; //循环变量unsigned int adr ; //扇区首地址adr=choose_area(area);for (i=0;i<512;i++) //读扇区的所有数据,进行备份.{xram[i]=rom_readbyte(adr+i,fso);}rom_clear(area,fso); //清除要写入的扇区xram[adr_towrite]=dat ; //要写入的数据先放到数组中来for (j=0;j<512;j++) //将数组中的数据写入扇区中..{rom_writebyte(adr+j,xram[j],fso);}}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_write_array(unsigned int area,unsigned int adr_towrite,unsigned char *p,unsigned int num,unsigned char fso){unsigned int i,j ; //循环变量unsigned int adr ; //扇区首地址adr=choose_area(area);for (i=0;i<512;i++) //读扇区的所有数据,进行备份.xram[i]=rom_readbyte(adr+i,fso);}rom_clear(area,fso); //清除要写入的扇区for(i=0;i<num;i++)< p="">{xram[adr_towrite+i]=*(p+i); //将数组的内容写入备份数组XRAM中}for (j=0;j<512;j++) //将数组中的数据写入扇区中..{rom_writebyte(adr+j,xram[j],fso);}}//^^^^^^^^^^^^^^^^^^^^^^^^void rom_clear(unsigned int area,unsigned char fso) //清除一片扇区{unsigned int adr ; //扇区首地址adr=choose_area(area);DPH=adr>>8; //取高字节DPL=adr; //取低字节if(fso==6){IAP_CONTR=0X84 ;}else if(fso==12){IAP_CONTR=0X8B; //;,<=12m晶振固定写法允许改变rom <=6M IAP_CONTR=0X84}IAP_CMD=0X03; //;03h为擦除命令IAP_adrRH=DPH; //获取指针高八位IAP_adrRL=DPL; //获取指针低八位//EA=0;IAP_TRIG=0X5A; //两条触发命令,使命令执行IAP_TRIG=0XA5;iap_disable();}//^^^^^^^^^^^^^^^^^^^^^^^^void iap_disable() // 关闭iap编程{IAP_CONTR=0X00; //关闭rom控制器命令IAP_CMD=0X00; //清除读写擦命令choose_area(unsigned char area){unsigned int adr;switch (area) //扇区编号从1开始到16扇区. {case 1: adr=0x0000;break;case 2: adr=0x0200;break;case 3: adr=0x0400;break;case 4: adr=0x0600;break;case 5: adr=0x0800;break;case 6: adr=0x0A00;break;case 7: adr=0x0C00;break;case 8: adr=0x0E00;break;case 9: adr=0x1000;break;case 10: adr=0x1200;break;case 11: adr=0x1400;break;case 12: adr=0x1600;break;case 13: adr=0x1800;break;case 14: adr=0x1A00;break;case 15: adr=0x1C00;break;case 16: adr=0x1E00;break;}return (adr);}//**********************************************************en d</num;i++)<>。
51单片机学习心得以下为本人学习51内核的个人心得,并且表达能力不是很好,若各路高手发现小弟说的不对的地方,请多指教!为什么要用51单片机,51到现在算衰落的产品,但是它还是有很大的市场,这是为什么?用性价比来说这个问题。
一套产品用1块钱能解决的问题如果搞成10块,在批量生产10W套后,你看看能节约到少MONEY.本人是用keil来学习51单片机的,现在就利用KEIL2编程心得。
个人还是想说一句话:成才主在己,有难先网络。
师傅再强自己不下工夫是不能成功的,别人自学也能成才。
并且基本上我们能遇到的方向性问题网上基本都有答案了。
为什么说方向性的问题呢?比如:你可以在网上问如何做饭,但是你不能问:为什么我的饭做得不好吃。
很多51单片机是没有在线仿真的,这样就需要我们想方设法做调试,指示灯,蜂鸣器,串口等等。
可以通过串口发送一些内容到上位机便于观察。
当然串口还是没有仿真器实在,比如:Unsignedchar a,b。
//我想将A左移8位后加上b得到一个16进制的数。
这是针对于c语言问题。
Unsignedshort c。
A=0xaa。
b=0xbb。
C=(Unsignedshort)a<<8+b。
请问C的值是多少?对于新手来说可能会犯的错误,可能我们会答成0xaabb。
其实并不是这样的,<<要比+的优先级低。
所以正确的写法为c=(Unsignedshort)((a<<8)+b)。
这种情况下没用用仿真器来看,经验不足是很难发现这段代码有问题的。
If(0x50&0xf0==0x50),请问该语句为真还是为假?还是优先级问题。
在不确认优先级的情况下,大家一定要知道:()优先级是最高的。
附录2 C语言中的运算符及其优先级以下问题:Unsigned char a,b。
Float c。
A=0xea。
B=0x60。
C=(float)(a*256+b)/100;C=600?还是-55.35取决于单片机内部计算方式但是C=(float)(usigned short)(a*256+b)/100;一定是600。
关于EEPROM的应用总结关于EEPROM的应用总结当在程序运行的过程中你希望修改某个变量并且此变量的值在掉电以后不丢失,那么你就可以采用将变量数据写入EEPROM的方式来实现。
什么是EEPROM,即Electrically Erasable ProgrammableRead_Only Memory首先它是一种存储器,并且可以通过高电压来进行反复擦写的存储器。
具有掉电数据不丢失的特点。
比如常用的24C系列,93C系列的器件。
一般这种器件采用I2C的方式与单片机进行通讯,对于这种通讯方式及器件的应用另作总结。
这里主要总结一下,STC12C5204AD芯片内部包含的EEPROM的应用方法。
STC12C5201AD系列单片机内部集成了EEPROM是与程序空间分开的,利用ISP/IAP技术可将内部data flash当EEPROM,擦写10万次以上。
EEPROM可分为若干个扇区,每个扇区包含512字节。
使用时建议同一次修改的数据放在同一个扇区,不是同一次修改的数据放在不同的扇区,不一定要用满。
数据存储器的擦除操作是按扇区进行的。
在程序中可对EEPROM进行字节读写/字节编程/扇区擦除操作。
在工作电压Vcc偏低时,建议不要进行EEPROM/IAP操作。
以免发生数据错误。
应用的步骤1、声明与EEPROM相关的寄存器2、编写EEPROM初始化函数3、编写字节擦除函数4、编写字节编程函数5、编写字节读取函数6、在需要读取EEPROM字节内容时直接调用字节读取函数即可7、在需要进行写EEPROM字节时,先调用字节擦除函数,将字节内容擦除成FFH后,在调用字节编程函数,将数据写入到EEPROM的地址单元中。
与EEPROM应用相关的寄存器符号描述地位地址及符号复位值址IAP_DATA ISP/IAP flash dataregisterC2H11111111BIAP_AD DRH ISP/IAP flashaddress highC3H00000000BIAP_AD DRL ISP/IAP flashaddress lowC4HIAP_CMDISP/IAP flashcommand registerC5HMS1MSIAP_TRIGISP/IAP flashcommand triggerC6HxxxxxxxxxBIAP_CO NTR ISP/IAP controlregisterC7HIAPENSWBS SWRSTCMD_FAILWT2WT1WT0000X000BPCON Power control87H SOMDSMOD0LVDFPOFGF1GFPDIDL00110000B1、IAP_DATA:ISP/IAP数据寄存器ISP/IAP操作时的数据寄存器。
STC单片机片内大容量EEPROM的一种巧妙应用作者:单片机与…文章来源:单片机与嵌入式系统应用点击数:98 更新时间:2009-9-4保定莱特整流器制造有限公司张志忠华北电力大学侯纪勇秦皇岛首钢板材有限公司崔娜引言MCS-51单片机是目前国内应用最广泛的一种单片机型。
全球各单片机生产厂商在MCS-51内核基础上,派生了大量的51内核系列单片机,极大地丰富了MCS-51的种群。
其中STC公司推出了STC89系列单片机,增加了大量新功能,提高了51的性能,是MCS-51家族中的佼佼者。
早期的单片机控制系统,采用单片机加片外EEPROM配合,来存储一些需要预置的重要参数,并在数码管上显示出来。
由于单片机控制的整流器要求实时性很强,而早期EEPROM的写周期在10 ms左右,因此运行参数的预置是在整流器待机的情况下进行的。
而很多情况下需要在运行的同时记录数据,如用单片机控制的12脉波汽车电泳整流器要求在运行的同时实时记录重要数据,而且在掉电时不丢失。
由于在12脉波整流器中运行的单片机程序,其周期必须小于1.67 ms(交流电网的1个周期是20 ms,除以12就是l_67 ms),这就要求实时记录的时间在1 ms以下甚至更短(考虑到程序的执行时间)。
经查阅资料发现,目前很多EEPROM达不到这个要求[1],即使时间最短的AT89S8252单片机片内。
EEP-ROM的写周期也是2.5 ms。
本文通过对EEPROM的巧妙应用,实现了整流器在线记录数据的功能。
1 寻找符合要求的单片机设备使用的是Atmel公司的AT89C52(40DIP封装)单片机和EEPROM芯片2817A。
要想在不改变原设备电路板的情况下完成要求的功能,就只能在兼容的MCS-51系列单片机中想办法。
AT89S8252片内含有2 K B的EEPROM,经编程测试发现,它虽然能实时记录数据并且断电不丢失,但是在向片内EEPROM中记录1个数据时,能引起输出电压和电流的波动,不能满足实际运行的需要。
#include<stc12c5410ad.h>//到宏晶网站下载头文件或自己在现有的头文件上加上相应的寄存器定义即可。
#include<intrins.h>#define uchar unsigned char#define uint unsigned int/****************uart init***********/void UART_inti(void){AUXR=0x40;//定时器1速度是普通8051的12倍,不分频TMOD=0x20;//定时器1工作在方式2,用来产生波特率SCON=0x50;//串口工作在方式1,允许接收TL1=0xF7;//波特率为38400;FB为115200TH1=0xF7;PCON=0x00;//SMOD=0TR1=1; //产生波特率}void ISP_write(uint ISP_addr,uchar ISP_data)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{ISP_DATA=ISP_data; //送数据ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME ISP_CMD=2;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待写入ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;}uchar ISP_read(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{uchar recivedata;ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIME ISP_CMD=1;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待读recivedata=ISP_DATA;ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;return recivedata;}void ISP_erase(uint ISP_addr)//stc12c5404启始地址2800h ;IAP_CMD 1读,2写,3擦除{ISP_ADDRL=ISP_addr%256;ISP_ADDRH=ISP_addr/256;//送高低地址ISP_CONTR=0x83;//IAP ENABLE ,SET CPU WAIT TIMEISP_CMD=3;//写字节模式ISP_TRIG=0x46;ISP_TRIG=0xB9;//触发启动ISP_nop_();//等待擦除ISP_CONTR=0x00;//禁止ISP/IAp操作ISP_CMD=0;ISP_TRIG=0x00;}//主程序只为测试时随意编写的,可以根据需要做相应的修改即可。
STC51单片机EEPROM的使用方法STC51单片机有类似flash的功能EEPROM,可以掉电保存数据,不同型号的可以保存不同大小的数据,以12C5A60S2为例,EEPROM的大小为2K,分为两个扇区,掉电保存在很多地方需要。
首先寄存器的问题,不同系列的STC单片机的与EEPROM有关的寄存器不同,比如10/11/12系列的sfr ISP_DATA = 0xC2;sfr ISP_ADDRH = 0xC3;sfr ISP_ADDRL = 0xC4;sfr ISP_CMD = 0xC5;sfr ISP_TRIG = 0xC6;sfr ISP_CONTR = 0xC7;89/90系列的sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;注意寄存器一定要按数据手册中的配置,ISP触发命令也不相同,详情请看下方代码其次是关于扇区问题,不同型号的MCU扇区个数不尽相同,详情请查询数据手册,在这里我以12C5A60S2为例,一共2扇区,每扇区512B,地址区间为0x0000~0x03FF,使用时请勿超出范围。
EEPROM使用时有三个功能,分别为读、写、和擦除,由ISP_CMD寄存器控制,分别对应1/2/3下面为此项内容的代码部分,分别为初始化、读、擦除和写,本程序为11.0592MHz晶振,STC12C5A60S2的MCU,以下程序测试可用EEPROM.cvoid DisableEEPROM(void){ISP_CONTR = 0;//禁止ISP/IAP操作ISP_CMD = 0;//去除ISP/IAP命令ISP_TRIG = 0;//防止ISP/IAP命令误触发ISP_ADDRH = 0xff;//指向非EEPROM区,防止误操作ISP_ADDRL = 0xff;//指向非EEPROM区,防止误操作。
Stc单片机eeprom使用心得
STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。
涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。
在STC单片机使用手册中,作者分别将它们定义为:
一、IAP_DATA(E2H)
二、IAP_ADDRH(E3H)
三、IAP_ADDRL(E4H)
四、IAP_CMD(E5H)
五、IAP_TRIG(E6H)
六、IAP_CONTR(E7H)
本人认为,手册中给每个地址单元定义的英文词组太长,而且有点哆嗦,占的篇幅又大,感觉对正常阅读和理解产生了一定的干扰,反倒不好了解作者的意图了,还不如让使用者自己定义为好。
我自己对这些单元分别定义为DA T ADDRH ADDRL CMD TRIG CONTR。
一、DAT(E2H)从EEPROM中读取到的数据首先进入这里。
要把数据写入EEPROM中,也要把数据放到这个单元中。
也就是说,这个单元起到了中转站的作用,写入和读出都要通过这个单元。
二、ADDRH、ADDRL分别是EEPROM地址单元高8位和低8位。
如要把数据存储到1000H 单元中,那么在程序中,ADDRH的数值为10H,ADDRL的数值为00H。
三、CMD表示操作类型。
数值为1是读,数值为2是写,数值为3是擦除。
简单点说,就是“1读2写3擦除”。
四、CONTR寄存器,说明书上作了好多功能表述,但对于一般使用者来说,寄存器的前5位可以不作过多了解,只要掌握后3位意义就可以了。
一般理解为,选择好后3位的数值,为的是确保在不同数值晶振下正确读写擦除EEPROM。
考虑到TRIG这个寄存器的要求,一般使用时,可将前5位设置为10000,后3位根据不同晶振频率来确定(这个见使用手册)。
五、TRIG这个寄存器,看了好长时间手册才了解它的一般使用,对这个寄存器理解应当放到最后。
说明书是这样写的:为isp/iap操作时的命令模式寄存器。
在ispen(isp_contr.7)=1时,对isp_trig先写入46h,再写入b9h,isp/iap命令才会生效。
其实也可以这样理解,当选择好EEPROM地址单元,选择好操作类型,以及在写入状态时准备好写入数据后,先向该寄存器送入46H数据,之后再向该寄存器送入B9H数值。
EEPROM的读、写、擦除就完成了。
以上是本人对STC单片机的EEPROM使用的一些心得,若有不当或错误之处,请高手多多批评指正。
本人常用的STC_EEPROM基本操作程序
dat equ 0e2h
drh equ 0e3h
drl equ 0e4h
cmd equ 0e5h
trig equ 0e6h
contr equ 0e7h
;---------读取1个字节-------------------
read: mov drh,#10h ;设定存储单元地址高四位这里设1000h,也可选用其他单元
mov drl,#00h ;设定存储单元地址低四位
mov cmd,#01h ;设定读操作
mov contr,#84h ;设定操作时间
mov trig,#046h ;准备触发
mov trig,#0b9h ;触发
mov r0,dat ;读数据。
r0为读出的数据,也可以选用其他单元
nop
nop
ret
;---------写入1个字节-------------------
write: mov dat,r0 ;写数据。
r0中为准备写入的数据,也可以选用其他单元
mov drh,#10h ;设定存储单元地址高四位这里设1000h,也可选用其他单元
mov drl,#00h ;设定存储单元地址低四位
mov cmd,#02h ;设定写操作
mov contr,#84h ;设定操作时间
mov trig,#046h ;准备触发
mov trig,#0b9h ;触发
nop
nop
ret
;---------擦除1个字节-------------------
clear: mov drh,#10h ;设定存储单元地址高四位这里设1000h,也可选用其他单元可组成子程序,进行调用
mov drl,#00h ;设定存储单元地址低四位
mov cmd,#03h ;设定擦除操作
mov contr,#84h ;设定操作时间
mov trig,#046h ;准备触发
mov trig,#0b9h ;触发
nop
nop
ret
;=========关闭EEPROM====================
off: mov drh,#00h
mov drl,#00h
mov cmd,#00h
mov contr,#00h
mov trig,#00h
ret。