51單片機內部EEPROM讀寫


#include <reg52.h>
#include <intrins.h>
//定義類型,方便代碼移植

typedef unsigned char UINT8;
typedef unsigned int  UINT16;
typedef unsigned long UINT32;

typedef char INT8;
typedef int  INT16;
typedef long INT32;

static     UINT8 i=0;
/*
定義寄存器 ISP 
*/

sfr ISP_DATA= 0xe2;  // Flash數據寄存器
sfr ISP_ADDRH= 0xe3;// Flash高字節地址寄存器
sfr ISP_ADDRL= 0xe4;// Flash低字節地址寄存器
sfr ISP_CMD= 0xe5;// Flash命令模式寄存器
sfr ISP_TRIG= 0xe6;// Flash命令觸發寄存器
sfr ISP_CONTR= 0xe7;// ISP/IAP 控制寄存器





#define NOP()                                    _nop_()
#define EEPROM_START_ADDRESS    0X2000
#define LED_PORT                            P2

//微秒級延時
void DelayNus(UINT16 t)
{
    UINT16 d=0;
    d=t;
    do
    {
        NOP();
    }while(--d > 0);
}
//毫秒級延時
void DelayNms(UINT16 t)
{
    do
    {
        DelayNus(1000);
    }while(--t > 0);
}

//EEPROM使能
void EEPROMEnable(void)
{
    ISP_CONTR=0x81;//使能並設置好等待時間 
}
//EEPROM禁用
void EEPROMDisable(void)
{
    ISP_CONTR=0x00;//禁止EEPROM
    ISP_CMD = 0X00;//無ISP操作
    ISP_TRIG = 0X00;//清零
    ISP_ADDRH = 0X00;//清零
    ISP_ADDRL = 0X00;//清零
}

//eeprom 設置讀寫地址(相對地址)
void EEPROMSetAddress(UINT16 addr)
{
    addr+=EEPROM_START_ADDRESS;//初始化地址
    ISP_ADDRH=(UINT8)(addr>>8);//設置讀寫地址高字節
    ISP_ADDRL=(UINT8) addr;         //設置讀寫地址低字節
}

//EEPROM啟動
void EEPROMStart(void)
{
    ISP_TRIG=0x46;
    ISP_TRIG=0xB9;
}

//EEPROM讀取單個字節
UINT8 EEPROMReadByte(UINT16 addr)
{
    ISP_DATA=0X00;
    ISP_CMD=0X01;
    EEPROMEnable();
    EEPROMSetAddress(addr);
    EEPROMStart();
    DelayNus(10);//讀取一個字節需要10us
    EEPROMDisable();
    return (ISP_DATA);
}


//EEPROM寫入單個字節
UINT8 EEPROMWriteByte(UINT16 addr,UINT8 byte)
{

    EEPROMEnable();
        ISP_CMD=0X02;
    EEPROMSetAddress(addr);
    ISP_DATA=byte;
    
    
    EEPROMStart();
    DelayNus(60);
    EEPROMDisable();

}

//EEPROM扇區擦除
UINT8 EEPROMSectorErase(UINT16 addr)
{

    ISP_CMD=0X03;
    EEPROMEnable();
    EEPROMSetAddress(addr);
    EEPROMStart();
    DelayNus(10);//
    EEPROMDisable();
}



void main(void)
{

    EEPROMSectorErase(0);
    EEPROMWriteByte(0,0x0f);
    i=EEPROMReadByte(0);
    
    LED_PORT = i;
    while(1);
    
    
}

現象:

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM