STC单片机片内EEPROM的读写
来源:互联网 发布:平板双系统切换windows 编辑:程序博客网 时间:2024/03/29 23:26
宏晶STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。
首先是stcEEPROM.h头文件内容:
/*When Who Remarks----------------------------------2011-Oct-06 黄长浩 初始版本 */#ifndef __STCEEPROM_H__#define __STCEEPROM_H__#define STC_EEPROM_START_ADDR 0x2000 //STC89C52RC片内EEPROM起始地址unsigned char eepromRead( unsigned int address );void eepromWrite( unsigned int address, unsigned char writeData );void eepromEraseSector( unsigned int address );#endif
/*When Who Remarks----------------------------------2011-Oct-06 黄长浩 初始版本 */sfr isp_data=0xe2;sfr isp_addrh=0xe3;sfr isp_addrl=0xe4;sfr isp_cmd=0xe5;sfr isp_trig=0xe6;sfr isp_contr=0xe7;//擦除片内EEPROM的一个扇区//擦除只能以扇区为最小单位进行,没法只擦除一个字节//一个扇区是512个字节//本函数参数里面的地址落在哪个扇区,则该扇区内数据都将被擦除//例如:STC89C51RC片内EEPROM第一扇区开始地址为0x2000,结束地址为0x21ff//如果调用 eepromEraseSector(0x2001),则第一扇区内数据都将被擦除//擦除成功后,该扇区内各字节都将变为0xffvoid eepromEraseSector (unsigned int address){unsigned char i;isp_addrl=address;isp_addrh=address>>8;isp_contr=0x01; isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHzisp_cmd=0x03; 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;}//对STC片内EEPROM的指定地址写入数据(即,字节编程)。//注意:字节编程是指将eeprom的1写成1或0,将0写成0,而无法将0写成1//所以,在写入数据前,一定要用扇区擦除将所有字节变为0xffvoid eepromWrite(unsigned int address, unsigned char write_data){unsigned char i;isp_data=write_data;isp_addrl=address;isp_addrh=address>>8;isp_contr=0x01; isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHzisp_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;}//读取STC单片机内部EEPROM的一个字节//主要不同的STC单片机EEPROM起始地址不同//例如:STC89c52RC的片内EEPROM起始地址为0x2000unsigned char eepromRead(unsigned int address){unsigned char i,z;isp_addrl=address;isp_addrh=address>>8;isp_contr=0x01;isp_contr=isp_contr|0x81; // 0x80 if SYSCLK<40MHz, 0x81 if SYSCLK<20MHz, 0x82 if SYSCLK<10MHz, 0x83 if SYSCLK<5MHzisp_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);}
使用的时候只需#include "stcEEPROM.h"即可。
一共3个函数,分别是擦除扇区、写字节和读字节。
要特别强调的是:
【1】每个型号的STC单片机都有自己的片内E2PROM起始地址和isp_trig,使用前注意看Datasheet的说明。
【2】片内EEPROM的写操作叫做字节编程。它能将“1”写成“1”或“0”,或者将“0”写成“0”,但不能将“0”写成“1”。所以,如果某存储单元是0xff才可以对其编程。故,写入前一定要擦除该单元,只有擦除才能将“0”擦除为“1”。
【3】擦除最小单位是扇区,512个字节为一个扇区(注意看Datasheet说明每个扇区的起始和结束地址)。
【4】如果在一个扇区中存放了大量数据,某次只要修改其中一个字节或一部分字节时,其它不需要修改的字节必须先读出来,放入RAM中,然后擦除整个扇区,再将需要保留和修改的字节一一写回。所以在设计程序时,尽量将同一次修改的数据放在同一个扇区中,而不同时修改的数据放在另外的扇区中。
【5】当电源电压过低时(5v单片机在3.7v以下),不要进行EEPROM/IAP操作。
【6】为防止电压过低造成的EEPROM操作失败,可以先向某单元写入一个已知数,然后再读取它,如果返回值是刚才写入的数,则说明EEPROM读写正常。还可以多检测两次以提高可靠性。
- STC单片机片内EEPROM的读写
- STC单片机EEPROM读写
- STC单片机内部EEPROM的应用
- PIC单片机片内存储空间定义(EEPROM)
- PIC16F877A单片机的EEPROM读写
- STM32L系列单片机内部EEPROM的读写
- STM32单片机内部EEPROM的读写
- 单片机EEPROM读写问题
- STC内部EEPROM的应用
- 嵌入式学习笔记(21)——AVR单片机之片内EEPROM
- STC单片机的延时
- STM8S_007_片内FLASH和EEPROM编程
- STM8S_007_片内FLASH和EEPROM编程
- STC单片机的protues仿真
- STC单片机的命名规则
- STC单片机的下载协议
- 飞思卡尔单片机DZ60---EEPROM读写
- PIC1947单片机EEPROM读写子程序处理
- java访问修饰符和可见度
- <学习笔记>Windows驱动开发技术详解__IRP的同步
- 用dos命令修复文件关联的方法
- java中的Clone(深拷贝,浅拷贝)
- Ext.form.TextField()基本用法
- STC单片机片内EEPROM的读写
- 关于xml schema的一些事
- Android学习四之APIDemos
- vmware安装fatal error&msi found
- 28连局华容道游戏
- java中的Object对象理解
- Struts2 错误 “No result defined” 与 ActionSupport 类
- boot sector和superblock的关系
- 可编辑表格:Ext.grid.EditorGridPanel