STC89C52單片機(jī)內(nèi)部EEPROM驅(qū)動(dòng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
STC89C52單片機(jī)內(nèi)部帶有4K的EEPROM,嚴(yán)格來說,應(yīng)該是4K的FLASH,它分為8個(gè)扇區(qū),每個(gè)扇區(qū)有512個(gè)字節(jié)。讀寫數(shù)據(jù)只能按字節(jié)操作,擦除數(shù)據(jù)只能按扇區(qū)操作。 由于它掉電不易失的特性,可以用來存儲(chǔ)程序運(yùn)行過程中產(chǎn)生的用戶數(shù)據(jù),掉電可保存。
[cpp] view plaincopy/*
************************************************************************************
Fuction:STC89C52單片機(jī)內(nèi)部4K的EEPROM操作驅(qū)動(dòng)
Software Designer:Jason
************************************************************************************
*/
#include
#include
#define uchar unsigned char
#define uint unsigned int
/******************定義命令字節(jié)******************/
#define Read_COM 0x01 //字節(jié)讀數(shù)據(jù)命令
#define Prog_COM 0x02 //字節(jié)編程數(shù)據(jù)命令
#define Erase_COM 0x03 //扇區(qū)擦除數(shù)據(jù)命令
#define En_Wait_TIME 0x81 //設(shè)置等待時(shí)間 ,并使能ISP/IAP
#define Start_ADDRH 0x20 //扇區(qū)地址高位
#define Start_ADDRL 0x00 //扇區(qū)地址低位
/****************特殊功能寄存器聲明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/*****************關(guān)閉ISP&IAP功能*****************/
void ISP_IAP_disable(void)
{
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
/*********************字節(jié)讀**********************/
uchar Byte_read(uint byte_addr)
{
EA = 0; //關(guān)中斷
ISP_CONTR = En_Wait_TIME; //開啟ISP&IAP,并送等待時(shí)間
ISP_CMD = Read_COM; //送字節(jié)讀命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字節(jié)
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字節(jié)
ISP_TRIG = 0x46; //送觸發(fā)命令字0x46
ISP_TRIG = 0xB9; //送觸發(fā)命令字0xB9
_nop_();
ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
EA = 1; //開中斷
return (ISP_DATA);
}
/*********************字節(jié)編程*********************/
void Byte_program(uint byte_addr,uchar isp_iap_data)
{
EA = 0; //關(guān)中斷
ISP_CONTR = En_Wait_TIME; //開啟ISP&IAP,并送等待時(shí)間
ISP_CMD = Prog_COM; //送字節(jié)編程命令字
ISP_ADDRH = (uchar)(byte_addr >> 8); //送地址高字節(jié)
ISP_ADDRL = (uchar)(byte_addr & 0x00ff); //送地址低字節(jié)
ISP_DATA = isp_iap_data; //送數(shù)據(jù)進(jìn)ISP_DATA
ISP_TRIG = 0x46; //送觸發(fā)命令字0x46
ISP_TRIG = 0xB9; //送觸發(fā)命令字0xB9
_nop_();
ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
EA = 1; //開中斷
}
/*********************扇區(qū)擦除*********************/
void Sector_erase(uint sector_addr)
{
EA = 0; //關(guān)中斷
ISP_CONTR = En_Wait_TIME; //開啟ISP&IAP;并送等待時(shí)間
ISP_CMD = Erase_COM; //送扇區(qū)擦除命令字
ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字節(jié)
ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字節(jié)
ISP_TRIG = 0X46; //送觸發(fā)命令字0x46
ISP_TRIG = 0XB9; //送觸發(fā)命令字0xB9
_nop_();
ISP_IAP_disable(); //關(guān)閉ISP&IAP功能
EA = 1;
}
void main()
{
Sector_erase(0x2000); //扇區(qū)擦除
Byte_program(0x2000,0x88); //寫EEPROM
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=Byte_read(0x2000); //讀EEPROM
while(1);
}