内部EEROM操作程序

合集下载

stc单片机eeprom读写程序

stc单片机eeprom读写程序

stc单片机eeprom读写程序以下是STC单片机使用EEPROM进行读写的示例程序:#include <reg52.h>#include <intrins.h>#define EEPROM_ADDR 0xA0 // EEPROM的I2C地址sbit SDA = P2^0; // I2C的数据线sbit SCL = P2^1; // I2C的时钟线// I2C开始信号void I2C_Start(){SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 0;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C停止信号void I2C_Stop(){SDA = 0;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SDA = 1;_nop_(); // 延时一段时间}// I2C发送一个字节的数据void I2C_SendByte(unsigned char dat){unsigned char i;for (i = 0; i < 8; i++){SDA = dat & 0x80; // 获取最高位dat <<= 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}SDA = 1;_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间SCL = 0;_nop_(); // 延时一段时间}// I2C接收一个字节的数据unsigned char I2C_ReceiveByte(){unsigned char i, dat = 0;SDA = 1;for (i = 0; i < 8; i++){_nop_(); // 延时一段时间SCL = 1;_nop_(); // 延时一段时间dat <<= 1;dat |= SDA;SCL = 0;}return dat;}// 在EEPROM中写入一个字节的数据void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令I2C_SendByte(addr); // 发送地址I2C_SendByte(dat); // 发送数据I2C_Stop();}// 从EEPROM中读取一个字节的数据unsigned char EEPROM_ReadByte(unsigned char addr){unsigned char dat;I2C_Start();I2C_SendByte(EEPROM_ADDR | 0); // 发送写入指令 I2C_SendByte(addr); // 发送地址I2C_Start();I2C_SendByte(EEPROM_ADDR | 1); // 发送读取指令 dat = I2C_ReceiveByte(); // 读取数据I2C_Stop();return dat;}。

eeprom读写程序详解

eeprom读写程序详解

eeprom读写程序详解EEPROM(Electrically Erasable Programmable Read-Only Memory) 是一种可编程只读存储器,可以在电信号的作用下进行擦写和改写。

它通常用于存储单片机或其他嵌入式系统中的数据、设置参数、配置文件等。

对于 EEPROM 的读写程序,需要考虑以下几个方面:1. 读操作:读操作通常包括以下步骤:- 等待上次读操作完成。

- 获取要读取的数据的单元地址。

- 将 EEPGD 位和 CFGS 位清零。

- 启动读操作控制位 RD。

- 等待本次读操作完成。

- 将该单元地址中对应的数据返回。

在读取 EEPROM 数据时,为了避免芯片在一瞬间无法获取到数据,需要给芯片一定的时间来稳定获取数据。

因此,在读取操作中需要加入等待步骤。

2. 写操作:写操作通常包括以下步骤:- 等待上次写操作完成。

- 获取要写的数据的单元地址。

- 将要写的数据写入 EEPROM 的单元中。

- 将 EEPGD 位和 CFGS 位清零。

- 启动写操作控制位 WP。

- 等待写操作完成。

在写操作中,为了确保数据的可靠性,需要将要写的数据写入EEPROM 的单元中,并等待写操作完成。

同时,在写操作过程中,需要注意避免对无关的单元进行写操作,以免损坏 EEPROM 芯片。

3. 中断处理:在 EEPROM 的读写操作中,通常需要加入中断处理机制,以便在读写过程中及时响应和处理异常情况。

例如,在读取 EEPROM 数据时,如果 EEPROM 芯片出现故障,可能会导致读取失败。

为了避免这种情况,可以在读取操作中加入中断处理机制,在读取失败时及时报警或采取相应的应对措施。

总之,EEPROM 读写程序的实现需要考虑多个方面的因素,包括读操作、写操作、中断处理等。

同时,需要考虑 EEPROM 芯片的特性和限制,以便实现高效、稳定、可靠的 EEPROM 读写操作。

STC89C52单片机内部EEPROM保存数据的应用例子程序

STC89C52单片机内部EEPROM保存数据的应用例子程序

STC89C52单片机内部EEPROM保存数据的应用例子程序STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。

知识点:ISP与IAP介绍ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。

比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。

IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。

通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。

这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。

大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。

STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。

每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。

下面通过一个例子来讲解STC系列单片机EEPROM的具体用法。

【例】:在TX-1C实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。

24C01-24C256共9种EEPROM的字节读写操作程序

24C01-24C256共9种EEPROM的字节读写操作程序

24C01-24C256共9种EEPROM的字节读写操作程序一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为读写数据缓冲区指针,进行读写的字节数,EEPROM首址,EEPROM控制字节,以及EEPROM类型。

此程序结构性良好,具有极好的容错性,程序机器码也不多:#pragma ot(6,SIZE)#include#include#define ERRORCOUNT 10sbit SDA=P0^0;sbit SCL=P0^1;enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M 24256};enum eepromtype EepromType;//DataBuff为读写数据输入/输出缓冲区的首址//ByteQuantity 为要读写数据的字节数量//Address 为EEPROM的片内地址//ControlByte 为EEPROM的控制字节,具体形式为(1)(0)(1)(0)(A2)(A1)(A0)(R/W),其中R/W=1,//表示读操作,R/W=0为写操作,A2,A1,A0为EEPROM的页选或片选地址;//EepromType为枚举变量,需为M2401至M24256中的一种,分别对应24C01至24C256;//函数返回值为一个位变量,若返回1表示此次操作失效,0表示操作成功;//ERRORCOUNT为允许最大次数,若出现ERRORCOUNT次操作失效后,则函数中止操作,并返回1//SDA和SCL由用户自定义,这里暂定义为P0^0和P0^1;//其余的用户不用管,只要把只子程序放在你的程序中并调用它就可以了;/************************************************************** *********************/bit RW24XX(unsigned char *DataBuff,unsigned char ByteQuantity,unsigned int Address,unsigned char ControlByte,enum eepromtype EepromType) {void Delay(unsigned char DelayCount);void IICStart(void);void IICStop(void);bit IICRecAck(void);void IICNoAck(void);void IICAck(void);unsigned char IICReceiveByte(void);void IICSendByte(unsigned char sendbyte);unsigned char data j,i=ERRORCOUNT;bit errorflag=1;while(i--){IICStart();IICSendByte(ControlByte&0xfe);if(IICRecAck())continue;if(EepromType>M2416){IICSendByte((unsigned char)(Address>>8)); if(IICRecAck())continue;}IICSendByte((unsigned char)Address);if(IICRecAck())continue;if(!(ControlByte&0x01)){j=ByteQuantity;errorflag=0; //********clr errorflagwhile(j--){IICSendByte(*DataBuff++);if(!IICRecAck())continue;errorflag=1;break;}if(errorflag==1)continue;break;}else{IICStart();IICSendByte(ControlByte);if(IICRecAck())continue;while(--ByteQuantity){*DataBuff++=IICReceiveByte();IICAck();}*DataBuff=IICReceiveByte(); //read last byte data IICNoAck();errorflag=0;break;}}IICStop();if(!(ControlByte&0x01)){Delay(255);Delay(255);Delay(255);Delay(255);}return(errorflag);}/*****************以下是对IIC总线的操作子程序***//*****************启动总线**********************/ void IICStart(void){SCL=0; //SDA=1;SCL=1;_nop_();_nop_();_nop_();SDA=0;_nop_();_nop_();_nop_();_nop_();SCL=0;SDA=1; //}/*****************停止IIC总线****************/ void IICStop(void){SCL=0;SDA=0;SCL=1;_nop_();_nop_();_nop_();SDA=1;_nop_();_nop_();SCL=0;}/**************检查应答位*******************/bit IICRecAck(void){SCL=0;SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();CY=SDA; //因为返回值总是放在CY中的SCL=0;return(CY);}/***************对IIC总线产生应答*******************/ void IICACK(void){SDA=0;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;_nop_();}/*****************不对IIC总线产生应答***************/void IICNoAck(void){SDA=1;SCL=1;_nop_();_nop_();_nop_();_nop_();SCL=0;}/*******************向IIC总线写数据*********************/void IICSendByte(unsigned char sendbyte){unsigned char data j=8;for(;j>0;j--){SCL=0;sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;SDA=CY;SCL=1;}SCL=0;}/**********************从IIC总线上读数据子程序**********/ unsigned char IICReceiveByte(void){register receivebyte,i=8;SCL=0;while(i--){SCL=1;receivebyte=(receivebyte<<1)|SDA;SCL=0;}return(receivebyte);}/***************一个简单延时程序************************/ void Delay(unsigned char DelayCount){while(DelayCount--);}。

STC单片机EEPROM读写程序

STC单片机EEPROM读写程序

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的地址匹配,否则无法进行有效的读写操作。

stc89le52rc内部EEPROM的C51读写程序

stc89le52rc内部EEPROM的C51读写程序

stc89le52rc内部EEPROM的C51读写程序/*stc89le52rc内部EEPROM的C51读写程序串口命令(9600)1.0x35可以写eeprom第一个字节数据0x0c2.0x34可以使用检查eeprom第一个字节的数据,正确就会反馈一串字符3.0x33可以读取eeprom前256个字节数据*/#include<math.h>#include<stdio.h>#include<reg52.h>#include <intrins.h>#define NOP5 _nop_();_nop_();_nop_(); _nop_();_nop_();#define uchar unsigned char#define uint unsigned intsfr AUXR = 0x8e;sfr AUXR1 = 0xa2;sfr P4 = 0xe8;sfr XICON = 0xc0;sfr IPH = 0xb7;sfr WDT_CONTR = 0xe1;sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;#define ENABLE_ISP 0x81 //小于20MHZ使用#define DATA_FLASH_START_ADDR 0x2000//stc89le52rc eeprom起始地址#define TEST_CODE 0x34uchar code start_string[]={"EEPROM first data correct!\n"};uint i=0,k;uchar EEPROM_READ(uint flash_addres);void IAP_disable();void EEPROM_FORMAT(uint flash_addres);void EEPROM_WRITE(uint flash_addres, isp_data);void test_read();void send_byte(uchar bt);void send_string(uchar *ptr, uchar len);void read_string(uint start_addr,uint num);void read_string(uint start_addr, uint num){static uint j,temp;for(j=0;j<num;j++){temp=EEPROM_READ(start_addr+j);NOP5;send_byte(temp);}}void send_string(uchar * ptr, uchar len){static uint j;for(j=0;j<len;j++){send_byte(*(ptr+j));}void send_byte(uchar by){SBUF=by;while(!TI);TI=0;}void IAP_disable(){ISP_CONTR=0;ISP_CMD=0;ISP_TRIG=0;}uchar EEPROM_READ(uint flash_addres) //读取数据{uchar read;ISP_ADDRH=flash_addres>>8;ISP_ADDRL=flash_addres;ISP_CONTR=ENABLE_ISP;ISP_CMD=0x01 ;EA=0;ISP_TRIG=0x46;ISP_TRIG=0xb9 ;NOP5;read=ISP_DATA;IAP_disable();EA=1;return(ISP_DATA);}void EEPROM_WRITE(uint flash_addres,isp_data) //写入数据ISP_ADDRH=flash_addres>>8;ISP_ADDRL=flash_addres;ISP_CONTR=ENABLE_ISP;ISP_CMD=0x02 ;EA=0;ISP_DATA=isp_data;ISP_TRIG=0x46;ISP_TRIG=0xb9;IAP_disable();EA=1;}void EEPROM_FORMAT(uint flash_addres) //擦除{ISP_ADDRH=flash_addres>>8;ISP_ADDRL=flash_addres;ISP_CONTR=ENABLE_ISP;ISP_CMD=0x03;EA=0;ISP_TRIG=0x46;ISP_TRIG=0xb9;IAP_disable();EA=1;}void test_read(){if(RI){RI=0;switch(SBUF)case 0x34:k=EEPROM_READ(DATA_FLASH_START_ADDR);NOP5;if(0x0c==k){send_string(start_string,sizeof(start_string));}send_byte(k);k=0;break;case 0x33:read_string(DATA_FLASH_START_ADDR, 256);break;case 0x35:EEPROM_FORMAT(DATA_FLASH_START_ADDR); //写已经有数据的扇区前要写擦除NOP5;NOP5;NOP5; //可以适当增减延时NOP5;NOP5;NOP5;NOP5;EEPROM_WRITE(DATA_FLASH_START_ADDR,TEST_CODE);//写一个0x0cbreak;default:if(0xff==i)i=0;}k=EEPROM_READ(DATA_FLASH_START_ADDR+(i++)); send_byte(DATA_FLASH_START_ADDR+i);send_byte(k);k=0;break;}}}void init(){TMOD=0x20;SCON=0x50;TL1=0xfd;TH1=0xfd;TR1=1;ET1=1;ES=1;}void main(){init();while(1){test_read();}}。

STC60S2内部EEPROM程序

入口参数:unsigned int addr擦除扇区的首地址
出口参数:无
**********************************************/
void Erase_Sector(unsigned int addr)
{
ISP_CONTR = WAIT_TIME_20MHz|0x80;
调试环境:keil 3.0
/************************************************/
#include<reg52.h>
#include<STC12ROM.h>
#define uchar unsigned char
#define uint unsigned int
擦除速度:晶振为40MHz、20MHz、10MHz、5MHz,分别为0、1、2、3
***********************************************************/
#include<reg52.h>
sfr ISP_DATA = 0xC2; /* FLASH EEPROM数据寄存器*/
void Enable_IAP()
{
EA = 0;
ISP_TRIG = 0x5A; // Enable FLASH EEPROM
ISP_TRIG = 0xA5;
EA = 1;
}
/******************************************************
子程序名:void Disable_IAP()
void write_Byte(unsigned int addr,unsigned char ch)

学习笔记之内部eeprom读写


程序修改后重新编译下载到单片机后, 打开串口调试助手, 肯定会发现什么数据都没有, 别急, 重新按下单片机的复位键就可以看到数据了。 因为在主程序中发送数据的指令只执行 了一次, 速度很快, 在你打开串口调试助手前就已经过去了, 因此需复位一下才能看到现象。 现象如下图所示:
读回的数据分别是 00,01,02,03,04,05,06,07,08,09,发现和写入的数据是相同的,那么说 明成功的对 eeprom 进行了读写操作。 只要会了这两个最基本的读写操作,那么 Atmega16 内部的 512 字节的 eeprom 空间就 可以为你所用了。
AVR 学习笔记之内部 EEPROM 读写
AVR 单片机的多数型保存的数据。 Atmega16 内置的 EEPROM 的容量是 512 字节, 可以重复擦写的次数 是 10 万次。
AVRGCC 自带的 EEPROM 读写函数可对 Atmega16 内部的 EEPROM 进行读写操作。如果要使用 AVRGCC 中自带的 EEPROM 读写函数,首先要在程序中包含#include<avr/eeprom.h>这个头文件。 AVRGCC 内置 EEPROM 访问函数库如下: (1)void eeprom_read_block(void *buf, unsigned int addr, size_t n):从 EEPROM 的 addr 地址
} void usart_init() { UCSRA=0X00; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//写 UCSRC, 异步操作, 禁止奇偶校验, 停止位数为 1,8 位字符长度 UBRRH=(F_CPU/BAUD/16-1)/256;//波特率高 4 位 UBRRL=(F_CPU/BAUD/16-1)%256;//波特率低 8 位 UCSRB|=(1<<TXEN);//使能发送,使能接收,使能接受中断 } void usart_put_char(unsigned char TX_data)//发送一个字节的数据 { while(!(UCSRA&(1<<UDRE)));//检测 UDRE 是否为 1, 只有在 UDRE 为 1 的情况下, 才 能向缓冲器 UDR 中写入数据。 UDR=TX_data; } int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++)eeprom_write_byte(i,i); while(1); } 上段程序是对 EEPROM 进行写操作,通过 for(i=0;i<10;i++)eeprom_write_byte(i,i);这段 程序实现的是在地址 0—9 分别写数据 0—9。 那么怎么知道我数据是否成功写入了呢?下面 还要进行读操作,作用是把刚才写入的数据读出来,看看是否和写入的一样,只需要修改主 程序即可。修改后的代码如下: int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++) usart_put_char(eeprom_read_byte(i)); while(1); }

51单片机读写内部EEPROM详解

此文档共包含三个程序。

第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了。

第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。

第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内部EEPROM 过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。

验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机内部EEPROM。

程序1:/***************************************************************作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:Keil uVision4 V9.00***************************************************************///#include <STC89C52RC.H>#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/****************特殊功能寄存器声明****************/sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;sbit LED1 = P2^0;sbit LED2 = P2^1;sbit K1 = P3^2; //按钮1sbit K2 = P3^3; //按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*void main(void){uchar V;V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V == 2) {LED1=0;LED2=1;}else if(V == 6){LED1=0;LED2=0;}while(1){if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,2); // 对EEPROM区2002h写入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,6); // 对EEPROM区2002h写入6}}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void cc(uint addr){// 打开IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M) ISP_CONTR = 0x81;ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。

eeprom使用的流程

EEPROM使用的流程1. 简介EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种特殊的非易失性存储器,可以通过电子擦除的方式对其中的数据进行修改。

EEPROM 的使用可以在许多应用中存储重要的配置信息或用户数据,并在需要时进行读取、修改和擦除。

2. EEPROM流程概述使用EEPROM时,通常需要遵循以下基本流程:1.初始化EEPROM2.写入数据到EEPROM3.从EEPROM中读取数据4.擦除EEPROM中的数据下面将详细介绍每个流程的步骤和注意事项。

3. 初始化EEPROM在使用EEPROM之前,需要对其进行初始化。

初始化的过程可以包括确定EEPROM的地址、设置相关的控制寄存器等操作。

以下是初始化EEPROM的一般步骤:•确定EEPROM的地址:根据硬件设计和连线的方式,确定EEPROM 的地址。

通常情况下,EEPROM都会有一个唯一的I2C地址,可以通过连接敏感引脚或编程进行设置。

•设置控制寄存器:根据EEPROM的型号和规格,设置相关的控制寄存器。

这些寄存器可以包括写使能、擦除使能、写保护等设置。

根据具体的硬件平台和开发工具,设置方法可能会有所不同。

•验证初始化:在进行后续的写入和读取操作之前,需要验证EEPROM的初始化是否成功。

这可以通过读取控制寄存器的值或执行简单的读取操作来实现。

4. 写入数据到EEPROM一旦EEPROM初始化完成,可以开始向其中写入数据了。

写入数据到EEPROM通常需要注意以下几个步骤:•选择写入的地址:根据EEPROM的规格和需求,选择要写入数据的地址。

EEPROM通常被分为多个字节或页面,每个页面都有其唯一的地址。

•编写写入算法:根据需要,编写适合特定EEPROM型号的写入算法。

这些算法可能包括将数据按字节或页面写入EEPROM、校验写入的数据等操作。

根据具体的硬件平台和开发工具,写入算法可能会有所不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "STC89C51RC_RD_PLUS.H"
code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff}; //共阳数码管段码
void eeprom_eares(unsigned int addres)//扇区擦除。

{unsigned i;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
//ISP_CONTR=0x01;
//ISP_CONTR=ISP_CONTR|0x80; //设时间与充ISP操作。

ISP_CONTR=0x83; //命令寄存器1000 0011
ISP_CMD=0x03; //扇区命命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。

for(i=0;i<3;i++);
//ISP_ADDRL=0xff;
//ISP_ADDRH=0xff;
ISP_ADDRL=0x00;//
ISP_ADDRH=0x00;//
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
void eeprom_write(unsigned int addres,unsigned char write_data)//写数据。

{unsigned char i;
ISP_DATA=write_data; //要写入的数据。

ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x80; //设时间与充ISP操作。

ISP_CMD=0x02; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动?
for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
}
unsigned char eeprom_read(unsigned int addres)
{unsigned char i,z;
ISP_ADDRL=addres; //低位地址
ISP_ADDRH=addres>>8; //高位地址
ISP_CONTR=0x01;
ISP_CONTR=ISP_CONTR|0x80; //设时间与充ISP操作。

ISP_CMD=0x01; //写命令
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动。

for(i=0;i<3;i++);
ISP_ADDRL=0xff;
ISP_ADDRH=0xff;
ISP_CONTR=0x00;
ISP_CMD=0x00;
ISP_TRIG=0x00;
z=ISP_DATA;
return(z);
}
void mdelay(unsigned char delaytime)
{
while(--delaytime);
}
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--); //延时124*8+10=1002us
}
void LED_display(int date) //显示4位数
{
P0=0xfe; //P0.0=0,选通第一位
P2=seg7code[date/1000]; //取出千位,查表,输出
delay1ms();
P2=0xff; //消隐
P0=0xfd; //P0.1=0,选通第二位
P2=seg7code[date%1000/100];
delay1ms();
P2=0xff; //消隐
P0=0xfb; //P0.3=0,选通第三位
P2=seg7code[date%100/10];
delay1ms();
P2=0xff; //消隐
P0=0xf7; //P0.3=0,选通第四位 P2=seg7code[date%10];
delay1ms();
P2=0xff; //消隐
}
void main(void )
{
unsigned int i;
mdelay(255);
eeprom_eares(0x2000);
eeprom_write(0x2000,123);//写数据? //ISP_DATA=0;
i=eeprom_read(0x2000);
while(1)
{
LED_display(i);
}
}。

相关文档
最新文档