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
}
실험 결과:
컴퓨터 직렬 디버깅 조수에 데이터를 출력하기