stc90c52rc的eeprom读写

原文网址:http://www.willar.com/forum/forum_view.asp?view_id=28837

/******************************************************************
*                                                                 *
* ME850单片机开发系统扩展应用 -   读写 EEPROM 测试程序            *
*                                                                 *
* P2 端口8位LED显示                                               *
*                                                                 *
* MCU: STC90C52RC   晶振频率:11.0592MHz                          *
*                                                                 *
* 版本: V1.0 (2010/02/09)                                        *
* 作者:gguoqing  (Email: gguoqing@willar.com)                    *
* 网站:www.sofi-tech.com (硕飞科技)                              *
*       www.mcusj.com (伟纳单片机世界)                            *
* 邮箱:sofitech@tom.com                                          *
*                                                                 *
*【版权】Copyright(C) 深圳硕飞科技有限公司  All Rights Reserved   *
*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       *
*                                                                 *
*******************************************************************
*                                                                 *
* STC90C51RC的EEPROM地址:  2000H - 33FFH                          *
*                                                                 *
* 共有10个扇区,每个扇区512字节。                                 *
*                                                                 *
******************************************************************/

#include "STC90C51RC_RD.h"
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define RdCommand      0x01
#define PrgCommand     0x02
#define EraseCommand   0x03
#define WaitTime       0x01

sbit  K1 = P1^4;

/**********************************************************

延时子程序

**********************************************************/
void delayms(uint ms) 
{
  uint k;
  while(ms--)
  {
    for(k = 0; k < 114; k++);
  }
}


/**********************************************************

ISP_IAP 使能子函数

**********************************************************/
void ISP_IAP_enable(void)
{
   EA = 0;                             /* 关中断 */
   ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
   ISP_CONTR = ISP_CONTR | WaitTime;   /* 写入硬件延时 */
   ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1 */
}

/**********************************************************

ISP_IAP 禁止子函数

**********************************************************/
void ISP_IAP_disable(void)
{
   ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
   ISP_TRIG = 0x00;
   EA = 1; /* 开中断 */
}
/**********************************************************

ISP_IAP 触发子函数

**********************************************************/
void ISPgoon(void)
{
   ISP_IAP_enable();   /* 打开 ISP,IAP 功能    */
   ISP_TRIG = 0x46;    /* 触发ISP_IAP命令字节1 */
   ISP_TRIG = 0xb9;    /* 触发ISP_IAP命令字节2 */
   _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;       /* 清除低3位 */
   ISP_CMD = ISP_CMD | RdCommand;  /* 写入读命令*/

   ISPgoon();                      /* 触发执行*/
   ISP_IAP_disable();              /* 关闭ISP,IAP功能 */

   return (ISP_DATA);              /* 返回读到的数据 */
}

/**********************************************************

扇区擦除子函数

**********************************************************/
void sectorerase(unsigned int sector_addr)
{
   unsigned int iSectorAddr;
   iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
   ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
   ISP_ADDRL = 0x00;

   ISP_CMD = ISP_CMD & 0xf8;          /* 清空低3位 */
   ISP_CMD = ISP_CMD | EraseCommand;  /* 擦除命令3 */

   ISPgoon();                          /* 触发执行 */
   ISP_IAP_disable();                  /* 关闭ISP,IAP功能 */
}

/**********************************************************

字节写子函数

**********************************************************/
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
   ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */
   ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);

   ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
   ISP_CMD  = ISP_CMD | PrgCommand;     /* 写命令2 */
   ISP_DATA = original_data; /* 写入数据准备 */

   ISPgoon(); /* 触发执行 */
   ISP_IAP_disable(); /* 关闭IAP功能 */
}

/**********************************************************

主函数

**********************************************************/
void  main(void)
{
   uchar  num;
   uint  addr,n;

   while(1)
   {   
     if(K1 == 0)              //K1键按下
     {
       addr = 0x2000;         //EEPROM首地址
       sectorerase(addr);     //一次擦除一个扇区(512B)
   
       addr = 0x2000;         //EEPROM首地址
       for(n=0; n<256; n++)   //写入256个字节数据
       {
         byte_write(addr,n);
         addr++;
       }
       addr = 0x3200;         //EEPROM首地址
       sectorerase(addr);     //一次擦除一个扇区(512B)
       byte_write(0x33ff,0);  //写入一个字节
     }

     if(byte_read(0x33ff)==0)
     {
       addr = 0x2000;         //EEPROM首地址
       for(n=0; n<256; n++)   //读出256个字节数据
       {  
         num = byte_read(addr);
         P2 = ~num;           //送显示
         addr++;
         delayms(200);
       }
       P2 = 0xff;             //关闭LED显示
       addr = 0x3200;
       sectorerase(addr);     //一次擦除一个扇区(512B)
       byte_write(0x33ff,1);  //写入一个字节
     }
   } 
}

/*********************************************************/

STC90C51RC_RD.H文件:

 [ 点击下载 ]


注意:

要将 STC90C51RC_RD.H 文件与源程序文件放在同一文件夹内。




;*******************************************************************
;*                                                                 *
;* ME850单片机开发系统扩展应用 -   读写 EEPROM 测试程序            *
;*                                                                 *
;* P2 端口8位LED显示                                               *
;*                                                                 *
;* MCU: STC90C52RC   晶振频率:11.0592MHz                          *
;*                                                                 *
;* 版本: V1.0 (2010/02/09)                                        *
;* 作者:gguoqing  (Email: gguoqing@willar.com)                    *
;* 网站:www.sofi-tech.com (硕飞科技)                              *
;*       www.mcusj.com (伟纳单片机世界)                            *
;* 邮箱:sofitech@tom.com                                          *
;*                                                                 *
;*【版权】Copyright(C) 深圳硕飞科技有限公司  All Rights Reserved   *
;*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!       *
;*                                                                 *
;*******************************************************************
;*                                                                 *
;* STC90C51RC的EEPROM地址:  2000H - 33FFH                          *
;*                                                                 *
;* 共有10个扇区,每个扇区512字节。                                 *
;*                                                                 *
;*******************************************************************

;声明与ISP/EEPROM有关的特殊功能寄存器的地址

;**********************************************************

    ISP_DATA      EQU  0E2H
    ISP_ADDRH     EQU  0E3H
    ISP_ADDRL     EQU  0E4H
    ISP_CMD       EQU  0E5H
    ISP_TRIG      EQU  0E6H
    ISP_CONTR     EQU  0E7H

    ENABLE_ISP    EQU  83H    ;系统时钟<12MHz时,对IAP_CONTR寄存器设置此值

    RdCommand     EQU  0x01   ;读
    PrgCommand    EQU  0x02   ;编程(写)
    EraseCommand  EQU  0x03   ;擦除

;**********************************************************
       
    ORG   0000H
    LJMP  MAIN
    ORG   0050H

;**********************************************************

MAIN:
    MOV  P0,#0FFH
    MOV  P2,#0FFH

    MOV  DPTR, #2000H     ;将EEPROM起始地址送DPTR数据指针
    ACALL  Sector_Erase

    MOV  DPTR, #2000H     ;将EEPROM起始地址送DPTR数据指针
    MOV  R1,#0FFH
    MOV  A,#00H
WR_LOOP:
    ACALL Byte_Program
    INC  A
    INC  DPTR
    INC  R1
    CJNE  R1,#0FFH,WR_LOOP
RD_LOOP:
    MOV  DPTR, #2000H     ;将EEPROM起始地址送DPTR数据指针
    MOV  R1,#0FFH
    MOV  A,#00H
RD_LOOP1:
    ACALL Byte_Read
    CPL  A
    MOV  P2,A
    ACALL DELAY
    INC  DPTR
    INC  R1
    CJNE  R1,#0FFH,RD_LOOP1
    MOV  P2,#0FFH
ACALL DELAY
    AJMP  RD_LOOP

    RET

;**********************************************************

;读一字节子程序

;入口:DPTR=字节地址,返回:A=读出字节数据

;**********************************************************
Byte_Read:
    MOV  ISP_ADDRH,DPH         ;设置目标单元地址的高8位地址
    MOV  ISP_ADDRL,DPL         ;设置目标单元地址的低8位地址
    MOV  ISP_CMD,#RdCommand    ;设置为IAP/ISP/EEPROM字节读模式命令
   
    MOV  ISP_CONTR,#ENABLE_ISP ;打开 ISP 功能, 设置 Flash 操作等待时间
    MOV  ISP_TRIG,#46H
    MOV  ISP_TRIG,#0B9H        ;送完0B9后,ISP命令立即被触发起动
    NOP
    MOV  A,ISP_DATA            ;读出的数据在ISP_DATA单元中,送入累加器A
    ACALL ISP_Disable          ;关闭 ISP 功能
    RET

;**********************************************************

;字节编程子程序

;入口:DPTR=字节地址, A=须编程字节的数据

;**********************************************************
Byte_Program:
    MOV  ISP_ADDRH,DPH         ;设置目标单元地址的高8位地址
    MOV  ISP_ADDRL,DPL         ;设置目标单元地址的低8位地址
    MOV  ISP_CMD,#PrgCommand   ;设置为ISP/EEPROM字节编程模式命令

    MOV  ISP_DATA, A           ;要编程的数据先送进ISP_DATA寄存器
    MOV  ISP_CONTR,#ENABLE_ISP ;打开ISP功能, 设置Flash操作等待时间
    MOV  ISP_TRIG, #46H
    MOV  ISP_TRIG, #0B9H       ;命令立即被触发起动
    NOP
    ACALL ISP_Disable          ;关闭 ISP 功能, 清相关的特殊功能寄存器
    RET

;**********************************************************

;擦除扇区子程序

;入口: DPTR = 扇区地址

;**********************************************************
Sector_Erase:
    MOV  ISP_ADDRH, DPH        ;设置目标单元地址的高8位地址
    MOV  ISP_ADDRL, DPL        ;设置目标单元地址的低8位地址    
    MOV  ISP_CMD,#EraseCommand ;设置为ISP/EEPROM扇区擦除模式命令

    MOV  ISP_CONTR,#ENABLE_ISP ;打开ISP功能, 设置Flash操作等待时间
    MOV  ISP_TRIG, #46H
    MOV  ISP_TRIG, #0B9H       ;ISP命令立即被触发起动
    NOP
    NOP
    RET

;**********************************************************

; 关闭ISP功能子程序

;**********************************************************
ISP_Disable:
    MOV  ISP_CONTR,#00H        ;关闭 ISP 功能
    MOV  ISP_CMD,#00H          ;清命令寄存器
    MOV  ISP_TRIG,#00H
    RET 

;**********************************************************

; 延时子程序

;**********************************************************
DELAY:
    MOV  R6,#250
DEL1:
    MOV  R7,#230
DEL2:
    DJNZ R7,DEL2
    DJNZ R6,DEL1
    RET
       
;**********************************************************

STC90C51RC_RD.H
/* After is STC additional SFR */


sfr  P4  = 0xe8;
sbit P43 = P4^3;
sbit P42 = P4^2;
sbit P41 = P4^1;
sbit P40 = P4^0;


sfr  XICON = 0xc0;


sfr  WDT_CONTR = 0xe1;


sfr ISP_DATA  = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD   = 0xe5;
sfr ISP_TRIG  = 0xe6;
sfr ISP_CONTR = 0xe7;


/* Above is STC additional SFR */


/*--------------------------------------------------------------------------
REG51F.H


Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.


Modification according to DataSheet from April 1999
 - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/


/*  BYTE Registers  */
sfr P0   = 0x80;
sfr P1   = 0x90;
sfr P2   = 0xA0;
sfr P3   = 0xB0;
sfr PSW  = 0xD0;
sfr ACC  = 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL  = 0x82;
sfr DPH  = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0  = 0x8A;
sfr TL1  = 0x8B;
sfr TH0  = 0x8C;
sfr TH1  = 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;


/*  80C51Fx/Rx Extensions  */
sfr AUXR   = 0x8E;
sfr AUXR1  = 0xA2;
sfr SADDR  = 0xA9;
sfr IPH    = 0xB7;
sfr SADEN  = 0xB9;
sfr T2CON  = 0xC8;
sfr T2MOD  = 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;


/* PCA SFR
sfr CCON   = 0xD8;
sfr CMOD   = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
*/


/*  BIT Registers  */
/*  PSW   */
sbit CY   = PSW^7;
sbit AC   = PSW^6;
sbit F0   = PSW^5;
sbit RS1  = PSW^4;
sbit RS0  = PSW^3;
sbit OV   = PSW^2;
sbit P    = PSW^0;


/*  TCON  */
sbit TF1  = TCON^7;
sbit TR1  = TCON^6;
sbit TF0  = TCON^5;
sbit TR0  = TCON^4;
sbit IE1  = TCON^3;
sbit IT1  = TCON^2;
sbit IE0  = TCON^1;
sbit IT0  = TCON^0;


/*  IE   */
sbit EA   = IE^7;
sbit EC   = IE^6;
sbit ET2  = IE^5;
sbit ES   = IE^4;
sbit ET1  = IE^3;
sbit EX1  = IE^2;
sbit ET0  = IE^1;
sbit EX0  = IE^0;


/*  IP   */ 
/* sbit PPC  = IP^6;*/
sbit PT2  = IP^5;
sbit PS   = IP^4;
sbit PT1  = IP^3;
sbit PX1  = IP^2;
sbit PT0  = IP^1;
sbit PX0  = IP^0;


/*  P3  */
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD  = P3^1;
sbit RXD  = P3^0;


/*  SCON  */
sbit SM0  = SCON^7; // alternatively "FE"
sbit FE   = SCON^7;
sbit SM1  = SCON^6;
sbit SM2  = SCON^5;
sbit REN  = SCON^4;
sbit TB8  = SCON^3;
sbit RB8  = SCON^2;
sbit TI   = SCON^1;
sbit RI   = SCON^0;
             
/*  P1  */
/* PCA
sbit CEX4 = P1^7;
sbit CEX3 = P1^6;
sbit CEX2 = P1^5;
sbit CEX1 = P1^4;
sbit CEX0 = P1^3;
sbit ECI  = P1^2;
*/


sbit T2EX = P1^1;
sbit T2   = P1^0;


/*  T2CON  */
sbit TF2   = T2CON^7;
sbit EXF2  = T2CON^6;
sbit RCLK  = T2CON^5;
sbit TCLK  = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2   = T2CON^2;
sbit C_T2  = T2CON^1;
sbit CP_RL2= T2CON^0;


/*  CCON  */
/*  PCA
sbit CF    = CCON^7;
sbit CR    = CCON^6;


sbit CCF4  = CCON^4;
sbit CCF3  = CCON^3;
sbit CCF2  = CCON^2;
sbit CCF1  = CCON^1;
sbit CCF0  = CCON^0;
*/

好吧,就这些应该是足够的了。找个机会把这个测试一下。一共就没有多少的参数,不要存储的七零八落的。在片内总要好于片外的。而且,注意把片外的ram也最好干掉。由于有片外的并口io,要有auxr的更改。
                 eprom      xram        eeprom
STC90C52RC:     8K          512B       5K
STC90C54RD+:    16K         1280B      45K

内部的xram使用dptr,auxr=0
外部的io使用r1,r0,auxr=2

如果原设计把并口通讯去掉的话,使用io就可以了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STC8单片机读写内部EEPROM KEIL工程文件源码: /* STC8 内部EEPROM测试 从手册717页上可以看出 STC8的 EEPROM空间为1k 地址在0000h-03ffh 地址也是1024的大小 次程序结合手册 编写 大同小异 程序的主要目的是 先清楚地址0 到512 (一个扇区)的数据 然后读取 清楚扇区的数据 如果清楚成功 则读到的数据都为0xff 然后在向里写入 1-ff 1-ff 512个这样的字节 然后在读里面的字节 判断是否和写入的一样 整个过程都是通过串口在不停的上传给电脑 重点强调 更新数据一定是要先擦除整个扇区 才能更新 这是和外部E2的比较大的区别 但是和flash的写法差不多 要求 下载时 STC8 内部晶振为11.0592 电脑打开串口的波特率为9600 */ #include "stc8.h" #define u8 unsigned char #define u16 unsigned int #define CMD_IDLE 0 //空闲模式 #define CMD_READ 1 //IAP字节读命令 #define CMD_PROGRAM 2 //IAP字节编程命令 #define CMD_ERASE 3 //IAP字节擦除命令 #define ENABLE_IAP 0X82 //if SYSCLK<20MHz //测试地址 #define IAP_ADDRESS 0X0000 //从手册上可以看出 STC15F2K60S2的EEPROM地址是0x0000- 0x03ff 正好是1k的地址空间 sbit led=P5^5; //P3.5口LED灯定义 //延时函数 void delay(u8 n) { while(n--); } //关闭IAP void IapIdle() { IAP_CONTR=0; //关闭IAP功能 IAP_CMD =0; //清除命令寄存器 IAP_TRIG =0; //清楚触发寄存器 IAP_ADDRH=0X80; //将地址设置到非IAP区域 IAP_ADDRL=0; } //从ISP/IAP/EEPROM区域读取一个字节 u8 IapReadByte(u16 addr) { u8 dat; //数据缓冲区 IAP_CONTR=ENABLE_IAP; //使能IAP 同时设置等待时间 IAP_CMD=CMD_READ; //设置IAP命令 IAP_ADDRL=addr; //设置IAP低地址 IAP_ADDRH=addr>>8; //设置IAP高地址 IAP_TRIG=0X5a; //写触发命令(0x5a) 写触摸命令以后 命令才会生效 手册713页 IAP_TRIG=0Xa5; //写触发命令(0xa5) delay(10); //等待ISP/IAP/EEPROM操作完成 dat=IAP_DATA; //读ISP/IAP/EEPROM数据 IapIdle(); //关闭IAP功能 return dat; //返回 } //写一个字节数据到ISP/IAP/EEPROM区域 void IapProgramByte(u16 addr,u8 dat) { 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) 写触摸命令以后 命令才会生效 手册713页 IAP_TRIG=0Xa5; //写触发命令(0xa5) delay(10); //等待ISP/IAP/EEPROM操作完成 IapIdle(); //关闭IAP功能 } //扇区擦除 void IapEraseSector(u16 addr) { IAP_CONTR=ENABLE_IAP; //使能IAP 同时设置等待时间 IAP_CMD=CMD_ERASE; //设置IAP命令 IAP_ADDRL=addr; //设置IAP低地址 IAP_ADDR

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值