STC89C52RC 내부 EEPROM 읽기/쓰기

5819 단어 단편기
본문은 오리지널이니 전재하여 출처를 밝혀 주십시오!
이 예는 win10 운영체제에서keil4 "c51v956"버전으로 완성
STC89C52RC의 섹터 분포:
******************************************************************************************************************************************************************************************************************/
stc89c52rc 내부 EEPROM 작업 단계:
1. EEPROM 지우기
2. EEPROM 쓰기
3. EEPROM 읽기
바이트를 EEPROM에 쓴 다음 EEPROM에서 바이트를 읽고 직렬로 보내면 직렬로 디버깅 조수를 통해 확인하고 검증할 수 있습니다
첨부 코드:
주 함수:
/**
  ******************************************************************************
  * @file    main.c
  * @author  waitstory
  * @version V1.0
  * @date    2018-4-11
  * @brief   STC89C52RC  EEPROM   
  ******************************************************************************
  * @attention  
  *
  *     :STC89C52RC  ,  11.0592MHz
  *
  ******************************************************************************
**/

#include 

void InitUART(uint baud);       //       
void UartTXData(uchar str[]);   //      
void Delay_ms(uint z);     //    

uchar TxStr[3] = {0};
uchar dat[2] ={0x01,0x02};

/********STC89C52    *******
    :2000H--21FF
    :2200H--23FF
    :2400H--25FF
    :2600H--27FF
    :2800H--29FF
    :2A00H--2BFF
    :2C00H--2DFF
    :2E00H--2FFF
*******************************/ 

void main()
{
    SectorErase(0x2000);    //      
    byte_write(0x2001,dat[0]);   //    0x2001         
    byte_write(0x2002,dat[1]);   //    0x2002         
    Delay_ms(1000);       //  1s
 
    InitUART(9600);         //       

    while(1)
    { 
        TxStr[0] = byte_read(0x2001);     //   0x2001      
        TxStr[1] = byte_read(0x2002);     //   0x2002      
 
        UartTXData(TxStr);     //           

        Delay_ms(2000);        //  2s
    }

}


/*       ,baud-      */
void InitUART(uint baud)
{
    EA = 1;        //       
    SCON  = 0x50;  //       1
    TMOD &= 0x0F;  //  T1    
    TMOD |= 0x20;  //  T1   2
    TH1 = 256 - (11059200/12/32)/baud;  //  T1   
    TL1 = TH1;     //       
    ET1 = 0;       //  T1  
    ES  = 1;       //      
    TR1 = 1;       //  T1
}                                 

/*         */	
void UartTXData(uchar str[])
{   
    uchar i = 0;
    
    while(str[i] != '\0')
    {
        SBUF= str[i];
        i++;
        while(!TI);
        TI=0;
    }
}

/*    */
void Delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

EEPROM 헤더 파일:
#ifndef _EEPROM_H_
#define _EEPROM_H_

#include 
#include 

typedef  unsigned int uint;
typedef  unsigned char uchar;

/********STC89C52    *******
    :2000H--21FF
    :2200H--23FF
    :2400H--25FF
    :2600H--27FF
    :2800H--29FF
    :2A00H--2BFF
    :2C00H--2DFF
    :2E00H--2FFF
*******************************/

#define RdCommand 0x01     //           
#define PrgCommand 0x02    //          
#define EraseCommand 0x03  //        

#define Error 1
#define Ok 0
#define WaitTime 0x01 //  CPU     ,40M   0,20M   1,10M   2,5M   3

/*****ISP/IAP         ********/    
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;


unsigned char byte_read(unsigned int byte_addr);
void byte_write(unsigned int byte_addr,unsigned char Orig_data);
void SectorErase(unsigned int sector_addr);

#endif

EEPROM용 C 파일:
#include "eeprom.h"

/**********  ISP/IAP  **************/   
void ISP_IAP_Enable(void)
{
    EA = 0;  //     
    ISP_CONTR = ISP_CONTR & 0x18;  
    ISP_CONTR = ISP_CONTR | WaitTime; //       
    ISP_CONTR = ISP_CONTR | 0x80;   //  ISP/IAP  
}

/**********  ISP/IAP  **************/   
void ISP_IAP_Disable(void)
{
	 ISP_CONTR = ISP_CONTR & 0x7f; //  ISP/IAP  
     ISP_CMD = 0x00;    //  ISP/IAP  
	 ISP_TRIG = 0x00;   //  ISP/IAP     
	 EA   =   1;        //     
}

/**********  ISP/IAP**************/  
void ISPTrig(void)
{
	 ISP_TRIG = 0x46;  //  46h,  B9h ISP/IAP     ,      
	 ISP_TRIG = 0xb9;  //  B9h ,ISP/IAP         
	 _nop_();
}

/**********   **************/
unsigned char byte_read(unsigned int byte_addr)
{
     unsigned char  dat = 0;    // EEPROM    

	 EA = 0;     //   
	 ISP_ADDRH = (unsigned char)(byte_addr >> 8);     //      
	 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //      
     ISP_IAP_Enable();             //  ISP/IAP  
	 ISP_CMD   = ISP_CMD & 0xf8;   //  ISP_CMD    3 
	 ISP_CMD   = ISP_CMD | RdCommand; //        
	 ISPTrig();                //  ISP/IAP
	 dat = ISP_DATA;           // ISP_DATA           
     ISP_IAP_Disable();        //  ISP/IAP   
	 EA  = 1;           //    
	 return dat;        //       
}

/**********   **************/
void byte_write(unsigned int byte_addr,unsigned char Orig_data)
{
	 EA  = 0;  //   
	 ISP_ADDRH = (unsigned char)(byte_addr >> 8);       //      
	 ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);   //      
	 ISP_IAP_Enable();                   //  ISP/IAP  
     ISP_CMD  = ISP_CMD & 0xf8;         //  ISP_CMD    3 
	 ISP_CMD  = ISP_CMD | PrgCommand;   //        
	 ISP_DATA = Orig_data;      //     ISP_DATA   
	 ISPTrig();                //  ISP/IAP
	 ISP_IAP_Disable();        //  ISP/IAP   
	 EA =1;            //    
}
/**********    **************/
void SectorErase(unsigned int sector_addr)
{
	 EA = 0;   
	 ISP_ADDRH = (unsigned char)(sector_addr >> 8);        //        
	 ISP_ADDRL = (unsigned char)(sector_addr & 0x00ff);    //        
	 ISP_IAP_Enable(); 
     ISP_CMD = ISP_CMD & 0xf8;           //  ISP_CMD    3 
	 ISP_CMD = ISP_CMD | EraseCommand;   //        
	 ISPTrig();       //  ISP/IAP
	 ISP_IAP_Disable();    //  ISP/IAP   

}

실험 결과:
컴퓨터 직렬 디버깅 조수에 데이터를 출력하기

좋은 웹페이지 즐겨찾기