单片机
返回首页

STC89C52单片机内部EEPROM程序

2020-07-18 来源:51hei

实验外部存储期间不方便 看了内部有2K的数据


代码如下 .C文件可直接移植


#include

#include

#define Read   0x01                                        //读指令

#define Write  0x02                                        //写指令

#define Erase  0x03                                        //擦除指令

#define ENABLE_IAP   0x81                        //速度20Mhz

//操作完成一次之后 进入待机模式 等待下一次命令  无ISP操作

void ISP_IAP_disable(void)   

{   

    ISP_CONTR = 0x00;   

    ISP_CMD = 0x00;   

    ISP_TRIG = 0x00;   

}

//读一个字节   addr是读的地址

unsigned char ReadEeProm(unsigned int addr)

{

        unsigned char dat;

        ISP_CONTR = ENABLE_IAP;

        ISP_CMD = Read;

        ISP_ADDRH = (unsigned char)(addr>>8);

        ISP_ADDRL = (unsigned char)addr;

        ISP_TRIG = 0x46;

        ISP_TRIG = 0xB9;

        _nop_();

        ISP_IAP_disable();

        dat = ISP_DATA;

        return dat;

}

//擦除一个扇区的内容 addr擦除扇区的地址

void EraseEeProm(unsigned int addr)

{

        ISP_CONTR = ENABLE_IAP;

        ISP_CMD = Erase;

        ISP_ADDRH = (unsigned char)(addr>>8);

        ISP_ADDRL = (unsigned char)addr;

        ISP_TRIG = 0x46;

        ISP_TRIG = 0xB9;

        _nop_();

        ISP_IAP_disable();

}

//写一个字节的内容 addr地址 dat待写入数据

void WriteEeProm(unsigned int addr,unsigned char dat)

{

        //EraseEeProm(addr);    //一个字节需要先擦除这个扇区

        ISP_CONTR = ENABLE_IAP;

        ISP_CMD = Write;

        ISP_ADDRH = (unsigned char)(addr>>8);

        ISP_ADDRL = (unsigned char)addr;

        ISP_DATA = dat;

        ISP_TRIG = 0x46;

        ISP_TRIG = 0xB9;

        _nop_();

        ISP_IAP_disable();

}

//连续读多个字节 *str存储读到数据缓冲区  addr从哪个地址开始读 len读多少个字节

void Reading(unsigned char *str,unsigned int addr,unsigned char len)

{

        while(len--)

        {

                *str++ = ReadEeProm(addr++);

        }

}

void ValToString(unsigned char *str,unsigned int dat)

{

        unsigned char len = 0; //计算当前转换到多少

        unsigned char buf[5];

        do{

                buf[len] = dat%10 + '0';

                dat /=10;

                len++;

        }while(dat>0);

        

        while(len--)

        {

                *str++ = buf[len];

        }

        *str = '';

        

}


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 离子检测器电路分析

  • 一个简单的警笛电路图

  • 分享一个电网倾角计电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章