51单片机读写内部EEPROM详解
51单片机数据存储器结构详解
![51单片机数据存储器结构详解](https://img.taocdn.com/s3/m/54608228b5daa58da0116c175f0e7cd18425181a.png)
51单片机数据存储器结构详解1、bit是在内部数据存储空间中20h..2fh区域中一个位的地址,这在data的20h以后以字节形式出现,可互相参照。
另外加上8051可寻址的sfr,但刚刚试过,只是00h--7fh起作用,也就是说当数据有变化时颜色变红,以后的从80h到--ffh就不是位寻址区了,是位寻址的特殊寄存器,如涉及到了可位寻址的那11个当然会有反应。
复位后,程序计数器PC的内容为0000H,内部RAM的每个单元的值不确定。
每个功能寄存器的重置值如下:堆栈指针SP的重置值为07h,累加器ACC和寄存器B的重置值为00h,数据指针dptr的重置值为0000H,P0、P1、P2和P3的重置值为0ffh。
其他SFR (如PSW、TCON、tmod、tl0、Th0、TL1和Th1)的重置值也为00h。
2、wave中是低128字节和高128字节(0-7fh),低128字节是片内ram区,高128字节(80-ffh)是sfr(特殊功能寄存器)bit则是位于低128字节的20h..2fh区域,即data的20h..2fh区域3.代码位于0000H中,代码地址介于0ffh和FFH之间。
例如:org5000h标签:在db2h、3bh、43h、66h、5h、6dh、88H之后,代码从5000h变为dB4、data是在0到127之间的一个数据存储器地址,或者加128..255范围内的一个特殊功能寄存器(sfr)地址。
两者访问的方式不同。
实际上由于psw的复位设置psw.3=rs0和psw.4=rs1皆为0,所以通用工作寄存器区就是第0区,所以data的00--07h部分是与reg栏中的r0--r7对应的。
以后的则仅代表低128字节的内部ram。
5.IData是0到255范围内的IData内存地址。
IData与数据重叠128字节。
在某些地方,只有数据代表256字节的片上RAM,扩展数据是0到65535范围内的扩展数据存储器地址。
51内部eeprom读写,实现掉电存储
![51内部eeprom读写,实现掉电存储](https://img.taocdn.com/s3/m/42a78929b4daa58da0114a8e.png)
主函数:#include<reg52.h>#include"EEPROM.h"#include"smg.h"void main(){num=byte_read(DEBUG_Data_Memory_Begin_Sector_addr);//字节读(程序开始时读取EEPROM中数据)if(num>=60)num=0;//防止首次上电时读取出错??while(1){if(num<60){display(num);num++;delay(5);delay1(DELAY_CONST);sector_erase(DEBUG_Data_Memory_Begin_Sector_addr);//擦出扇区byte_program (DEBUG_Data_Memory_Begin_Sector_addr,num);//字节编程}if(num==60)num=0;}}EEPROM.h:/*STC89C51RC,STC89LE51RC 0x2000 共八个扇区STC89C52RC,STC89LE52RC 0x2000 共八个扇区STC89C54RD+,STC89LE54RD+ 0x8000 共五十八个扇区STC89C55RD+,STC89LE55RD+ 0x8000 共五十八个扇区STC89C58RD+,STC89LE58RD+ 0x8000 共五十八个扇区*/#include<reg52.h>#include<intrins.h>//sfr定义特殊功能寄存器sfr ISP_DATA =0xe2;//ISP/IAP 操作时的数据寄存器,从Flash 读出的数据放在此处,向Flash 写的数据也需放在此处sfr ISP_ADDRH =0xe3;//ISP/IAP 操作时的地址寄存器高八位sfr ISP_ADDRL =0xe4;//ISP/IAP 操作时的地址寄存器低八位sfr ISP_CMD =0xe5;//ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可生效sfr ISP_TRIG =0xe6;//ISP/IAP 操作时的命令触发寄存器sfr ISP_CONTR =0xe7;//ISP/IAP 控制寄存器/* 定义命令*/#define uchar unsigned char /*8bit无符号整型*/#define uint unsigned int /*16bit无符号整型*/#define READ_AP_and_Data_Memory_Command 0x01 /*字节读数据存储区*/#define PROGRAM_AP_and_Data_Memory_Command 0x02 /*字节编程数据存储区*/#define SECTOR_ERASE_AP_and_Data_Memory_Command 0x03 /*扇区擦除数据存储*/#define DEBUG_Data_Memory_Begin_Sector_addr 0x2000//扇区地址#define DELAY_CONST 60000//延时#define WAIT_TIME 0x01uchar num;/* 打开ISP,IAP 功能*/void ISP_IAP_enable(void){EA=0;/* 关中断*/ISP_CONTR=ISP_CONTR & 0x18; /* 0001,1000 */ISP_CONTR=ISP_CONTR|WAIT_TIME;ISP_CONTR=ISP_CONTR|0x80; /* 1000,0000 */}/* 关闭ISP,IAP 功能*/void ISP_IAP_disable(void){ISP_CONTR=ISP_CONTR&0x7f;/* 0111,1111 */ISP_TRIG=0x00;EA=1;/* 开中断*/}/* 字节读*/uchar byte_read(uint byte_addr){ISP_ADDRH = (uchar)(byte_addr >> 8);ISP_ADDRL = (uchar)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD&0xf8;/* 1111,1000 */ISP_CMD = ISP_CMD|READ_AP_and_Data_Memory_Command;/* 0000,0001 */ISP_IAP_enable();ISP_TRIG = 0x46;ISP_TRIG = 0xb9;_nop_();ISP_IAP_disable();return (ISP_DATA);}/* 扇区擦除*/void sector_erase(uint sector_addr){uint get_sector_addr=0;get_sector_addr=(sector_addr & 0xfe00); /* 1111,1110,0000,0000; 取扇区地址*/ ISP_ADDRH = (uchar)(get_sector_addr >> 8);ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD&0xf8;/* 1111,1000 */ISP_CMD =ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;/* 0000,0011 */ ISP_IAP_enable();ISP_TRIG = 0x46;/* 触发ISP_IAP命令*/ISP_TRIG = 0xb9;/* 触发ISP_IAP命令*/_nop_();ISP_IAP_disable();}/* 字节编程*/void byte_program(uint byte_addr, uchar original_data){ISP_ADDRH = (uchar)(byte_addr >> 8);ISP_ADDRL = (uchar)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD & 0xf8; /* 1111,1000 */ISP_CMD = ISP_CMD |PROGRAM_AP_and_Data_Memory_Command; /* 0000,0010 */ISP_DATA = original_data;ISP_IAP_enable();ISP_TRIG = 0x46; /* 触发ISP_IAP命令*/ISP_TRIG = 0xb9; /* 触发ISP_IAP命令*/_nop_();ISP_IAP_disable();}void delay1(uint counter){uint temp=0;for(temp=counter;temp>0;temp--){_nop_();_nop_();_nop_();}}Smg.h:/****************************************************************************** ***** 标题: 试验数码管上显示数字( 单片机直接实现位选共阴极) ** 用573锁存器控制和单片机脚直接位选控制(非译码器控制)数码管******************************************************************************** ****/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar code smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码0-9.uchar code smg_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制查表的方法控制void delay(uint i){uchar j;for(i;i>0;i--)for(j=200;j>0;j--);}void display(uint dat)//数码管显示函数{uint i;uint LedOut[10];LedOut[0]=smg_duan[dat%10000/1000];//(若要显示小数点,则|0x80)LedOut[1]=smg_duan[dat%1000/100];LedOut[2]=smg_duan[dat%100/10];LedOut[3]=smg_duan[dat%10];for( i=0; i<4; i++){P0=LedOut[i];P2=smg_wei[i];//使用查表法进行位选delay(10);//扫描间隔时间,数码管每位显示的时间,太长会数码管会有闪烁感}}。
MCU-51 多字节连接操作EEPROM(C语言程序)
![MCU-51 多字节连接操作EEPROM(C语言程序)](https://img.taocdn.com/s3/m/270f4b08a300a6c30c229f7e.png)
//-----------------------------------------------
sfr IAP_DATA = 0xC2; //IAP数据寄存器
sfr IAP_ADDRH = 0xC3; //IAP地址寄存器高字节
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz
//测试地址
#define IAP_ADDRESS 0x0400
void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 内部EEPROM举例--------------------------------*/
void InitUart();
BYTE SendData(BYTE dat);
51单片机读写内部EEPROM详解
![51单片机读写内部EEPROM详解](https://img.taocdn.com/s3/m/eb8f3c9a482fb4daa48d4b8b.png)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/****************特殊功能寄存器声明****************/
_nop_();
Q0();//关闭ISP/IAP
/*
函数:写一字节
入口:addr=扇区单元地址, dat=待写入数据
此文档共包含三个程序。
第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROMT。
第二个程序和第一个读写EEP ROM原理差不多,包含有LCD1602操作方 法,有写字符串的方法。
第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内
部EEPROM过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEP ROM操作后加上开总中断即可。
uchar V;
V =dcx(0x2002);//开机读取EEPROM区2002h数据,还原关电前LED的亮灭 状况
if(V==2){LED1=0;LED2=1;}
else if(V==6){LED1=0;LED2=0;}
while(1)
if(!K1)
while(!K1);
LED1=0;LED2=1;
sfr ISP_CMD=0xe5;
sfr ISP_TRIG=0xe6;
sfr ISP_CONTR=0xe7;
sbit LED1 = P2八0;
sbit LED2 = P 2八1;
sbit K1= P 3八2;//按钮1
51单片机内部EEPROM读写
![51单片机内部EEPROM读写](https://img.taocdn.com/s3/m/9dfc9c6930b765ce0508763231126edb6f1a76ac.png)
51单⽚机内部EEPROM读写#include <reg52.h>#include <intrins.h>//定义类型,⽅便代码移植typedef unsigned char UINT8;typedef unsigned int UINT16;typedef unsigned long UINT32;typedef char INT8;typedef int INT16;typedef long INT32;static UINT8 i=0;/*定义寄存器 ISP*/sfr ISP_DATA= 0xe2; // Flash数据寄存器sfr ISP_ADDRH= 0xe3;// Flash⾼字节地址寄存器sfr ISP_ADDRL= 0xe4;// Flash低字节地址寄存器sfr ISP_CMD= 0xe5;// Flash命令模式寄存器sfr ISP_TRIG= 0xe6;// Flash命令触发寄存器sfr ISP_CONTR= 0xe7;// ISP/IAP 控制寄存器#define NOP() _nop_()#define EEPROM_START_ADDRESS 0X2000#define LED_PORT P2//微秒级延时void DelayNus(UINT16 t){UINT16 d=0;d=t;do{NOP();}while(--d > 0);}//毫秒级延时void DelayNms(UINT16 t){do{DelayNus(1000);}while(--t > 0);}//EEPROM使能void EEPROMEnable(void){ISP_CONTR=0x81;//使能并设置好等待时间}//EEPROM禁⽤void EEPROMDisable(void){ISP_CONTR=0x00;//禁⽌EEPROMISP_CMD = 0X00;//⽆ISP操作ISP_TRIG = 0X00;//清零ISP_ADDRH = 0X00;//清零ISP_ADDRL = 0X00;//清零}//eeprom 设置读写地址(相对地址)void EEPROMSetAddress(UINT16 addr){addr+=EEPROM_START_ADDRESS;//初始化地址ISP_ADDRH=(UINT8)(addr>>8);//设置读写地址⾼字节ISP_ADDRL=(UINT8) addr; //设置读写地址低字节}//EEPROM启动void EEPROMStart(void){ISP_TRIG=0x46;ISP_TRIG=0xB9;}//EEPROM读取单个字节UINT8 EEPROMReadByte(UINT16 addr){ISP_DATA=0X00;ISP_CMD=0X01;EEPROMEnable();EEPROMSetAddress(addr);EEPROMStart();DelayNus(10);//读取⼀个字节需要10usEEPROMDisable();return (ISP_DATA);}//EEPROM写⼊单个字节UINT8 EEPROMWriteByte(UINT16 addr,UINT8 byte) {EEPROMEnable();ISP_CMD=0X02;EEPROMSetAddress(addr);ISP_DATA=byte;EEPROMStart();DelayNus(60);EEPROMDisable();}//EEPROM扇区擦除UINT8 EEPROMSectorErase(UINT16 addr){ISP_CMD=0X03;EEPROMEnable();EEPROMSetAddress(addr);EEPROMStart();DelayNus(10);//EEPROMDisable();}void main(void){EEPROMSectorErase(0);EEPROMWriteByte(0,0x0f);i=EEPROMReadByte(0);LED_PORT = i;while(1);}现象:。
STC51单片机 内部EEPROM操作
![STC51单片机 内部EEPROM操作](https://img.taocdn.com/s3/m/eaec28d676a20029bd642d74.png)
#include<reg52.h>#include<intrins.h>typedef unsigned char BYTE;typedef unsigned int WORD;//声明SFR IAP联系在一起的sfr IAP_DATA=0xE2; // flash data registersfr IAP_ADDRH=0xE3; //flash address highsfr IAP_ADDRL=0xe4; //falsh address lowsfr IAP_CMD=0Xe5; //FALSH COMMAND TRGGERsfr IAP_TRIG=0xE6; //flash command triggersfr IAP_CONTR=0xE7; //flash control register//定义ISP/IAP/EEPROM 命令#define CMD_IDIE 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 //SYSCLK<40MHZ#define ENABLE_IAP 0X81 // SYSCLK<20MHZ//#define ENABLE_IAP 0x82 //SYSCLK<10MHZ//#define ENABLE_IAP 0X83 //SYSCLK<5MHZ//Start addtess for STC89C58 eeprom#define IAP_ADDRESS 0x08000void Delay(BYTE n);void IapIdle();BYTE IapReadByte(WORD addr);void IapProgramByte(WORD addr,BYTE dat);void IapEraseSector(WORD addr);void main(){WORD i;P1=0xfe; //1111,1110 system reset okDelay(5);IapEraseSector(IAP_ADDRESS); //ERASE CURRENT SECTOR for(i=0;i<512;i++) //check whether all sector data is ff {if(IapReadByte(IAP_ADDRESS+i)!=0xff)goto Error; //if error ,break}P1=0xfc; //1111,1100 erase successfulDelay(5);for(i=0;i<256;i++) //program 512 bytes data into data flash{IapProgramByte(IAP_ADDRESS+i,(BYTE)i);}P1=0XF8; //1111,1000 program successfulDelay(5);for(i=0;i<256;i++) //verify 512 bytes data{if(IapReadByte(IAP_ADDRESS+i)!=(BYTE)i)goto Error;}P1=0xf0; //1111,0000 verify successfulwhile(1);Error:P1&=0x7f; //oxxx,xxxx IAP operation failwhile(1);}// software delay functionvoid 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 FUNCTIONIAP_CMD=0; //CLEAR COMMAND TO STANDBYIAP_TRIG=0; //CLEAR TRIGGER REGISTERIAP_ADDRH=0X80; //DATA PTR POINT TO NON-EEPROM AREA IAP_ADDRL=0; //CLEAR IAP ADDRESS TO PREVENT MISUSE }//Read one byte from ISP/IAP/EEPROM area//Input:addr (ISP/IAP/EEPROM address//Output: flash adataBYTE IapReadByte(WORD addr){BYTE dat;IAP_CONTR=ENABLE_IAP; //OPEN IAP FUNCTION ,AND SET WAIT TIMEIAP_CMD=CMD_READ; //SET ISP/IAP/EEPROM READ COMMANDIAP_ADDRL=addr; //SET ISP/IAP/EEPROM address lowIAP_ADDRH=addr>>8; //SET ISP//IAP//EEPROM address HIGHIAP_TRIG=0X46; //SEND TRIGGER COMMAND1 OX46IAP_TRIG=0XB9; //SEND TRIGGER COMMAND2 0XB9_nop_();dat=IAP_DATA; //read ISP/IAP/EEPROM dataIapIdle(); // close ISP/IAP/EEPROM FUNCITONreturn dat; //RETURN FLAH DATA}//Program one byte to ISP/IAP/EEPROM area//INPUT :addr (ISP/IAP/EEPROM address)//dat(ISP/IAP/EEPROM data)//Output:-void IapProgramByte(WORD addr, BYTE dat){IAP_CONTR=ENABLE_IAP; //OPEN IAP FUNTION AND SET WAIT TIMEIAP_CMD=CMD_PROGRAM; //SET ISP/IAP/EEPROM PROGRAM COMMAND IAP_ADDRL=addr; //set ISP/IAP/EEPROM ADDRESS LOWIAP_ADDRH=addr>>8; //set ISP/IAP/EEPROM address highIAP_DATA=dat; // WRITE ISP/IAP/EEPROM dataIAP_TRIG=0X46;IAP_TRIG=0XB9;_nop_();IapIdle();}void IapEraseSector(WORD addr){IAP_CONTR=ENABLE_IAP;IAP_CMD=CMD_ERASE;IAP_ADDRL=addr;IAP_ADDRH=addr>>8;IAP_TRIG=0X46;IAP_TRIG=0XB9;_nop_();IapIdle();}。
51单片机模拟iic总线协议使用EEPROM器件AT24C02
![51单片机模拟iic总线协议使用EEPROM器件AT24C02](https://img.taocdn.com/s3/m/5cc6c8da195f312b3169a5e3.png)
51单片机软件实现iic总线的工作时序所用EEPROM芯片AT24C02,实现向AT24C02中写入数据,然后将其中数据读出赋予P0口,实现流水灯的按数据亮灭,PS:附MCU图,AT24C02图于最后。
嘤其鸣矣,求其友声如若不弃,加我QQ:2447104957,高山流水,共同学习!#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit sda=P2^0;sbit scl=P2^1;//mcu原理图void delay(){;;}//微秒延时void init() //初始化,释放总线各线至高电平,SCL=0时,SDA可以改变{scl=0;delay();//微秒延时sda=1;delay();scl=1;delay();}void start() //起始信号{scl=0;delay();sda=1;delay();scl=1;delay();sda=0;delay();sda=1;//释放数据总线}void write_byte(uchar date)//字节写{uchar i,temp;temp=date;//由高位一位一位的写入for(i=0;i<8;i++)temp=temp<<1;//左移溢出到PSW寄存器CY位scl=0;//允许sda进行的变化delay();sda=CY;//进行一位一位的送入数据总线delay();scl=1;//符合读走数据总线上数据的要求delay();//稳定一段时间}scl=0;//允许sda变化,以便于接受应答信号delay();sda=1;//释放数据总线,准备接收应答信号delay();}void response()//应答,可以看书page181,由接收设备发出的第九位数据,要经由sda传输给发送设备{uchar i;scl=1;delay();while((sda==1)&&(i<250)){i++;//等待应答有一定的时间限制,sda被拉低表示有应答,由硬件控制}scl=0;delay();}void stop()//停止信号,scl=1,sda形成一个正跳变{scl=0;//允许sda变化delay();sda=0;//准备形成正跳变delay();scl=1;//信号有效前提1delay();sda=1;//形成正跳变delay();//信号有效前提1}void delay1(uint z)//毫秒级延时{for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar read_byte()//带有返回值,将所读到的数据作为返回值{uchar i,d;//d=0x00;//清空存储变量的空间for(i=0;i<8;i++){scl=0;//允许变化,即允许传送数据,sda是serial dual date busdelay();scl=1;//允许读走数据delay();d=(d<<1)|sda;//将sda上数据放入存储变量d,也是8位ucharscl=0;delay();}return d;/*scl=0;delay();sda=1;//释放数据总线,准备接受应答,被拉低delay();*/}void main(){init();//初始化//例子先写入EEPROM器件AT24C16数据,然后进行读取赋予流水灯是对应数据亮灭start();//起始信号write_byte(0xa0);/*写入EEPROM器件地址,写入分为数据,地址数据,地址又分为器件地址和内部存储地址,例如某班级某学生座位*/response();//等待应答write_byte(0x03);//内部存储地址response();write_byte(0x55);//写入真正意义上的数据response();//等待应答stop();//停止读取数据信号delay1(500);//毫秒延时//第一部分结束,写入EEPROM器件AT24C16数据start();write_byte(0xa0);//申明所读器件地址response();write_byte(0x03);//申明该器件中所要求读数据的位置response();start();write_byte(0xa1);response();P0=read_byte();//进行读数据操作后,非应答,budaixingcan,而是将返回值直接赋予变量stop();//第二部分内容;读即操作理解为,主机对器件写;告诉从机我要对你进行读操作,所以先写,后读while(1);//将程序终止于此}。
51单片机读写内部EEPROM详解
![51单片机读写内部EEPROM详解](https://img.taocdn.com/s3/m/eb8f3c9a482fb4daa48d4b8b.png)
#define uchar unsigned char
#define uint unsigned int
特殊功能寄存器声明****************
sfr ISP_DATA=0xe2;
sfr ISP_ADDRH=0xe3;
sfr ISP_ADDRL=0xe4;
uchar dat;
ISP_CONTR=0x81;
ISP_CMD= 0x01;/用户可以对"Data Flash/EEPROM区"进行字节读ISP_ADDRL = addr;
ISP_ADDRH=addr>>8;
EA= 0;
ISP_TRIG=0x46;
ISP_TRIG=0xB9;
_nop_();
dat=ISP_DATA;
uchar dcx(uint addr);
voidQ0();
/*
*/
/*
void main(void)
uchar V;
V = dcx(0x2002);//开机读取EEPROM区2002h数据,还原关电前LED的亮灭 状况
if(V==2){LED1=0;LED2=1;}
else if(V==6){LED1=0;LED2=0;}
验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片
机,以验证是否成功操作单片机内部EEPROM。
程序1:
/***************************************************************
作品:EEP ROM实验,开机还原关电前LED的亮灭状况
ISP_ADDRH=addr>>8;
单片机原理与应用基于汇编、C51及混合编程第10章STC系列单片机片内EEPROM的应用PPT课件
![单片机原理与应用基于汇编、C51及混合编程第10章STC系列单片机片内EEPROM的应用PPT课件](https://img.taocdn.com/s3/m/1dd197525e0e7cd184254b35eefdc8d377ee1457.png)
MOV IAP_TRIG,#0A5H NOP ;等待2个时钟周期的时间
NOP MOV A,ISP_DATA ;将读出的数据存入A寄存器
• 对STC10/10Fxx、STC12C5Axx等系列单片机 启动读、写、擦除工作时,先给IAP_TRIG寄 存器送立即数5AH,再送A5H作为触发信号; 而对STC12C56xx、STC12C54xx、 STC89/90C51xx等系列单片机需先送46H, 再送B9H作为触发信号。
11111111B
IAP_ADDRH C3H/E3H 地址寄存器高8位 00000000B
IAP_ADDRL C4H/E4H 地址寄存器低8位 00000000B
IAP_CMD
C5H/E5H 命令寄存器
xxxxxx00B
IAP_TRIG
C6H/E6H 命令触发寄存器 xxxxxxxxB
IAP_CONTR C7H/E7H 控制寄存器
RET
BYTE_PROGRAM:
;写
MOV A,@R0 ;读取片内RAM单元50H-5FH的内容
MOV IAP_DATA,A ;将数据送至数据寄存器
MOV IAP_CONTR,#82H ;允许对EERPOM操作并设置等待 时间
MOV IAP_CMD,#02H ;对EEPROM进行写操作指令
MOV IAP_ADDRL,DPL;送地址的低8位
ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP,#0BFH;初始化堆栈指针 START0: MOV DPTR,#SECTION_ADDR ;第一扇区的首地址 送DPTR LCALL SECTION_ERASE;调用扇区擦除子程序 MOV A,IAP_CONTR ;读控制寄存控制器 JNB ACC.4,START;若此位为0,表示擦除成功,可进行编程 LJMP START0 ;若擦除失败,须重新进行擦除
单片机EEPROM读写数据流程解析
![单片机EEPROM读写数据流程解析](https://img.taocdn.com/s3/m/4e3bd18a80eb6294dd886c87.png)
单片机EEPROM读写数据流程解析EEPROM 写数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
第二步,发送数据的存储地址。
24C02 一共256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位0”,来告诉我们写EEPROM 数据成功,如果没有回应答位,说明写入不成功。
在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到0xFF 后,再写一个字节,地址会溢出又变成了0x00。
EEPROM 读数据流程第一步,首先是I2C 的起始信号,接着跟上首字节,也就是我们前边讲的I2C 的器件地址,并且在读写方向上选择“写”操作。
这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM 我们要读取哪个地址的数据。
这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。
第三步,重新发送I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位0”。
第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。
STM32L051测试 (四、Flash和EEPROM的读写)
![STM32L051测试 (四、Flash和EEPROM的读写)](https://img.taocdn.com/s3/m/4a6fe6eff71fb7360b4c2e3f5727a5e9856a2792.png)
STM32L051 测试第 4 课,掉电数据保存的测试。
..修改文中以前的问题,增加后续问题说明(数据存储大小端模式)..增加后续问题2.4.3(STM32L071RBT6 EEPROM读写全字问题)..更新一下STM32L071 EEPROM读写全字问题最后解决说明•1、STM32L051内部存储模块地址范围•2、读写函数的设计▪ 2.1 读取函数▪ 2.2 EEPROM写函数▪ 2.3 Flash写函数▪ 2.4 读写EEPROM的后续问题•总结本文测试L051 flash的读写,用来处理以后应用中的掉电数据保存。
1、STM32L051内部存储模块地址范围开始找到F103的FLASH图复习了一遍,然后L051C8T6,64KB的flash,然后我惊奇的发现还有2KB的EEPROM。
发现L051系列的地址与F103完全不同,F103的flash每页的长度有1KB(小容量<=64KB)和2KB(大容量128KB起)查看各种资料,查了2个小时,还是不知道L051的flash 每页长度是128Byte 还是256Byte还是请教了一下大佬,发现直接在J-Flash中可以找到答案,先上个F103的图:然后来看个L051的图:图中64KB 的flash 和2KB的EEPROM都能都明显的看出地址,flash 512页,每页128bytes,EEPROM只有4页,每页512bytes.知道了基本的地址,就可以操作起来了。
最后还需要确定的一点事,最小擦除单元是128bytes,还是256bytes,按以前的认知,删除是按照一个Sector擦除的,也就是128bytes,但是我查看了一些网上的例子和资料,有的是说256bytes,所以后面需要自己确定一下其实在HAL库的stm32l0xx_hal_flash.h 文件中有过FLASH_PAGE_SIZE 的定义,就是128bytes :#define FLASH_SIZE (uint32_t)((*((uint32_t *)FLASHSIZE_BASE)&0xFFFF) * 1024U)#define FLASH_PAGE_SIZE ((uint32_t)128U) /*!< FLASH Page Size in bytes * /对于flash的操作,有一些基础知识补充一下:Read interface organized by word, half-word or byte in every area • Programming in the Flash memory performed by word or half-page • Programming in the Option bytes area performed by word • Programmi ng in the data EEPROM performed by word, half-word or byte • Erase operation performed by page (in Flash memory, data EEPROM and Option bytes)STM32L051写Flash必须字,读字节、半字、字都支持。
C51单片机的存储器结构ppt课件
![C51单片机的存储器结构ppt课件](https://img.taocdn.com/s3/m/ee17834fb0717fd5370cdcdd.png)
线上可以最大扩展64K的RAM,可独立寻址,有公 用指令系统〔MOVX传送指令〕,不能用于数据的 运算及处置,所以仅有4条指令,两条读,两条写, 用于普通数据的存放,地址为0000H-FFFFH。寻 址方式采用存放器间接寻址的方式,如MOVX A , @DPTR.,指令中DPTR,开辟在特殊功能存放器 〔SFR〕中,是一个16位的数据存储器〔数据指针
图3-3 内部数据存储器构造
7FH
用户区
30H 2FH
位寻址区
20H 1FH
工作寄存 器区
00H
〔1〕任务存放器区〔00H~1FH〕
共32个单元,又分为4组,每组8个单元,都用 R0~R7表示,如图3-4所示,
1FH
R7
3组
18H
R0
17H
R7
2组
10H
R0
0FH
R7
1组
08H
R0
07H
R7
06H
3-5所示, 指令MOV A , @R0 操作表示。 可以用〔〔R0〕〕=(40H)=AAH表示。
40H 1 0 1 0 1 0 1 0 30H 2FH 20H 1FH 00H 0 1 0 0 0 0 0 0 R0
注:
★ 在存放器寻址中〔Rn〕,这4组存放器,由 用户运用中经过PSW中的RS1和RS0的设定,来确 定用户运用的组。
1000H 0FFFH
外部程序储 存器64K (ROM)
80H 7FH 内部数据
储存器
128B (SRAM) 00H
0000H
内部程序储 存器4K
(ROM)
0000H
★内部数据存储器和外部数据存储器相互之间独立编址,
基于51单片机的EEPROM读写
![基于51单片机的EEPROM读写](https://img.taocdn.com/s3/m/5f7b2e0159fb770bf78a6529647d27284b73370a.png)
基于51单片机的EEPROM读写本讲内容:对存储器的基本知识进行介绍。
介绍EEPROM芯片AT24C02;通过例程展示EEPROM的读写。
存储器是应用于各种嵌入式场合的存储部件,按功能可分为只读存储器(ROM)和随机存取存储器(RAM)两大类,分别用作固定数据存储和临时数据缓存。
RAM(Random Access Memory),随机存取存储器:RAM的特点是:上电运行时,操作系统和应用程序的所有正在运行的数据和程序都会放置其中,并且随时可以对存放在里面的数据进行修改和存取。
它的工作需要由持续的电力提供,一旦系统断电,存放在里面的所有数据和程序都会自动清空掉,并且再也无法恢复。
使用得比较多的RAM种类有:DRAM(Dynamic RAM,动态随机存取存储器):这是最普通的RAM,一个电子管与一个电容器组成一个位存储单元,DRAM将每个内存位作为一个电荷保存在位存储单元中,用电容的充放电来做储存动作,但因电容本身有漏电问题,因此必须每几微秒就要刷新一次,否则数据会丢失。
存取时间和放电时间一致,约为2~4ms。
因为成本比较便宜,通常都用作计算机内的主存储器。
SRAM(Static RAM,静态随机存取存储器):静态,指的是内存里面的数据可以长驻其中而不需要随时进行存取。
每6颗电子管组成一个位存储单元,因为没有电容器,因此无须不断充电即可正常运作,因此它可以比一般的动态随机处理内存处理速度更快更稳定,往往用来做高速缓存。
SDRAM(Synchronous DRAM,同步动态随机存取存储器):这是一种与CPU实现外频Clock同步的内存模式,工作电压为3.3V。
所谓clock同步是指内存能够与CPU同步存取资料,这样可以取消等待周期,减少数据传输的延迟,因此可提升计算机的性能和效率。
DDR SDRAM(Double Data Rate二倍速率同步动态随机存取存储器):作为SDRAM的换代产品,它具有两大特点:其一,速度比SDRAM有一倍的提高;其二,采用了DLL(Delay Locked Loop:延时锁定回路)提供一个数据滤波信号。
mcs-51系列单片机基本结构与工作原理
![mcs-51系列单片机基本结构与工作原理](https://img.taocdn.com/s3/m/750493768e9951e79b892772.png)
寄存器间接寻址
直接寻址 直接寻址
直接寻址
寄存器寻址 寄存器间接寻址
(4)MOV 60H,@R1
表2-2 特殊功能寄存器SFR的名称及地址(一)
§ MCS-51的扩展应用
一、单片机扩展的基本概念 1、单片机最小系统:使单片机运行的最少器件构成的 系统,就是最小系统。 无ROM芯片:8031 必须扩展ROM,复位、晶振电路 有ROM芯片:89C51等,不必扩展ROM,只要有复位、 晶振电路 2、扩展使用的三总线: 地址总线:由外部程序存储器取指,P0-低8位; P2-高8位 数据总线:指令输入,P0 控制总线:RD、WR、 ALE、 PSEN
立即数寻址
变址间接寻址 相对寻址 位寻址
程序存储器(操作常数)
程序存储器(@A+DPTR、@A+PC) 程序存储器(修改了PC值) 内部数据存储器及特殊功能寄存器中 某些单元位
Example 判断下列指令各操作数的寻址方式
(1)MOV A , #65H
(2)MOV @R1,65H (3)MOV 30H,R2 寄存器寻址 立即数寻址
(读、 写、地址锁存允许、 外程序存储器读选通)
图2-5 8051特殊功能寄存器地址分布图
二、存储器的扩展
1、随机读写存储器RAM的扩展 :数据存储器一般采用RAM芯片, 这种存储器在电源关断后,存储的数据将全部丢失。有两大类: 动态RAM(DRAM),一般容量较大,易受干扰,使用略复杂。例 2116、2186 静态RAM(SRAM),在工业现场常使用SRAM,例:6264、6116
二、专用寄存器组
1、程序计数器 PC 16位计数器,指向程序存储器中被执行的指令所在的地址。本身没 有地址,在物理上独立。 寻址范围0000~FFFFH的64KB空间。 2、数据指针DPTR 16位地址指针,可寻址范围0000~FFFFH 的64KB空间,可指向程 序、数据存储器。 3、堆栈指针SP 8位地址寄存器,SP用来管理堆栈。它指向内部RAM的一个存储单 元,且总是指向栈顶单元。 MCS-51的堆栈是内部RAM中的一个部分,符合“先进后出、后进 先出”原则。 4、累加器ACC ACC是一个具有特殊用途的8位寄存器,主要用于存放操作数或运算 结果。8051指令系统中多数指令的执行都要通过累加器ACC进行。因此, 在CPU中,累加器的使用频率是很高的。也可简写累加器A。
STC51单片机EEPROM的使用方法
![STC51单片机EEPROM的使用方法](https://img.taocdn.com/s3/m/c5f2bec2172ded630b1cb65b.png)
STC51单片机EEPROM的使用方法STC51单片机有类似flash的功能EEPROM,可以掉电保存数据,不同型号的可以保存不同大小的数据,以12C5A60S2为例,EEPROM的大小为2K,分为两个扇区,掉电保存在很多地方需要。
首先寄存器的问题,不同系列的STC单片机的与EEPROM有关的寄存器不同,比如10/11/12系列的sfr ISP_DATA = 0xC2;sfr ISP_ADDRH = 0xC3;sfr ISP_ADDRL = 0xC4;sfr ISP_CMD = 0xC5;sfr ISP_TRIG = 0xC6;sfr ISP_CONTR = 0xC7;89/90系列的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触发命令也不相同,详情请看下方代码其次是关于扇区问题,不同型号的MCU扇区个数不尽相同,详情请查询数据手册,在这里我以12C5A60S2为例,一共2扇区,每扇区512B,地址区间为0x0000~0x03FF,使用时请勿超出范围。
EEPROM使用时有三个功能,分别为读、写、和擦除,由ISP_CMD寄存器控制,分别对应1/2/3下面为此项内容的代码部分,分别为初始化、读、擦除和写,本程序为11.0592MHz晶振,STC12C5A60S2的MCU,以下程序测试可用EEPROM.cvoid DisableEEPROM(void){ISP_CONTR = 0;//禁止ISP/IAP操作ISP_CMD = 0;//去除ISP/IAP命令ISP_TRIG = 0;//防止ISP/IAP命令误触发ISP_ADDRH = 0xff;//指向非EEPROM区,防止误操作ISP_ADDRL = 0xff;//指向非EEPROM区,防止误操作。
EEPROM
![EEPROM](https://img.taocdn.com/s3/m/f4c2c5858762caaedd33d44b.png)
EEPROM_write(4005,kk2);*/
}
}
if(PINF!=0XFF)
{
delayms(20);
if(PINF!=0xff)
AVR(ATMEGA128/16)内部EEPROM读写默认
下面这程序是128的
/****************************内部EEPROM头文件***************************/
#ifndef __eeprom_H__
#define __eeprom_H__
8、全局中断控制位GIE置1,放开总中断屏蔽位(如果打算利用EEIF中断功能)。
9、清除写操作允许位WREN,在本次写操作没有完毕之前禁止重开新的一次写操作。
10、当写操作完成时,控制位WR被硬件自动清零0,中断标志位EEIF被硬件自动置1。
如果本次写操作还没有完成,那么可以用软件查询EEIF位是否为1,或者查询WR位是否为0,来判定写操作是否结束。
/*EEPROM写子入程序*/
//写一个字节
void EEPROM_write(unsigned int Address, unsigned char Data)
{
while(EECR & (1<<EEWE)); /* 等待上一次写操作结束 */
EEAR = Address; /* 设置地址和数据寄存器*/
内部EEPROM读写操作步骤
从EEPROM中读取数据步骤:
1、把地址写入到地址寄存器EEADR中,注意该地址不能超过所用PIC1687X型号 单片机内部EEPROM实际容量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此文档共包含三个程序。
第一个程序最简单易懂,看懂了基本就会读写51单片机内部EEPROM了。
第二个程序和第一个读写EEPROM原理差不多,包含有LCD1602操作方法,有写字符串的方法。
第三个程序在原有基础上增加了外部中断功能,细心的人会发现,操作内部EEPROM 过程会将总中断关闭,实际上程序要用到中断时只需在原有的EEPROM操作后加上开总中断即可。
验证第二、第三个程序时需按程序内主程序中的操作说明进行烧录单片机,以验证是否成功操作单片机内部EEPROM。
程序1:/***************************************************************作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:Keil uVision4 V9.00***************************************************************///#include <STC89C52RC.H>#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/****************特殊功能寄存器声明****************/sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;sbit LED1 = P2^0;sbit LED2 = P2^1;sbit K1 = P3^2; //按钮1sbit K2 = P3^3; //按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*void main(void){uchar V;V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V == 2) {LED1=0;LED2=1;}else if(V == 6){LED1=0;LED2=0;}while(1){if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,2); // 对EEPROM区2002h写入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,6); // 对EEPROM区2002h写入6}}}*//*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void cc(uint addr){// 打开IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M) ISP_CONTR = 0x81;ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。
EA =0;ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,ISP_TRIG = 0xB9; // 再写入B9h,ISP/IAP命令才会生效。
_nop_();Q0(); // 关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:写一字节入口:addr = 扇区单元地址, dat = 待写入数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void xcx(uint addr,uchar dat){ISP_CONTR = 0x81;ISP_CMD = 0x02; // 用户可以对"Data Flash/EEPROM区"进行字节编程ISP_ADDRL = addr;ISP_ADDRH = addr>>8;ISP_DATA = dat; // 数据进ISP_DATAEA = 0;ISP_TRIG = 0x46;ISP_TRIG = 0xB9;_nop_();Q0(); // 关闭ISP/IAP}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:读一字节入口:addr = 扇区单元地址出口:dat = 读出的数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/uchar dcx(uint addr){uchar dat;ISP_CONTR = 0x81;ISP_CMD = 0x01; // 用户可以对"Data Flash/EEPROM区"进行字节读ISP_ADDRL = addr;ISP_ADDRH = addr>>8;EA = 0;ISP_TRIG = 0x46;ISP_TRIG = 0xB9;_nop_();dat = ISP_DATA; // 取出数据Q0(); // 关闭ISP/IAPreturn dat;}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:关闭ISP/IAP操作┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void Q0(){ISP_CONTR = 0; // 关闭IAP功能ISP_CMD = 0; // 待机模式,无ISP操作ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器}/*STC89C52RC内部EEPROM详细地址表:第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH第五扇区第六扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh*/程序2:/*************************************************************** 作品:EEPROM实验,开机还原关电前LED的亮灭状况单片机:STC89C52RC晶振:12M编译环境:Keil uVision4 V9.00***************************************************************/ //#include <STC89C52RC.H>#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/****************特殊功能寄存器声明****************/sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;sbit LED1 = P2^0;sbit LED2 = P2^1;sbit K1 = P3^2; //按钮1sbit K2 = P3^3; //按钮2void cc(uint addr);void xcx(uint addr,uchar dat);uchar dcx(uint addr);void Q0();#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endif/**********************************PIN口定义**********************************/#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;/**********************************函数声明**********************************//*在51单片机12MHZ时钟下的延时函数*/void Lcd1602_Delay1ms(uint c); //误差0us/*LCD1602写入8位命令子函数*/void LcdWriteCom(uchar com);/*LCD1602写入8位数据子函数*/void LcdWriteData(uchar dat) ;/*LCD1602初始化子程序*/void LcdInit();/*LCD1602写入字符串*/void LCDWrite_String(uchar x, uchar y,uchar z, uchar *s);/*设置LCD1602写入字符串的位置*/void LCD_set_xy(uchar x, uchar y, uchar z);uchar ON_Hour=0x07; //初始开灯时间07:00 1uchar Warning_TempH=32; //高温报警温度5/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*//*void main(void){uchar V;V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况if(V == 2) {LED1=0;LED2=1;}else if(V == 6){LED1=0;LED2=0;}while(1){if(!K1){while(!K1);LED1=0;LED2=1;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,2); // 对EEPROM区2002h写入2}if(!K2){while(!K2);LED1=0;LED2=0;cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2002,6); // 对EEPROM区2002h写入6}}}*/void main(void){LcdInit();//不注销下面三句,烧录一次//注销小面三句,再烧录一次//若两次烧录后现象一致,则操作内部EEPROM成功/////////////////////////////////////////////////////////////////cc(0x2000); // 擦除第1个扇区(2000h~21FFh)xcx(0x2000,ON_Hour); // 对EEPROM区2002h写入2xcx(0x2001,Warning_TempH); // 对EEPROM区2002h写入2/////////////////////////////////////////////////////////////////ON_Hour = dcx(0x2000);Warning_TempH = dcx(0x2001);if((ON_Hour==0x07)||(Warning_TempH==32)){LcdWriteCom(0x80);LCDWrite_String(0, 1, 7, "SUCCESS");}elseLCDWrite_String(0, 1, 5, "ERROR");while(1);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数:擦除某一扇区(每个扇区512字节)入口:addr = 某一扇区首地址┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/void cc(uint addr){// 打开IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M) ISP_CONTR = 0x81;ISP_CMD = 0x03; // 用户可以对"Data Flash/EEPROM区"进行扇区擦除ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,ISP_ADDRH = addr>>8; // ISP/IAP操作时的地址寄存器高八位。