㈠ STC89C52单片机如何在运行时向EEPROM内写入数据,使数据断电后不消失,下次运行继续用.
1、首先打开电脑中的keil软件。
㈡ 单片机自身带的EEPROM怎么用,FLASH程序存储器怎么用
单片机自身一般只是带一种程序存储器,或者是EEPROM,或者是FLASH。
无论带的什么类型的程序存储器,都是来保存程序的。
“下载”的时候,把程序代码写入程序存储器;
“运行”的时候,CPU从程序存储器取出代码来执行。
程序存储器就是这么用。
㈢ 51单片机内部eeprom怎么使用,求大神指导,查过一些资料,但是看不明白
以下是我一个项目中关于STC12C5A60S2内部EEPROM的相关部分程序
;------------读写内部EEPROM定义区-----------------------
P4SW EQU 0BBH
P4 EQU 0C0H
IAP_DATA EQU 0C2H
IAP_ADDRH EQU 0C3H
IAP_ADDRL EQU 0C4H
IAP_CMD EQU 0C5H
IAP_TRIG EQU 0C6H
IAP_CONTR EQU 0C7H
;定义ISP/IAP命令
ISP_IAP_BYTE_READ EQU 1H ;字节读
ISP_IAP_BYTE_PROGRAM EQU 2H ;字节编程,可以将1写成0,要将1变成0,必须执行字节编程
ISP_IAP_SECTOR_ERASE EQU 3H ;扇区擦除,可以将0擦成1,要将0变成1,必须擦除整个扇区
ENABLE_IAP EQU 83H ;系统工作时钟<12MHz时,对IAP_CONTR寄存器设置此值
;------------------------------------------------
;读一字节,调用前需打开 IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;设置为IAP/ISP/EEPROM字节读模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
MOV A,IAP_DATA ;读出的数据在IAP_DATA单元中,送入累加器A
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
RET
;------------------------------------------------
;字节编程,调用前需打开 IAP 功能,入口:DPTR = 字节地址, A=须编程字节的数据
IAP_WRITE:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;设置为IAP/ISP/EEPROM字节编程模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
MOV IAP_DATA,A ;要编程的数据先送进ISP_DATA寄存器
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器改芦,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起帆歼旁动
NOP
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态态橡,
RET
;------------------------------------------------
;擦除扇区, 入口:DPTR = 扇区地址
IAP_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打开 IAP 功能, 设置 Flash 操作等待时间
MOV IAP_CMD,#03H ;设置为IAP/ISP/EEPROM扇区擦除模式命令
MOV IAP_ADDRH,DPH ;设置目标单元地址的高8位地址
MOV IAP_ADDRL,DPL ;设置目标单元地址的低8位地址
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP触发寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h后,ISP/IAP命令立即被触发起动
NOP
LCALL IAP_Disable ;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
RET
;------------------------------------------------
IAP_Disable:
;关闭 IAP 功能, 清相关的特殊功能寄存器,使CPU处于安全状态,
;一次连续的IAP操作完成之后建议关闭IAP功能,不需要每次都关
MOV IAP_CONTR,#0 ;关闭 IAP 功能
MOV IAP_CMD,#0 ;清命令寄存器,使命令寄存器无命令,此句可不用
MOV IAP_TRIG,#0 ;清命令触发寄存器,使命令触发寄存器无触发,此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高字节单元为00,指向非EEPROM区
MOV IAP_ADDRL,#0FFH ;送地址低字节单元为00,防止误操作
RET
㈣ 51单片机内部EEPROM使用求教
不知道你用的是哪款单片机,你可以看单片机的数据手册,应该会有详细到操作时序的介绍
针对STC15F4K系列单片机EEPROM使用实例如下:
单字节操作,串口发送
#include"reg51.h"
#include"intrins.h"
typedefunsignedcharBYTE;
typedefunsignedintWORD;
//-----------------------------------------------
sfrP1M1=0x91;//PxM1.n,PxM0.n=00--->Standard,01--->push-pull
sfrP1M0=0x92;//=10--->pureinput,11--->opendrain
sfrP0M1=0x93;
sfrP0M0=0x94;
sfrP2M1=0x95;
sfrP2M0=0x96;
sfrP3M1=0xB1;
sfrP3M0=0xB2;
sfrP4M1=0xB3;
sfrP4M0=0xB4;
sfrP5M1=0xC9;
sfrP5M0=0xCA;
sfrP6M1=0xCB;
sfrP6M0=0xCC;
sfrP7M1=0xE1;
sfrP7M0=0xE2;
sfrIAP_DATA=0xC2;//IAP数据寄存器
sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字节
sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字节
sfrIAP_CMD=0xC5;//IAP命令寄存器
sfrIAP_TRIG=0xC6;//IAP命令触发寄存器
sfrIAP_CONTR=0xC7;//IAP控制寄存器
#defineCMD_IDLE0//空闲模式
#defineCMD_READ1//IAP字节读命令
#defineCMD_PROGRAM2//IAP字节编程命令
#defineCMD_ERASE3//IAP扇区擦除命令
#defineURMD0//0:使用定时器2作为波特率发生器
//1:使用定时器1的模式0(16位自动重载模式)作为波特率发生器
//2:使用定时器1的模式2(8位自动重载模式)作为波特率发生器
sfrT2H=0xd6;//定时器2高8位
sfrT2L=0xd7;//定时器2低8位
sfrAUXR=0x8e;//辅助寄存器
//#defineENABLE_IAP0x80//ifSYSCLK<30MHz
//#defineENABLE_IAP0x81//ifSYSCLK<24MHz
#defineENABLE_IAP0x82//ifSYSCLK<20MHz
//#defineENABLE_IAP0x83//ifSYSCLK<12MHz
//#defineENABLE_IAP0x84//ifSYSCLK<6MHz
//#defineENABLE_IAP0x85//ifSYSCLK<3MHz
//#defineENABLE_IAP0x86//ifSYSCLK<2MHz
//#defineENABLE_IAP0x87//ifSYSCLK<1MHz
//测试地址
#defineIAP_ADDRESS0x0400
voidDelay(BYTEn);
voidIapIdle();
BYTEIapReadByte(WORDaddr);
voidIapProgramByte(WORDaddr,BYTEdat);
voidIapEraseSector(WORDaddr);
voidInitUart();
BYTESendData(BYTEdat);
voidmain()
{
WORDi;
P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P4M0=0x00;
P4M1=0x00;
P5M0=0x00;
P5M1=0x00;
P6M0=0x00;
P6M1=0x00;
P7M0=0x00;
P7M1=0x00;
P1=0xfe;//1111,1110系统OK
InitUart();//初始化串口
Delay(10);//延时
IapEraseSector(IAP_ADDRESS);//扇区擦除
for(i=0;i<512;i++)//检测是否擦除成功(全FF检测)
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=0xff)
gotoError;//如果出错,则退出
}
P1=0xfc;//1111,1100擦除成功
Delay(10);//延时
for(i=0;i<512;i++)//编程512字节
{
IapProgramByte(IAP_ADDRESS+i,(BYTE)i);
}
P1=0xf8;//1111,1000编程完成
Delay(10);//延时
for(i=0;i<512;i++)//校验512字节
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=(BYTE)i)
gotoError;//如果校验错误,则退出
}
P1=0xf0;//1111,0000测试完成
while(1);
Error:
P1&=0x7f;//0xxx,xxxxIAP操作失败
while(1);
}
/*----------------------------
软件延时
----------------------------*/
voidDelay(BYTEn)
{
WORDx;
while(n--)
{
x=0;
while(++x);
}
}
/*----------------------------
关闭IAP
----------------------------*/
voidIapIdle()
{
IAP_CONTR=0;//关闭IAP功能
IAP_CMD=0;//清除命令寄存器
IAP_TRIG=0;//清除触发寄存器
IAP_ADDRH=0x80;//将地址设置到非IAP区域
IAP_ADDRL=0;
}
/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTEIapReadByte(WORDaddr)
{
BYTEdat;//数据缓冲区
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_READ;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA;//读ISP/IAP/EEPROM数据
IapIdle();//关闭IAP功能
returndat;//返回
}
/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
voidIapProgramByte(WORDaddr,BYTEdat)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_PROGRAM;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_DATA=dat;//写ISP/IAP/EEPROM数据
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
扇区擦除
----------------------------*/
voidIapEraseSector(WORDaddr)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_ERASE;//设置IAP命令
IAP_ADDRL=addr;//设置IAP低地址
IAP_ADDRH=addr>>8;//设置IAP高地址
IAP_TRIG=0x5a;//写触发命令(0x5a)
IAP_TRIG=0xa5;//写触发命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
初始化串口
----------------------------*/
voidInitUart()
{
SCON=0x5a;//设置串口为8位可变波特率
#ifURMD==0
T2L=0xd8;//设置波特率重装值
T2H=0xff;//115200bps(65536-18432000/4/115200)
AUXR=0x14;//T2为1T模式,并启动定时器2
AUXR|=0x01;//选择定时器2为串口1的波特率发生器
#elifURMD==1
AUXR=0x40;//定时器1为1T模式
TMOD=0x00;//定时器1为模式0(16位自动重载)
TL1=0xd8;//设置波特率重装值
TH1=0xff;//115200bps(65536-18432000/4/115200)
TR1=1;//定时器1开始启动
#else
TMOD=0x20;//设置定时器1为8位自动重装载模式
AUXR=0x40;//定时器1为1T模式
TH1=TL1=0xfb;//115200bps(256-18432000/32/115200)
TR1=1;
#endif
}
/*----------------------------
发送串口数据
----------------------------*/
BYTESendData(BYTEdat)
{
while(!TI);//等待前一个数据发送完成
TI=0;//清除发送标志
SBUF=dat;//发送当前数据
returndat;
}
㈤ pic单片机EEPROM怎么编写程序
在你的C文件里引用EEPROM函数的头文件,eeprom_routines.h
然后在程序中使用
void eeprom_write(unsigned char addr, unsigned char value);
unsigned char eeprom_read(unsigned char addr);
这两个函数了。
这两个函数一个读一个写。比如你想写0x10到地址为0x55的EEPROM,
就写:eeprom_write(0x55,0x10);
同理,如果想读取0x55地址处的值,
就写:ee_value = eeprom_read(0x55);
如果编译时编译器提示找不到eeprom_routines.h,可以在
X:Program FilesHI-TECH SoftwarePICC9.81include 目录下找,然后复制到自己项目文件夹下。
对了,我用的是MPLab IDE,编译器使用的是PICC。