STC89C52單片機內部EEPROM驅動

        STC89C52單片機內部帶有4K的EEPROM,嚴格來說,應該是4K的FLASH,它分爲8個扇區,每個扇區有512個字節。讀寫數據只能按字節操作,擦除數據只能按扇區操作。 由於它掉電不易失的特性,可以用來存儲程序運行過程中產生的用戶數據,掉電可保存。

/*
************************************************************************************
Fuction:STC89C52單片機內部4K的EEPROM操作驅動
Software Designer:Jason
************************************************************************************
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************定義命令字節******************/     
#define Read_COM    0x01 					//字節讀數據命令   
#define Prog_COM    0x02        			//字節編程數據命令   
#define Erase_COM    0x03       			//扇區擦除數據命令    
#define En_Wait_TIME    0x81    			//設置等待時間 ,並使能ISP/IAP      
#define Start_ADDRH 0x20        			//扇區地址高位    
#define Start_ADDRL 0x00        			//扇區地址低位
/****************特殊功能寄存器聲明****************/
sfr ISP_DATA = 0xe2; 
sfr ISP_ADDRH = 0xe3;   
sfr ISP_ADDRL = 0xe4; 
sfr ISP_CMD = 0xe5; 
sfr ISP_TRIG = 0xe6;    
sfr ISP_CONTR = 0xe7;
/*****************關閉ISP&IAP功能*****************/   
void ISP_IAP_disable(void)   
{   
	ISP_CONTR = 0x00;   
    ISP_CMD = 0x00;    
    ISP_TRIG = 0x00;   
}   
/*********************字節讀**********************/     
uchar Byte_read(uint byte_addr)   
{   
    EA = 0;                                    	//關中斷    
    ISP_CONTR = En_Wait_TIME;                   //開啓ISP&IAP,並送等待時間    
    ISP_CMD = Read_COM;                         //送字節讀命令字       
    ISP_ADDRH = (uchar)(byte_addr >> 8);      	//送地址高字節    
    ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字節        
    ISP_TRIG = 0x46;                            //送觸發命令字0x46   
    ISP_TRIG = 0xB9;							//送觸發命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //關閉ISP&IAP功能    
    EA = 1;                                     //開中斷    
    return (ISP_DATA);   
}     
/*********************字節編程*********************/   
void Byte_program(uint byte_addr,uchar isp_iap_data)   
{   
    EA = 0;                                     //關中斷    
    ISP_CONTR = En_Wait_TIME;                   //開啓ISP&IAP,並送等待時間    
    ISP_CMD = Prog_COM;                         //送字節編程命令字      
    ISP_ADDRH = (uchar)(byte_addr >> 8);      	//送地址高字節    
    ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字節        
    ISP_DATA = isp_iap_data;                    //送數據進ISP_DATA    
    ISP_TRIG = 0x46;                            //送觸發命令字0x46   
    ISP_TRIG = 0xB9;							//送觸發命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //關閉ISP&IAP功能    
    EA = 1;                                     //開中斷       
}   
   
/*********************扇區擦除*********************/   
void Sector_erase(uint sector_addr)   
{   
    EA = 0;                                     //關中斷    
    ISP_CONTR = En_Wait_TIME;                   //開啓ISP&IAP;並送等待時間    
    ISP_CMD = Erase_COM;                        //送扇區擦除命令字      
    ISP_ADDRH = (uchar)(sector_addr >> 8);   	//送地址高字節    
    ISP_ADDRL = (uchar)(sector_addr & 0X00FF);	//送地址低字節        
    ISP_TRIG = 0X46;                            //送觸發命令字0x46  
    ISP_TRIG = 0XB9;							//送觸發命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //關閉ISP&IAP功能    
    EA = 1;   
}  
void main()   
{      
	Sector_erase(0x2000);       				//扇區擦除    
	Byte_program(0x2000,0x88); 					//寫EEPROM    
	_nop_();   
	_nop_();   
	_nop_(); 
	_nop_();   
	_nop_();   
	_nop_();   
	P0=Byte_read(0x2000);    					//讀EEPROM
	while(1);    
}        


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章