找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18055|回复: 7
打印 上一主题 下一主题
收起左侧

单片机片内的EEPROM存储器读写程序stcEEPROM.h

  [复制链接]
跳转到指定楼层
楼主
ID:76190 发表于 2015-4-5 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。

首先是stcEEPROM.h头文件内容:
  #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  

接下来是stcEEPROM.c文件内容:
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),则第一扇区内数据都将被擦除
//擦除成功后,该扇区内各字节都将变为0xff
void 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<5MHz  
          isp_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
//所以,在写入数据前,一定要用扇区擦除将所有字节变为0xff
void 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<5MHz  
          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;  } //读取STC单片机内部EEPROM的一个字节
//主要不同的STC单片机EEPROM起始地址不同  
//例如:STC89c52RC的片内EEPROM起始地址为0x2000
      unsigned 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<5MHz  
          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);  

}  
使用的时候只需#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读写正常。还可以多检测两次以提高可靠性。  

评分

参与人数 1黑币 +15 收起 理由
红尘有你 + 15 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏13 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:639106 发表于 2020-5-7 07:51 | 只看该作者
感谢分享!
回复

使用道具 举报

板凳
ID:748312 发表于 2020-5-10 17:09 | 只看该作者
正需要补充的知识,谢谢了
回复

使用道具 举报

地板
ID:961114 发表于 2022-11-4 11:18 | 只看该作者
可以USB仿真 USB下载的STC8H8K64U-45MHz-TSSOP20  楼主可以试一下  适合新手入门和学生
回复

使用道具 举报

5#
ID:77589 发表于 2022-11-9 17:17 | 只看该作者
不错!51黑因你而精彩!
回复

使用道具 举报

6#
ID:79544 发表于 2022-12-24 09:36 | 只看该作者
STC12C和STC8H8K操作是不一样的
回复

使用道具 举报

7#
ID:996773 发表于 2023-1-4 14:01 | 只看该作者
我看不懂c,写入和擦除前要加一条禁止中断的指令,万一写入或者擦除时候又去执行中断就出错了
回复

使用道具 举报

8#
ID:1091382 发表于 2023-8-16 15:07 | 只看该作者
读这个程序干嘛用的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表