zoukankan      html  css  js  c++  java
  • 51 EEPROM操作模板

    各个型号容量及扇区请查datasheet


    #include <reg52.h>
    #include "intrins.h"
    
    typedef unsigned char byte;
    typedef unsigned int word;
    
    /* Declare SFR associated with the IAP */
    sfr IAP_DATA  = 0xC2;  //Flash data register
    sfr IAP_ADDRH = 0xC3;  //Flash address HIGH
    sfr IAP_ADDRL = 0xC4;  //Flash address LOW
    sfr IAP_CMD   = 0xC5;  //Flash command register
    sfr IAP_TRIG  = 0xC6;  //Flash command trigger
    sfr IAP_CONTR = 0xC7;  //Flash control register
    
    /* Define ISP/IAP/EEPROM command */
    #define CMD_IDLE 0	   //Stand-By
    #define CMD_READ 1	   //Byte-Read
    #define CMD_PROGRAM 2  //Byte-Program
    #define CMD_ERASE 3	   //Sector-Erase
    
    /* Define ISP/IAP/EEPROM operation const for IAP_CONTR */
    #define ENABLE_IAP 0x80	 //if SYSCLK < 30MHz
    #define ENABLE_IAP 0x81	 //if SYSCLK < 24MHz
    #define ENABLE_IAP 0x82	 //if SYSCLK < 20MHz
    #define ENABLE_IAP 0x83	 //if SYSCLK < 12MHz
    #define ENABLE_IAP 0x84	 //if SYSCLK < 6MHz
    #define ENABLE_IAP 0x85	 //if SYSCLK < 3MHz
    #define ENABLE_IAP 0x86	 //if SYSCLK < 2MHz
    #define ENABLE_IAP 0x87	 //if SYSCLK < 1MHz
    
    //Start address for STC12C5201AD series EEPROM
    #define IAP_ADDRESS 0x0000
    
    void Delay(byte n)
    {
    	word x;
    	while(n--)
    	{
    		x = 0;
    		while(++x);
    	}
    }
    
    /* Disable ISP/IAP/EEPROM function Make MCU in a safe state */
    
    void IapIdle()
    {
    	 IAP_CONTR = 0;		   //close IAP function
    	 IAP_CMD = 0;		   //clear command to standby
    	 IAP_TRIG = 0;		   //clear tirgger register
    	 IAP_ADDRH = 0x80;	   //data ptr point to non EEPROM area
    	 IAP_ADDRL = 0;		   //clear IAP address to prevent mususe
    }
    
    /* read one byte from isp/iap/eeprom area input:addr(isp iap eeprom address) output:flash data */
    byte IapReadByte(word addr)
    {
    	byte dat;
    
    	IAP_CONTR = ENABLE_IAP; //Open IAP function and set wait time
    	IAP_CMD = CMD_READ;	    //Set ISAP READ command
    	IAP_ADDRL = addr;       //Set ISP address low
    	IAP_ADDRH = addr >> 8;  //Set IAP address high
    	IAP_TRIG = 0x5a;        //Send trigger command1(0x5a)
    	IAP_TRIG = 0xa5;        //Send trigger command2(0xa5)
    	_nop_();				//MCU will hold here until IAP operation complete
    
    	dat = IAP_DATA; 		//Read IAP EEPROM data
    	IapIdle();				//Close ISP function
    
    	return dat;				//Return Flash data
    }
    
    /* Program one byte to ISP area   Input:addr (address)  dat(data)  Output:- */
    void IapProgramByte(word addr, byte dat)
    {
    	IAP_CONTR = ENABLE_IAP;		//Open IAP function, and set wait time
    	IAP_CMD   = CMD_PROGRAM;    //Set EEPROM PROGRAM command
    	IAP_ADDRL = addr;
    	IAP_ADDRH = addr >> 8;
    	IAP_DATA = dat;
    	IAP_TRIG = 0x5a;
    	IAP_TRIG = 0xa5;
    	_nop_();
    
    	IapIdle();
    }
    
    /* Erase one sector area Input:addr */
    void IapEraseSector(word addr)
    {
    	IAP_CONTR = ENABLE_IAP;
    	IAP_CMD = CMD_ERASE;
    	IAP_ADDRL = addr;
    	IAP_ADDRH = addr >> 8;
    	IAP_TRIG = 0x5a;
    	IAP_TRIG = 0xa5;
    	_nop_();
    
    	IapIdle();
    }
    
    
    
    int main()
    {
    	word i;
    
    	P1 = 0xfe;
    	Delay(10);
    	IapEraseSector(IAP_ADDRESS);
    
    	for(i = 0; i < 512; ++i)
    	{
    		if(IapReadByte(IAP_ADDRESS + i) != 0xff)
    		{}	
    	}
    
    	P1 = 0xfc;
    	Delay(10);
    	for(i = 0; i < 512; ++i)
    	{
    		IapProgramByte(IAP_ADDRESS + i, (byte)i);
    	}
    	
    	P1 = 0xf8;
    	Delay(10);
    	for(i = 0; i < 512; ++i)
    	{
    		if(IapReadByte(IAP_ADDRESS + i) != (byte)i)
    		{}
    	}
    
    	P1 = 0xf0;
    	while(1);
    
    	return 0;
    }
    


  • 相关阅读:
    vue excel 二进制文件导出
    小程序 input 批量监听
    vue-cli3 环境配置
    vue 同一浏览器只允许登录一个账号的解决办法
    vue ueditor 百度富文本
    视频分享
    vue、react、mpvue、node、ng视频教程以及项目
    【转】 值得推荐的C/C++框架和库 (真的很强大)
    C# 验证过滤代理IP是否有效
    【转】 C#学习笔记14——Trace、Debug和TraceSource的使用以及日志设计
  • 原文地址:https://www.cnblogs.com/james1207/p/3328963.html
Copyright © 2011-2022 走看看