久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19452|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频网址| 国产视频福利一区 | 成人久久网 | 午夜精品久久久久久久星辰影院 | 黄色在线免费网站 | 在线观看免费高清av | 欧美 日韩 国产 成人 | 亚洲一区国产精品 | 日本特黄a级高清免费大片 特黄色一级毛片 | 欧美久久一区二区 | 国产激情视频在线免费观看 | 欧美一级三级 | 国产二区视频 | 国产成人精品午夜视频免费 | 天天干天天玩天天操 | 欧美aaaa视频 | 欧洲视频一区二区 | 午夜电影在线播放 | 日韩av电影在线观看 | 久久99这里只有精品 | 亚洲国产精品久久久久秋霞不卡 | 久久久久国产一级毛片 | www.日日夜夜 | 色综合成人网 | 亚洲一区二区三区免费在线观看 | 日日想夜夜操 | 人人性人人性碰国产 | 亚洲视频免费 | 成人免费在线电影 | 久久精品一区二区 | 亚洲国产一区二区三区在线观看 | 亚洲视频中文字幕 | 中文字幕视频在线 | 国产精品成人一区 | 免费日韩网站 | 天堂久| 性色综合 | 欧美日韩国产精品一区二区 | 国产亚洲精品久久久久久豆腐 | 奇米四色影视 | 欧美视频在线观看 |