51单片机利用IAP技术对EEPROM的实现方法解析

发布者:xrmilk最新更新时间:2023-06-13 来源: elecfans关键字:51单片机  IAP技术  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。


ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上,不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给STC单片机下载程序,或给AT89S51单片机下载程序,这就是利用了ISP技术。


IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬件/软件上的)当片子在运行程序的时候可以提供一种改变flash数据的方法。通俗点讲,也就是说程序自己可以往程序存储器里写数据或修改程序。这种方式的典型应用就是用一小段代码来实现程序的下载,实际上单片机的ISP功能就是通过IAP技术来实现的,即片子在出厂前就已经有一段小的boot程序在里面,片子上电后,开始运行这段程序,当检测到上位机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦除这段ISP引导程序,否则恐怕以后再也下载不了程序了。STC单片机内部有几个专门的特殊功能寄存器负责管理ISP/IAP功能的,见表1。


表1 ISP/IAP相关寄存器列表

名称

地址

功能描述

D7

D6

D5

D4

D3

D2

D1

D0

复位值

ISP_DATA

E2h

Flash数据寄存器

1111 1111

ISP_ADDRH

E3h

Flash高字节地址寄存器

0000 0000

ISP_ADDRL

E4h

Flash低字节地址寄存器

0000 0000

ISP_CMD

E5h

Flash命令模式寄存器

--

--

--

--

--

MS2

MS1

MS0

xxxx x000

ISP_TRIG

E6h

Flash命令触发寄存器

xxxx xxxx

ISP_CONTR

E7h

ISP/IAP 控制寄存器

ISPEN

SWBS

SWRST

--

--

WT2

WT1

WT0

000x x000

ISP_DATA:ISP/IAP操作时的数据寄存器。

ISP/IAP从Flash读出的数据放在此处,向Flash写入的数据也需放在此处。

ISP_ADDRH:ISP/IAP操作时的地址寄存器高八位。

ISP_ADDRL:ISP/IAP操作时的地址寄存器低八位。

ISP_CMD:ISP/IAP操作时的命令模式寄存器,须命令触发寄存器触发方可生效。命令模式如表2所示。表2 ISP_CMD寄存器模式设置

D7

D6

D5

D4

D3

D2

D1

D0

模式选择

保留

命令选择

--

--

--

--

--

0

0

0

待机模式,无ISP操作

--

--

--

--

--

0

0

1

对用户的应用程序flash区及数据flash区字节读

--

--

--

--

--

0

1

0

对用户的应用程序flash区及数据flash区字节编程

--

--

--

--

--

0

1

1

对用户的应用程序flash区及数据flash区扇区擦除

程序在系统ISP程序区时可以对用户应用程序区/数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据Flash区(EEPROM)进行字节读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有ISP引导码,并设置为上电复位进入ISP程序区,并且出厂时就已完全加密。

ISP_TRIG:ISP/IAP操作时的命令触发寄存器。

在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG 先写入46h,再写入B9h,ISP/IAP命令才会生效。

STC89C52RC,STC89LE52RC单片机内部可用DataFlash(EEPROM)的地址如表3所示,其它型号单片机请查阅相关资料。

表3STC89C52RC、STC89LE52RC单片机内部EEPROM地址表

第一扇区

第二扇区

第三扇区

第四扇区

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

2000H

21FFH

2200H

23FFH

2400H

25FFH

2600H

27FFH

第五扇区

第六扇区

第七扇区

第八扇区

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

起始地址

结束地址

2800H

29FFH

2A00H

2BFFH

2C00H

2DFFH

2E00H

2FFFH

每个扇区为512字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区,方便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必须要擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。

下面通过一个例子来讲解STC系列单片机EEPROM的具体用法。

【例】:在实验板上实现如下描述,操作STC单片机自带的EEPROM,存储一组按秒递增的二位数据,并且将数据实时显示在数码管上,数据每变化一次就往EEPROM中写入一次,当关闭实验板电源,再次开启电源时,从EEPROM中读取先前存储的数据,接着递增显示。

#include

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

#define RdCommand 0x01 //定义ISP的操作命令

#define PrgCommand 0x02

#define EraseCommand 0x03

#define Error 1

#define Ok 0

#define WaitTime 0x01 //定义CPU的等待时间

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 dula=P2^6;//申明U1锁存器的锁存端

sbit wela=P2^7;//申明U2锁存器的锁存端

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar num;

void delayms(uint xms)

{

uint i,j;

for(i=xms;i》0;i--)//i=xms即延时约xms毫秒

for(j=110;j》0;j--);

}

void display(uchar shi,uchar ge)//显示子函数

{

dula=1;

P0=table[shi];//送十位段选数据

dula=0;

P0=0xff;//送位选数据前关闭所有显示,防止打开位选锁存时

wela=1;//原来段选数据通过位选锁存器造成混乱

P0=0xfe;//送位选数据

wela=0;

delayms(5); //延时

dula=1;

P0=table[ge];//送个位段选数据

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delayms(5);

}

void ISP_IAP_enable(void)

{

EA = 0;

ISP_CONTR =ISP_CONTR & 0x18;

ISP_CONTR =ISP_CONTR | WaitTime;

ISP_CONTR =ISP_CONTR | 0x80;

}

void ISP_IAP_disable(void)

{

ISP_CONTR =ISP_CONTR & 0x7f;

ISP_TRIG = 0x00;

EA=1;

}

void ISPgoon(void)

{

ISP_IAP_enable();

ISP_TRIG =0x46;

ISP_TRIG =0xb9;

_nop_();

}

unsigned char byte_read(unsigned int byte_addr)

{

ISP_ADDRH =(unsigned char)(byte_addr 》》 8);

ISP_ADDRL =(unsigned char)(byte_addr & 0x00ff);

ISP_CMD= ISP_CMD & 0xf8;

ISP_CMD= ISP_CMD | RdCommand;

ISPgoon();

ISP_IAP_disable();

return(ISP_DATA);

}

void SectorErase(unsigned int sector_addr)

{

unsigned intiSectorAddr;

iSectorAddr =(sector_addr & 0xfe00);

ISP_ADDRH =(unsigned char)(iSectorAddr 》》 8);

ISP_ADDRL =0x00;

ISP_CMD =ISP_CMD & 0xf8;

ISP_CMD = ISP_CMD| EraseCommand;

ISPgoon();

ISP_IAP_disable();

}

void byte_write(unsigned int byte_addr, unsigned charoriginal_data)

{

ISP_ADDRH =(unsigned char)(byte_addr 》》 8);

ISP_ADDRL =(unsigned char)(byte_addr & 0x00ff);

ISP_CMD= ISP_CMD & 0xf8;

ISP_CMD= ISP_CMD | PrgCommand;

ISP_DATA =original_data;

ISPgoon();

ISP_IAP_disable();

}

void main()

{

uchar a,b,num1;

TMOD=0x01; //设置定时器0为工作方式1(0000 0001)

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

EA=1;

ET0=1;

TR0=1;

num1=byte_read(0x2000);//程序开始时读取EEPROM中数据

if(num1》=60)//防止首次上电时读取出错

num1=0;

while(1)

{

if(num》=20)

{

num=0;

num1++;

SectorErase(0x2000);//擦除扇区

byte_write(0x2000,num1);//重新写入数据

if(num1==60)

{

num1=0;

}

a=num1/10;

b=num1;

}

display(a,b);

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

num++;

}


关键字:51单片机  IAP技术  EEPROM 引用地址:51单片机利用IAP技术对EEPROM的实现方法解析

上一篇:51单片机实现最小系统的原理和电路与编程设计说明
下一篇:导电材料温度测量系统的设计和实现方案

推荐阅读最新更新时间:2024-11-09 13:56

51单片机串口通信编程
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。 一、 pc机上的 串口通信编程过程如下: 1.建立项目 打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);
[单片机]
<font color='red'>51单片机</font>串口通信编程
51单片机开发中一些常用代码块
数码管中的16个字符 uchar code table ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; 延时函数(使用之前先声明一遍) void delay(uint); void delay(uint z) { uint x,y; for(x=z;x 0;x--) for(y=110;y 0;y--); } 点亮第一个二级管 #include reg52.h //点亮第一个发光二级管 sbit D1=P1^0;//P1是P1口,P1^0代表D1,D1为自己命名的变量 m
[单片机]
什么是51单片机最小系统
1.什么是51单片机 51 内核单片机是 指兼容Intel 的8051指令系统的单片机统称;从诞生到现在的几十年时间,已成为一款经过市场考验、成熟的芯片产品。目前国内也众多51单片机厂家,且还有众多带51内核,用于各种不同场景的专用类单片机。 51单片机内部框架: 以下以STC89C52单片机为例,其内部总体结构其基本特性如下: 8位CPU、4-8k 字节 ROM、128 字节 RAM、21 个特殊功能寄存器32根I/0线、可寻址的 64 字节外部数据、程序存贮空间、2个 16 位定时器计数器中断结构:具有二个优先级、五个中断源、一个全双工串行口、位寻址(即可对寄存器进行位操作)功能,能按位进行逻辑运算的位处理器。 除 1
[单片机]
什么是<font color='red'>51单片机</font>最小系统
51单片机-74HC595移位寄存器
1.74HC595芯片介绍 74HC595芯片是一个串行输入,并行输出设备。其内部包括一个8位移位寄存器、一个存储器以及三态输出门电路,其中移位寄存器和存储器都有相互独立的时钟,每当移位寄存器输入时钟SHCP上升沿来临之时,数据被移出。 1.1.引脚定义 引脚定义,怎么命名,并没有个统一的规则,所以每个人在绘制芯片引脚图时,根据个人习惯命名可能都不一样(如:14号引脚(DS/SER),10号引脚(MR/SCLR),11号引脚(SHCP/SCK),12号引脚(STCP/RCK)等);虽然命名可能不一样,但引脚的功能确是一样; 1.2.工作原理 工作方式1:将DS的数据,通过SHCP产生上升沿,一位位的移入移
[单片机]
<font color='red'>51单片机</font>-74HC595移位寄存器
51单片机利用Timer0实现十字路口交通灯
功能实现:当东西是绿灯时,南北是红灯,东西绿灯定时一段时间后变为黄灯闪烁三次,南北仍为黄灯,闪烁完后东西变为红灯,南北变为绿灯,定是一段时间后,南北变为黄灯闪烁三次(此时东西仍为红灯),闪烁三次后,南北变为红灯,东西变为绿灯。 proteus仿真原理图 汇编源代码: ORG 0000H LJMP MAIN ORG 000BH LJMP INTI0 ORG 0030H MAIN: MOV SP,#60H MOV B,#0AH MOV TMOD,#01H MOV TL0,#0B0H MOV TH0,#3CH MOV R3,#1H MOV P0,#0CH SETB
[单片机]
<font color='red'>51单片机</font>利用Timer0实现十字路口交通灯
51单片机,点亮LED灯和闪烁
1.关键字sfr与sbit的区别 sfr是定义寄存器的字节地址,sbit是定义可位寻址的位地址 例如:sfr P1 =0x90; sbit A = P1^0 sbit B = P1^1; 2. 单片机引脚有:电源引脚、晶振引脚、复位引脚、下载引脚、GPIO引脚 其中晶振引脚主要是用来提供外部时钟,驱动指令执行,GPIO引脚包含P0、P1、P2、P3 四个端口 3.点亮一个LED灯 从电路图可以得知,LED是P2端口,我们给P2.0针脚一个低电压,也就是0V,就会点亮第一个,程序如下 #include reg52.h //引用头文件 int main() { P2
[单片机]
<font color='red'>51单片机</font>,点亮LED灯和闪烁
基于8051单片机的温湿度采集系统设计
通过前面的学习,我们学会了如何用串口发送数据和接收固定字节的命令。今天,我们继续讨论串口应用协议,主要焦点还是在如何有效地使用串口发送数据。为了简化描述,假设我们基于8051单片机开发一个温湿度采集系统,周期将温度和湿度数据上报到上位机。温度和湿度定义如下: float temperature = 25.0; //温度 float humidity = 70.0; //湿度 我们至少可以设计出以下两种不同的串口应用协议: 1.固定大小的消息:先发送float类型的温度,再发送float类型的湿度。每次传输8个字节。 温度(4字节) 湿度(4字节) 代码实现: // 固定消息发送温度和湿度函数 void se
[单片机]
基于80<font color='red'>51单片机</font>的温湿度采集系统设计
51单片机体验高阻态的详细步骤讲解
在51单片机的P0口工作在普通IO口模式下,为准双向IO口。而工作在第二功能状态下时,则为标准的双向IO口。由于双向IO口的输出,要求能输出高低电平,通常会采用互补推挽电路。 在第二功能状态下,51单片机P0口采用的是互补推挽的输出方式。何为互补推挽呢?下面是它的等效电路图。 当P0第二功能作为输出时,K1和K2两个开关轮流打开。K2闭合K1打开,就会输出高电平,并且其驱动能力很大,因为电子开关的阻值小(不像上拉电阻的值那么大)。反之K2打开,K1闭合,就会输出低电平。 两个开关交替导通,互为补充,“挽”是“拉”的意思,两个电子开关分别负责在IO口输出处“推”和“拉”电流,所以称为互补推挽。 这种IO口结构的优点很
[单片机]
用<font color='red'>51单片机</font>体验高阻态的详细步骤讲解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved