当前位置:首页 > 单片机 > 单片机
[导读]STC89C51、52内部都自带有2K字节的EEPROM,54、55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次以上,先来介绍下ISP与IAP的区别和特点。ISP:In System Prog

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++;

}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机

在嵌入式系统开发中,单片机是不可或缺的重要组成部分。其中,STM32单片机和51单片机是两种常见的单片机芯片。本文将对比分析这两种单片机的区别,并探讨STM32单片机的优势。

关键字: stm32单片 51单片机

51单片机是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了许多品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基...

关键字: 51单片机 串行通信

51单片机是一种常见的微控制器,它具有串行通信接口(Serial Communication Interface,SCI)。通过串口通信接口,51单片机可以与其他设备或系统进行串行通信,实现数据传输和控制。

关键字: 51单片机 串口通信

Pic单片机和51单片机是两种应用广泛的微控制器,它们各自具有不同的特点和优势,选择哪种单片机取决于具体应用需求。下面将对Pic单片机和51单片机进行详细的介绍和对比。

关键字: PIC单片机 51单片机 单片机

北京2023年9月5日 /美通社/ -- 浪潮云海在2023年5月正式发布新一代InCloud Rail G7系列超融合一体机,其内置的InCloud dSAN超融合存储组件,基于新一代的硬件平台设计,支持全栈RDMA协...

关键字: IO 读写 软件 测试

随着电子信息技术的快速发展,串行通信在各种应用中得到了广泛的应用。其中,51单片机作为一种常见的嵌入式系统,具有低功耗、高性能、易于编程等特点,常用于各种自动化控制、数据采集等系统中。而PC机具有强大的数据处理能力和丰富...

关键字: 51单片机 PC机 串行通信

51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。

关键字: 51单片机 串口通信 半双工

步进电机是一种无刷电机,可将电脉冲转换为机械旋转。顾名思义,它根据输入脉冲逐步旋转,是现代数字程序控制系统中的主要执行元件。

关键字: 51单片机 步进电机 无刷电机
关闭
关闭