欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)片內(nèi)的EEPROM存儲(chǔ)器讀寫(xiě)程序stcEEPROM.h [打印本頁(yè)]

作者: xiashan    時(shí)間: 2015-4-5 15:51
標(biāo)題: 單片機(jī)片內(nèi)的EEPROM存儲(chǔ)器讀寫(xiě)程序stcEEPROM.h
STC很多系列的單片機(jī)片內(nèi)都集成了EEPROM存儲(chǔ)器(其實(shí)是Data Flash),方便用戶使用,想得真周到!今天寫(xiě)了個(gè)小程序,測(cè)試了一下,工作正常。下面就上我自己寫(xiě)的源程序。本人在STC89C52RC單片機(jī)上試驗(yàn)成功。

首先是stcEEPROM.h頭文件內(nèi)容:
  #ifndef __STCEEPROM_H__  
#define __STCEEPROM_H__   
   #define STC_EEPROM_START_ADDR 0x2000  //STC89C52RC片內(nèi)EEPROM起始地址          
unsigned char eepromRead( unsigned int address );
   void eepromWrite( unsigned int address, unsigned char writeData );
  void eepromEraseSector( unsigned int address );      
#endif  

接下來(lái)是stcEEPROM.c文件內(nèi)容:
sfr isp_data=0xe2;
sfr isp_addrh=0xe3;  
sfr isp_addrl=0xe4;
sfr isp_cmd=0xe5;  
sfr isp_trig=0xe6;
sfr isp_contr=0xe7;
//擦除片內(nèi)EEPROM的一個(gè)扇區(qū)
//擦除只能以扇區(qū)為最小單位進(jìn)行,沒(méi)法只擦除一個(gè)字節(jié)
//一個(gè)扇區(qū)是512個(gè)字節(jié)
//本函數(shù)參數(shù)里面的地址落在哪個(gè)扇區(qū),則該扇區(qū)內(nèi)數(shù)據(jù)都將被擦除
//例如:STC89C51RC片內(nèi)EEPROM第一扇區(qū)開(kāi)始地址為0x2000,結(jié)束地址為0x21ff
//如果調(diào)用 eepromEraseSector(0x2001),則第一扇區(qū)內(nèi)數(shù)據(jù)都將被擦除
//擦除成功后,該扇區(qū)內(nèi)各字節(jié)都將變?yōu)?xff
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;  
}
//對(duì)STC片內(nèi)EEPROM的指定地址寫(xiě)入數(shù)據(jù)(即,字節(jié)編程)。
//注意:字節(jié)編程是指將eeprom的1寫(xiě)成1或0,將0寫(xiě)成0,而無(wú)法將0寫(xiě)成1
//所以,在寫(xiě)入數(shù)據(jù)前,一定要用扇區(qū)擦除將所有字節(jié)變?yōu)?xff
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單片機(jī)內(nèi)部EEPROM的一個(gè)字節(jié)
//主要不同的STC單片機(jī)EEPROM起始地址不同  
//例如:STC89c52RC的片內(nèi)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);  

}  
使用的時(shí)候只需#include "stcEEPROM.h"即可。
一共3個(gè)函數(shù),分別是擦除扇區(qū)、寫(xiě)字節(jié)和讀字節(jié)。
要特別強(qiáng)調(diào)的是:
【1】每個(gè)型號(hào)的STC單片機(jī)都有自己的片內(nèi)E2PROM起始地址和isp_trig,使用前注意看Datasheet的說(shuō)明。
【2】片內(nèi)EEPROM的寫(xiě)操作叫做字節(jié)編程。它能將“1”寫(xiě)成“1”或“0”,或者將“0”寫(xiě)成“0”,但不能將“0”寫(xiě)成“1”。所以,如果某存儲(chǔ)單元是0xff才可以對(duì)其編程。故,寫(xiě)入前一定要擦除該單元,只有擦除才能將“0”擦除為“1”。
【3】擦除最小單位是扇區(qū),512個(gè)字節(jié)為一個(gè)扇區(qū)(注意看Datasheet說(shuō)明每個(gè)扇區(qū)的起始和結(jié)束地址)。
【4】如果在一個(gè)扇區(qū)中存放了大量數(shù)據(jù),某次只要修改其中一個(gè)字節(jié)或一部分字節(jié)時(shí),其它不需要修改的字節(jié)必須先讀出來(lái),放入RAM中,然后擦除整個(gè)扇區(qū),再將需要保留和修改的字節(jié)一一寫(xiě)回。所以在設(shè)計(jì)程序時(shí),盡量將同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū)中,而不同時(shí)修改的數(shù)據(jù)放在另外的扇區(qū)中。
【5】當(dāng)電源電壓過(guò)低時(shí)(5v單片機(jī)在3.7v以下),不要進(jìn)行EEPROM/IAP操作。

【6】為防止電壓過(guò)低造成的EEPROM操作失敗,可以先向某單元寫(xiě)入一個(gè)已知數(shù),然后再讀取它,如果返回值是剛才寫(xiě)入的數(shù),則說(shuō)明EEPROM讀寫(xiě)正常。還可以多檢測(cè)兩次以提高可靠性。  


作者: gqzjl    時(shí)間: 2020-5-7 07:51
感謝分享!
作者: fyljx888    時(shí)間: 2020-5-10 17:09
正需要補(bǔ)充的知識(shí),謝謝了
作者: STC莊偉    時(shí)間: 2022-11-4 11:18
可以USB仿真 USB下載的STC8H8K64U-45MHz-TSSOP20  樓主可以試一下  適合新手入門(mén)和學(xué)生

作者: Longan.Wang    時(shí)間: 2022-11-9 17:17
不錯(cuò)!51黑因你而精彩!
作者: 騰飛的龍    時(shí)間: 2022-12-24 09:36
STC12C和STC8H8K操作是不一樣的
作者: hi等你    時(shí)間: 2023-1-4 14:01
我看不懂c,寫(xiě)入和擦除前要加一條禁止中斷的指令,萬(wàn)一寫(xiě)入或者擦除時(shí)候又去執(zhí)行中斷就出錯(cuò)了
作者: 一心湯    時(shí)間: 2023-8-16 15:07
讀這個(gè)程序干嘛用的




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1