历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2018年08月22日 | STC89C52RC内部EEPROM的读写

2018-08-22 来源:eefocus

本例在win10操作系统下,使用keil4"c51v956"版本下完成




STC89C52RC的扇区分布:


/********STC89C52扇区分布*******

第一扇区:2000H--21FF

第二扇区:2200H--23FF

第三扇区:2400H--25FF

第四扇区:2600H--27FF

第五扇区:2800H--29FF

第六扇区:2A00H--2BFF

第七扇区:2C00H--2DFF

第八扇区:2E00H--2FFF

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


stc89c52rc内部EEPROM操作步骤:



1.擦除EEPROM


2.写EEPROM


3.读EEPROM




将字节写入EEPROM,然后从EEPROM读出字节并发送至串口,可以通过串口调试助手查看并验证


附代码:


主函数:


/**

  ******************************************************************************

  * @file    main.c

  * @author  waitstory

  * @version V1.0

  * @date    2018-4-11

  * @brief   STC89C52RC内部EEPROM的读写

  ******************************************************************************

  * @attention  

  *

  * 实验平台:STC89C52RC芯片,晶振11.0592MHz

  *

  ******************************************************************************

**/

 

#include

 

void InitUART(uint baud);       //串口初始化函数

void UartTXData(uchar str[]);   //串口发送函数

void Delay_ms(uint z);     //延时函数

 

uchar TxStr[3] = {0};

uchar dat[2] ={0x01,0x02};

 

/********STC89C52扇区分布*******

第一扇区:2000H--21FF

第二扇区:2200H--23FF

第三扇区:2400H--25FF

第四扇区:2600H--27FF

第五扇区:2800H--29FF

第六扇区:2A00H--2BFF

第七扇区:2C00H--2DFF

第八扇区:2E00H--2FFF

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

 

void main()

{

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

    byte_write(0x2001,dat[0]);   //在地址为0x2001的内存写入一个字节

    byte_write(0x2002,dat[1]);   //在地址为0x2002的内存写入一个字节

    Delay_ms(1000);       //延时1s

 

    InitUART(9600);         //串口初始化函数

 

    while(1)

    { 

        TxStr[0] = byte_read(0x2001);     //从地址0x2001读取一个字节

        TxStr[1] = byte_read(0x2002);     //从地址0x2002读取一个字节

 

        UartTXData(TxStr);     //将读取的字节发送至串口

 

        Delay_ms(2000);        //延时2s

    }

 

}

 

 

/* 串口配置函数,baud-通信波特率 */

void InitUART(uint baud)

{

    EA = 1;        //使能中断总开关

    SCON  = 0x50;  //配置串口为模式1

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x20;  //配置T1为模式2

    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值

    TL1 = TH1;     //初值等于重载值

    ET1 = 0;       //禁止T1中断

    ES  = 1;       //使能串口中断

    TR1 = 1;       //启动T1

}                                 

 

/*串口发送字符串函数*/

void UartTXData(uchar str[])

{   

    uchar i = 0;

    

    while(str[i] != '\0')

    {

        SBUF= str[i];

        i++;

        while(!TI);

        TI=0;

    }

}

 

/*延时函数*/

void Delay_ms(uint z)

{

   uint i,j;

   for(i=z;i>0;i--)

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

}

EEPROM头文件:


#ifndef _EEPROM_H_

#define _EEPROM_H_

 

#include

#include

 

typedef  unsigned int uint;

typedef  unsigned char uchar;

 

/********STC89C52扇区分布*******

第一扇区:2000H--21FF

第二扇区:2200H--23FF

第三扇区:2400H--25FF

第四扇区:2600H--27FF

第五扇区:2800H--29FF

第六扇区:2A00H--2BFF

第七扇区:2C00H--2DFF

第八扇区:2E00H--2FFF

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

 

#define RdCommand 0x01     //字节编程数据命令   

#define PrgCommand 0x02    //字节读数据命令   

#define EraseCommand 0x03  //扇区擦除数据命令

 

#define Error 1

#define Ok 0

#define WaitTime 0x01 //定义CPU的等待时间,40M以下为0,20M以下为1,10M以下为2,5M以下为3

 

/*****ISP/IAP特殊功能寄存器声明********/    

sfr ISP_DATA = 0xE2;

sfr ISP_ADDRH = 0xE3;

sfr ISP_ADDRL = 0xE4;

sfr ISP_CMD = 0xE5;

sfr ISP_TRIG = 0xE6;

sfr ISP_CONTR = 0xE7;

 

 

unsigned char byte_read(unsigned int byte_addr);

void byte_write(unsigned int byte_addr,unsigned char Orig_data);

void SectorErase(unsigned int sector_addr);

 

#endif

EEPROM的C文件:


#include "eeprom.h"

 

/**********打开ISP/IAP功能**************/   

void ISP_IAP_Enable(void)

{

    EA = 0;  //关中断  

    ISP_CONTR = ISP_CONTR & 0x18;  

    ISP_CONTR = ISP_CONTR | WaitTime; // 设置等待时间

    ISP_CONTR = ISP_CONTR | 0x80;   //允许ISP/IAP操作

}

 

/**********关闭ISP/IAP功能**************/   

void ISP_IAP_Disable(void)

{

ISP_CONTR = ISP_CONTR & 0x7f; //禁止ISP/IAP操作

     ISP_CMD = 0x00;    //去除ISP/IAP命令

ISP_TRIG = 0x00;   //防止ISP/IAP命令无触发

EA   =   1;        // 开中断 

}

 

/**********触发ISP/IAP**************/  

void ISPTrig(void)

{

ISP_TRIG = 0x46;  //先送46h,再送B9h到ISP/IAP触发寄存器,每次都需如此

ISP_TRIG = 0xb9;  //送完B9h后,ISP/IAP命令立即被触发启动

_nop_();

}

 

/**********字节读**************/

unsigned char byte_read(unsigned int byte_addr)

{

     unsigned char  dat = 0;    //读EEPROM数据缓存

 

EA = 0;     //关中断

ISP_ADDRH = (unsigned char)(byte_addr >> 8);     //送地址高字节

ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); //送地址低字节

     ISP_IAP_Enable();             //打开ISP/IAP功能

ISP_CMD   = ISP_CMD & 0xf8;   //清除ISP_CMD寄存器低3位

ISP_CMD   = ISP_CMD | RdCommand; //写入读数据命令 

ISPTrig();                //触发ISP/IAP

dat = ISP_DATA;           //将ISP_DATA寄存器中的数据保存起来

     ISP_IAP_Disable();        //关闭ISP/IAP功能 

EA  = 1;           //使能中断

return dat;        //返回读到的数据

}

 

/**********字节写**************/

void byte_write(unsigned int byte_addr,unsigned char Orig_data)

{

EA  = 0;  //关中断

ISP_ADDRH = (unsigned char)(byte_addr >> 8);       //送地址高字节

ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);   //送地址低字节

ISP_IAP_Enable();                   //打开ISP/IAP功能

     ISP_CMD  = ISP_CMD & 0xf8;         //清除ISP_CMD寄存器低3位

ISP_CMD  = ISP_CMD | PrgCommand;   //写入写数据命令 

ISP_DATA = Orig_data;      //写入数据到ISP_DATA寄存器

ISPTrig();                //触发ISP/IAP

ISP_IAP_Disable();        //关闭ISP/IAP功能 

EA =1;            //使能中断

}

/**********扇区擦除**************/

void SectorErase(unsigned int sector_addr)

{

EA = 0;   

ISP_ADDRH = (unsigned char)(sector_addr >> 8);        //送擦除地址高字节

ISP_ADDRL = (unsigned char)(sector_addr & 0x00ff);    //送擦除地址低字节

ISP_IAP_Enable(); 

     ISP_CMD = ISP_CMD & 0xf8;           //清除ISP_CMD寄存器低3位

ISP_CMD = ISP_CMD | EraseCommand;   //写入擦除数据命令

ISPTrig();       //触发ISP/IAP

ISP_IAP_Disable();    //关闭ISP/IAP功能 

 

}


实验结果:

将数据打印至串口,在电脑串口调试助手显示出来


推荐阅读

史海拾趣

Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

Emerson公司的发展小趣事

1954年至1973年,Emerson在总裁帕森斯的领导下,开始实施多元化战略。公司通过一系列并购活动,成功收购了包括威诺、美国电气电机、里奇工具等在内的36家公司,进一步拓宽了业务范围。同时,Emerson还注重研发和创新,通过不断推出新产品和技术,巩固了其在电气行业的领先地位。在此期间,公司的规模迅速扩大,从最初的2家工厂、4000名员工和5600万美元产值发展到82家工厂、31000名员工和8亿美元产值。

Gowanda Electronics公司的发展小趣事

进入21世纪后,Emerson继续坚持创新战略,通过不断研发新技术和产品,保持其在电气行业的领先地位。公司注重环保和可持续发展,推出了一系列高效节能的电气产品和解决方案。同时,Emerson还积极拥抱数字化和智能化趋势,通过引入人工智能、物联网等先进技术,推动公司业务的数字化转型。此外,Emerson还积极参与全球竞争和合作,通过跨国并购和战略合作,不断拓展其全球市场份额和影响力。

C-MAX Time Solutions公司的发展小趣事

C-MAX Time Solutions公司自创立以来,一直致力于电子时间同步技术的研发。在某一时期,公司推出了一款革命性的高精度时钟同步芯片,这款芯片凭借其卓越的稳定性和低延迟特性,迅速在通信、金融和交通等领域获得了广泛应用。这一技术创新不仅提升了C-MAX的市场竞争力,也推动了整个电子行业时间同步技术的发展。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

随着产品质量的不断提升和市场需求的不断扩大,ANSHAN公司开始积极拓展国内外市场。公司通过与国内外知名企业建立合作关系,参加国际电子产品展览会等方式,不断提升品牌知名度和影响力。同时,公司还注重售后服务体系建设,为客户提供全方位、高效的服务支持。这些举措有效提升了公司的市场竞争力,使ANSHAN成为电子行业中备受瞩目的品牌。

Cybernetic Micro Systems公司的发展小趣事

Cybernetic Micro Systems(简称CMS)的创始人李华,是一位热衷于电子技术的天才工程师。他在大学期间就研发出了一款高效能、低功耗的微处理器原型,这一成果引起了业界的广泛关注。毕业后,李华决定创业,将他的研究成果商业化。于是,Cybernetic Micro Systems应运而生,专注于研发和生产高性能的微处理器和配套设备。凭借独特的技术优势,CMS很快在电子行业中崭露头角。

问答坊 | AI 解惑

大家一起818 arm技术方面实用的网址吧

专业arm技术论坛 http://www.armjishu.com 嵌入式开源社区 http://www.oschina.net/project/tag/41 arm9开发社区   http://www.arm9bbs.com/ arm开发者论坛  http://www.armforum.cn/ FPGA/CPLD综合  http://www ...…

查看全部问答>

一种新型螺旋滤波器

一种新型螺旋滤波器…

查看全部问答>

新手咨询关于WinCE如何从存储卡上读取excel文件?

新手咨询关于WinCE如何从存储卡上读取并打开excel文件?能给一个用C语言或者java语言的示例代码吗?谢谢了。…

查看全部问答>

共同学习TMS320F28027

最近刚开始学习TMS320F28027,不过它的中文学习资料不多! 希望大家多多在论坛里交流啊 发个自己做的TMS320F28027代码生成器,不过只是GPIO部分,不知道有没有问题,请大家口下留情啊…

查看全部问答>

STM32F103VCFSMC驱动ILI9325问题

求STM32F103VC FSMC驱动ILI9325的代码 自己弄了下没成功 PD0-15 --->D0-15 NOE ------>RD NWE ------>WR NE1 ------>CS A23 ------>RS PC12 ----->RESET #define RST_PIN (*((volatile unsigned int *) 0x422201B ...…

查看全部问答>

关于C6711的电源模块

在开发板上1.8v和3.3v的电源模块比较复杂。请问有没有简单一点就能够实现的方法?并且tps56100等芯片比较难买。我手头只有TPS75833KTTT。有没有方法就用这个芯片实现电源呢?谢谢大家啊…

查看全部问答>

关于C语言地址指针的问题

比如C51可作如下定义:  code uchar x[4]={ //x定义在代码区 0x01,0x02, 0x03,0x04, }; uchar xdata *p   ...…

查看全部问答>

9*10000=24464,为什么?

学习编程时遇到一个古怪的问题,9*10000=24464,百思不得其解,望高手指点一下! 为便于各位测试,特写了一段小程序,仿真模式下运行到断点处观察各个temp的值 #include "msp430x14x.h" unsigned char value[] = {9,9,9,9,9,9,9,9,9}; uns ...…

查看全部问答>

430里面的icclbutl.h为什么编译出错

文件可以打开,且不能在里面修改,编译出现问题,不知道怎么回事…

查看全部问答>

51单片机定时器工作在方式2的一些疑问

定时器工作在方式2时TH向TL自动重装时要多久,需要为此延时吗?…

查看全部问答>