MOVC指令是从指令存储区读取数据,传统51单片机是不允许在运行中修改指令存取内容的(即IAP(In-Application Programming)功能,在应用中编程),也有一些单片机如PHILIPS单片机具有IAP功能,其指令存储区的内容可以在应用中修改,但也不是可以任意修改的。 P89C51RD2是Philips公司的80C51系列单片机中的佼佼者,具有1KB的片上RAM和64KB的片上内存;具有3种编程方式,即在系统编程ISP(InSystem Programming)、在应用中编程IAP(In-Application Programming)以及通过商用编程器的并行编程。
摘选有关内容转贴: 4 IAP功能的使用
4.1 程序空间用作数据空间
在一个实际的应用系统中,往往有一些关键性的数据需要保存,例如用户设置数据或重要的过程数据。目前的通过做法有两种:一种是在电路中扩展非易失性SRAM,多用在对时间要求比较苛刻的场合;另一种做法是扩展EEPROM(并行或串行)或类似存储器,多用在对时间要求不太荷刻的场合。这两种方法可达到掉电后数据不丢失的目的。
P89C51RD2具有64KB的片上闪存,这对于一般的应用来说足够大,往往会有剩余的闪存空间。在通常状况下,MCU的编程只能通过商用编程器来进行,那么剩余的闪存空间只能作为程序升级的备用空间,而不能作为数据空间;另一方面,如果需要保存数据,还要另外扩展存储器,这样不但增加了电路板的面积,而且增加了调试难度。
而P89C51RD2是一种具有IAP功能的单片机,其内存结构具有如下特点(见图1):
①闪存空间是分块的。64KB的内存空间共分5块,由低到高分别为8KB(BLOCK0)、8KB(BLOCK1)、16KB(BLOCK2)、16KB(BLOCK3)、16KB(BLOCK4);
②每一块都可以单独擦除;
③在程序中可以调用IAP功能,对闪存中的每一字节进行单独编程。
正是由于上述3个特点,在一些对时间要求不是很荷刻的场合,都可以将剩余的闪存空间作为数据空间来使用。例如,作者在海洋气象监测仪器的研制中,有些关键数据需要存储,如整点的风速、风向、温度、湿度、气压和降水量的瞬时值和十分钟平均值,以及最值、极值、大风段等。而数据的采集要求3s采集1次,采集处理时间大约需要0.5s,则剩余的时间内就可以利用IAP功能来存储数据。这些存储的数据可以通过串口被上位机调用。
由于整个软件经汇编后大约20KB,因此,将地址为0000H~7FFFH的32KB内存空间作为程序空间,则可以仪器的升级预留足够的空间;而将8000H~0FFFFH的32KB闪存空间留作数据存储空间。由图1可以看出,从8000H~0FFFFH的32KB闪存空间由BLOCK3和BLOCK4两块组成,每一块为16KB,足可以存储10天的数据量。在实际操作中,将BLOCK3和BLOCK4轮流使用,当10天的数据量存满其中一块时,通过程序跳转到另一块中,在使用前先将该块擦除。这样BLOCK3和BLOCK4每过20天便分别被擦除和重写1次。对有关地址定义如下:
ADDR_L EQU 30H ;被编程数据的低8位地址
ADDR_L EQU 31H ;被编程数据的高8位地址
DATA_TEMP EQU 32H ;被编程数据
ADDR_L,ADDR_H和DATA_TEMP的具体地址可以根据用户程序的实际情况进行定义;AUXR1,PGM_MTP的定义同前。有关子程序为:
擦除BL0CK3
ERSBLOCK3: ;BLOCK3擦除
MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件
MOV R0,#11 ;晶振为11.0592MHz,取11
MOV R1,#01H ;R1=01H,块擦除
MOV DPTR,#8000H ;擦除BLOCK3
LCALL PGM_MTP ;调用,无返回参数
RET
擦除BL0CK4
EPSBLOCK4: ;BLOCK4擦除
MOV AUXR1,#20 ;AUXR1的位ENBOOT=1,寻址到固件
MOV R0,#11 ;晶振为11.0592MHz,取11
MOV R1,#01H ;RI=01H,块擦除
MOV DPTR,#0C000H ;擦除BLOCK4
LCALL PGM_MTP ;调用,无返回参数
RET
字节编程
WRDATA:
MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件
MOV R0,#11 ;晶振为11.0592MHz,取11
MOV R1,#02H ;R1=02H,字节编程功能
MOV DPH,ADDR_H ;高8位地址
MOV DPL,ADDR_L ;低8位地址
MOV A,DATA_TEMP ;被编程数据
LCALL PGM_MTP ;调用,返回参数ACC=0,调用成功,非0调用失败
RET
读闪存字节内容
RDDATA:
MOV AUXR1,#20H ;AUXR1的位ENBOOT=1,寻址到固件
MOV R0,#11 ;晶振为11.0592MHz,取11
MOV R1,#03H ;R1=03H,读闪存字节内容
MOV DPL,ADDR_L ;低8位地址
MOV DPH,ADDR_H ;高8位地址
LCALL PGM_TEMP ;调用,返回参数ACC中为读出字节内容
RET
将上述4个子程序结合实际情况灵活运用,便可以实现数据的有效存储,而且这些数据在掉电后是不丢失的,完全达到系统要求。 |