• STC51单片机21——EEPROM测试


    STC89C51RC系列单片机内部EEPROM详细地址表:
    第一扇区                   第二扇区                    第三扇区                    第四扇区
    起始地址  结束地址   起始地址   结束地址   起始地址   结束地址   起始地址    结束地址
    2000h      21FFh       2200h       23FFh      2400h       25FFh       2600h        27FFH
    第五扇区                    第六扇区                     第七扇区                    第八扇区
    起始地址   结束地址   起始地址   结束地址    起始地址   结束地址   起始地址    结束地址
    2800h       29FFh       2A00h      2BFFh        2C00h      2DFFh      2E00h        2FFFh

    #include
    #include
    #define uchar unsigned char    
    #define uint unsigned int

    sbit LED1 = P1^0;
    sbit LED2 = P1^1;
    sbit K1   = P1^2;               //按钮1
    sbit K2   = P1^3;               //按钮2

    void  cc(uint addr);
    void  xcx(uint addr,uchar dat);
    uchar dcx(uint addr);
    void  Q0();

    /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
    函数:主程序
    ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
    void main(void)
    {
       uchar a;

       a = dcx(0x2002);              // 开机读取EEPROM区2002h数据,
       if(a == 2)      {LED1=0;LED2=1;}
       else if(a == 6){LED1=0;LED2=0;}

       while(1)
         {
          if(!K1)
            {
              while(!K1);
              LED1=0;LED2=1;
              cc(0x2000);          // 擦除第1个扇区(2000h~21FFh)
              xcx(0x2002,2);      // 对EEPROM区2002h写入2
             }

          if(!K2)
            {
              while(!K2);
              LED1=1  ;LED2=0;
              cc(0x2000);          // 擦除第1个扇区(2000h~21FFh)
              xcx(0x2002,6);      // 对EEPROM区2002h写入6
            }
         }
    }

    /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
    函数:擦除某一扇区(每个扇区512字节)
    入口:addr = 某一扇区首地址              
    ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
    void cc(uint addr)
    {    
                                  // 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
        ISP_CONTR = 0x81;          // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
        ISP_CMD   = 0x03;          // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
        ISP_ADDRL = addr;         // ISP/IAP操作时的地址寄存器低八位,
        ISP_ADDRH = addr>>8;      // ISP/IAP操作时的地址寄存器高八位。
        EA =0;   
        ISP_TRIG = 0x46;          // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
        ISP_TRIG = 0xB9;          // 再写入B9h,ISP/IAP命令才会生效。
        _nop_();

        Q0();                      // 关闭ISP/IAP
    }
    /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
    函数:写一字节
    入口:addr = 扇区单元地址 , dat = 待写入数据
    ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
    void xcx(uint addr,uchar dat)
    {
        ISP_CONTR = 0x81;          
        ISP_CMD   = 0x02;          // 用户可以对"Data Flash/EEPROM区"进行字节编程
        ISP_ADDRL = addr;        
        ISP_ADDRH = addr>>8;      
        ISP_DATA  = dat;          // 数据进ISP_DATA
        EA = 0;
        ISP_TRIG = 0x46;          
        ISP_TRIG = 0xB9;          
      _nop_();
        Q0();                      // 关闭ISP/IAP
    }
    /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
    函数:读一字节
    入口:addr = 扇区单元地址
    出口:dat  = 读出的数据
    ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
    uchar dcx(uint addr)
    {   
        uchar dat;
        
        ISP_CONTR = 0x81;          
        ISP_CMD   = 0x01;         // 用户可以对"Data Flash/EEPROM区"进行字节读
        ISP_ADDRL = addr;         
        ISP_ADDRH = addr>>8;      
        EA = 0;
        ISP_TRIG = 0x46;          
        ISP_TRIG = 0xB9;          
        _nop_();
     dat = ISP_DATA;              // 取出数据
        Q0();                      // 关闭ISP/IAP               
        return dat;
    }
    /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
    函数:关闭ISP/IAP操作
    ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
    void Q0()
    {
        ISP_CONTR = 0;            // 关闭IAP功能
        ISP_CMD   = 0;            // 待机模式,无ISP操作
        ISP_TRIG  = 0;            // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
    }

     

  • 相关阅读:
    RK3399平台开发系列讲解(驱动篇)Regulator Framework
    python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True
    在Ubuntu服务器上,安装和使用Nginx和PHP7,以及部分排错方法
    mysql学习--binlog与gtid主从同步
    SQL必需掌握的100个重要知识点:组合 WHERE 子句
    【mysql】实现设置表中所有数据的update_time,要求每1000条设置在一天
    基于nodejs的在线跑腿系统-计算机毕业设计
    K8S上安装LongHorn(分布式块存储) --use
    如何使用CSS和JavaScript实施暗模式?
    玄子Share- IDEA 2023 SpringBoot 热部署
  • 原文地址:https://blog.csdn.net/fengyuzhe13/article/details/127817105