STC89c52rc单片机中怎么用EEPROM c语言的

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-27
STC89C52RC单片机:8K字节程序存储空间,512字节数据存储空间,内带2K字节EEPROM存储空间;它们分别存的是什么

8K的程序存储空间是下载你写的程序生成的HEX文件的,相当于C盘。512字节相当于内存,掉电后数据丢失,2K eeprom相当于硬盘,数据写入后掉电不丢失,但是要用iap程序写入数据

擦除EEROM某个扇区,比如第1个扇区(地址2000h~21FFh),再对扇区写入数据,上电再读取就好了。

以下是个参考实例:

/***************************************************************
EEPROM实验:保存关电前LED的亮灭状况
单片机:STC89C52RC 晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit K1 = P3^2; //按钮1
sbit K2 = P3^3; //按钮2
void 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)
{
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81; // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
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_DATA
EA = 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/IAP
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
ISP_CONTR = 0; // 关闭IAP功能
ISP_CMD = 0; // 待机模式,无ISP操作
ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
}

STC89C52RC,有4K的eepROM。

以下是我写的一个实例,你看看:
/***************************************************************
作品:EEPROM实验,开机还原关电前LED的亮灭状况
单片机:STC89C52RC
晶振:12M
编译环境:Keil uVision4 V9.00
***************************************************************/
#include <STC89C52RC.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit K1 = P3^2; //按钮1
sbit K2 = P3^3; //按钮2

void 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_DATA
EA = 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/IAP
return 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

  • 我现在用的是STC89C52RC这个单片机。
    答:方法一:确立一个简化算法,压缩图像编码,用时间复杂度换空间复杂度。方法二:片外扩展ROM,不过要浪费I/O口,用IIC、SPI的外部存储器可以少用几个I/O但没有并行的快。
  • stc89c52rc单片机怎么烧制程序
    答:1安装开发板的USB驱动程序 2电脑设备管理器 端口中设置端口号 3用ISP专用烧写软件(其中串口号与第二步中端口号一致)4下载用Keil编译好的HEX文件 5开发板冷启动 即一开一关 自己边想边试试
  • STC89C52RC芯片要捎写程序应该配置什么样的供电接口/USB?
    答:、关于ISP和IAP的概念:简单的讲,ISP模式是其它电路直接操作单片机的几根专用的端口(比如AT89S51的3根,但其不是JTAG口,只是硬件接口类似)完成烧录,属于硬件烧录模式;IAP模式是单片机通过串口接收到需要烧录的程序代码,然后进行“自编程”完成烧录。区别在“自编程”(关于ISP和IAP,可以看一下我以前...
  • STC89C52RC单片机定时计数器的工作方式有哪些
    答:方式0:13位定时器/计数器 方式1:16位定时器/计数器 方式2:8位初值自动重装的八位定时器/计数器 方式3:分成两个8位计数器(仅适用于T0,T1停止计数)由TMOD中的M0,M1控制工作于那种方式
  • stc89c52rc单片机怎样录入程序
    答:用USB转TTL模块,也就是STC单片机下载器,软件用STC-ISP V4.80版本 把图上的单片机换成你的STC89单片机就可以了,两者管脚是相同的
  • 求STC89C52单片机的详细资料?包括引脚功能,存储器等等的详细介绍,越...
    答:17、本实验板 板上带有外接电源接口 方便使用外接电源为单片机供电。18、实验板 带有 +5V 和地线扩展口 方便用户扩展其他外围电路时取电 发货清单 1、USB编程线(非串口线哦)、USB取电线各1条,您的电脑只需要有USB接口就可以了,十分适合没有并口和串口的电脑。2、STC89C52RC单片机1片。3、备用...
  • ...块stc89c52rc的单片机,电路布局不一样了,不懂怎么下手
    答:stc89c52rc本身就属于MCS51系列,同一系列的单片机引脚兼容,内核相同,编程语言相同。不同的只是运行速度、存贮器大小、多功能接口数量、扩展功能、程序下载方式等方面有微小差别。只要熟悉了51单片机基本原理和编程,用任一款基本是一样的。51单片机的一些典型应用电路都可以使用。具体功能简介:STC89C52是一种...
  • 用ch340模块给stc89c52rc烧录程序时具体连线和操作是什么
    答:CH340模块,是USB转TTL的,模块的VCC,GND,RXD,TXD,分别与单片机板的VCC,GND,P3.0,P3.1连接即可。还要去STC官网下载一个烧录软件,STC-ISP软件包,里面有CH340的驱动程序和安装说明,CH340模块需要安装驱动程序才能用。而STC-ISP不用安装,双击打开就能用的,软件里有烧录操作顺序。
  • STC89C52RC怎么接引脚形成正反转电路?
    答:电机正反转电路怎么接单片机,关键是看控制电机正反转电路是什么样的,通常用H桥电路,如下图所示,H桥电路需要两个控制端PWM1,PWM2,那接到单片机的任意两个IO脚就行了。
  • STC 89c52rc单片机代码
    答:/***为网友解答例程 波特率设置为9600,无奇偶校验,晶振11.0592MHz,STC89C52.单片机通过串口接收到 字符“a",单片机反馈”a"并打开p1.0 =1 。如果单片机持续30S 没收到“a" P1.0= 0 。存在问题:1.延时、端口 要根据你的实际情况改一下参数。2.上电or复位后,第一次P1.0=0的转换时间要...