找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2917|回复: 7
收起左侧

请教STC12C5608单片机EEPROM如何断电保存多个数据

[复制链接]
ID:136485 发表于 2020-5-28 09:29 | 显示全部楼层 |阅读模式
while(1)
  {
   mode();
   if(d==1)
    {
         CR=1;
         if((key1==1)&&(key3==0)&&(key4==0))
     {
         count1++;
         if(count1>8000)
          {
           count1=0;
           if(num>0)
            {
                 num=num-17;
                 if((key3==1)&&(key1==0))break;
                 CCAP3H=num;
                 delay(10);
                }
          }
        }
   if((key1==1)&&(key3==1))
    {
         count2++;
         if(count2>8000)
          {
            count2=0;
            if(num<0xFF)
             {
                  num=num+17;
                  if((key3==1)&&(key1==0))break;
                  CCAP3H=num;
                  delay(10);
                 }
          }
        }

  if((key4==1)&&(key1==1)&&(key3==0))
  {
   count3++;
   if(count3>20000)
    {
     count3=0;
         sum++;
         if((key3==1)&&(key1==0))break;
         if(sum==0x11)
          {
           sum=0x10;
          }
        }
  }
if(key2==1)
  {
   count4++;
   if(count4>20000)
    {
         count4=0;
         sum--;
         if((key3==1)&&(key1==0))break;


         if(sum==0x00)
          {
           sum=0x01;
          }
        }
  }

  switch(sum)
{
  //case 0x00:CCAP0H=0xFF;CCAP1H=0xFF;CCAP2H=0xFF;break;
  case 0x01:PWM1();break;
  case 0x02:PWM2();break;
  case 0x03:PWM3();break;
  case 0x04:PWM4();break;
  case 0x05:PWM5();break;
  case 0x06:PWM6();break;
  case 0x07:PWM7();break;
  case 0x08:PWM8();break;
  case 0x09:PWM9();break;
  case 0x0A:PWM10();break;
  case 0x0B:PWM11();break;
  case 0x0C:PWM12();break;
  case 0x0D:PWM13();break;
  case 0x0E:PWM14();break;
  case 0x0F:PWM15();break;
  case 0x10:PWM16();break;
  default:break;
}
  }
   if(d==0)
    {
         temp=0xFF;
     CCAP0H=temp;
     CCAP1H=temp;
     CCAP2H=temp;
     CCAP3H=temp;
         CR=0;
         delay(100);
    }

  }

/*----------------------------
关闭IAP
----------------------------*/
void IapIdle()
{
  ISP_CONTR = 0;                  //关闭IAP功能
  ISP_CMD = 0;                    //清除命令寄存器
  ISP_TRIG = 0;                   //清除触发寄存器
  ISP_ADDRH = 0x80;               //将地址设置到非IAP区域
  ISP_ADDRL = 0x00;
}

/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
uchar IapReadByte(uint addr)
{
  uchar dat;                       //数据缓冲区
  ISP_CONTR = ENABLE_ISP;         //使能IAP
  ISP_CMD = CMD_READ;             //设置IAP命令
  ISP_ADDRL = addr;               //设置IAP低地址
  ISP_ADDRH = addr  >> 8;          //设置IAP高地址
  ISP_TRIG = 0x46;                //写触发命令(0x5a)
  ISP_TRIG = 0xB9;                //写触发命令(0xa5)
  _nop_();                        //等待ISP/IAP/EEPROM操作完成
  dat = ISP_DATA;                 //读ISP/IAP/EEPROM数据
  IapIdle();                      //关闭IAP功能
  return dat;                     //返回
}

/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
----------------------------*/
void IapProgramByte(uint addr, uchar dat)
{
  ISP_CONTR = ENABLE_ISP;         //使能IAP
  ISP_CMD = CMD_PROGRAM;          //设置IAP命令
  ISP_ADDRL = addr;               //设置IAP低地址
  ISP_ADDRH = addr  >> 8;          //设置IAP高地址
  ISP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  ISP_TRIG = 0x46;                //写触发命令(0x5a)
  ISP_TRIG = 0xB9;                //写触发命令(0xa5)
  _nop_();                        //等待ISP/IAP/EEPROM操作完成
  IapIdle();
}

/*----------------------------
扇区擦除
----------------------------*/
void IapEraseSector(uint addr)
{
  ISP_CONTR = ENABLE_ISP;         //使能IAP
  ISP_CMD = CMD_ERASE;            //设置IAP命令
  ISP_ADDRL = addr;               //设置IAP低地址
  ISP_ADDRH = addr  >> 8;          //设置IAP高地址
  ISP_TRIG = 0x46;                //写触发命令(0x5a)
  ISP_TRIG = 0xB9;                //写触发命令(0xa5)
  _nop_();                        //等待ISP/IAP/EEPROM操作完成
  IapIdle();
}

要求同时保存参数d,num,sum三个参数,我现在只能按照例子保存一个参数,在上电读出,请教各位高手

回复

使用道具 举报

ID:136485 发表于 2020-5-28 09:44 | 显示全部楼层
void mode()  
{
if((key3==1)&&(key1==0))
  {
   delay(80);
   if((key3==0)&&(key1==0))
    {
     d++;
         IapEraseSector(ISP_ADDRESS);
         IapProgramByte(ISP_ADDRESS, d);
     if(d==2)
      {
       d=0;
      }
    }
  }
}
回复

使用道具 举报

ID:228467 发表于 2020-5-28 10:15 | 显示全部楼层
可以加个大电容,在断电后短暂时间给单片机供电,完成保存数据
回复

使用道具 举报

ID:744327 发表于 2020-5-28 10:16 | 显示全部楼层
void Uart_Send_Str(unsigned char str[],unsigned char len,bit mode)
{
        unsigned char k;
        if(mode == 1)
        {
                for(k = 0;k < len; k++)
                {
                        UartSend(48 + str[k]);
                }       
        }else
        {
                for(k = 0;k < len; k++)
                {
                        str[k] = 0;
                }
        }
}
回复

使用道具 举报

ID:213173 发表于 2020-5-28 10:52 | 显示全部楼层
kxcuser 发表于 2020-5-28 09:44
void mode()  
{
if((key3==1)&&(key1==0))

        unsigned char Temp[x]={......};//需要保存的数据
       
        IapEraseSector(ISP_ADDRESS);//擦除指定扇区
        for(i=0;i<x;i++}//x不大于512
        {
                IapProgramByte(ISP_ADDRESS+i, Temp);//从指定扇区首地址连续写入
        }
回复

使用道具 举报

ID:136485 发表于 2020-5-28 11:34 | 显示全部楼层
麻烦管理员把这个帖子关了,我自己解决了
回复

使用道具 举报

ID:723402 发表于 2020-5-28 11:35 | 显示全部楼层
想掉电保存多个数据,用stc15系列或者STC8系列,有带比较器功能的,检测到掉电就触发中断才有足够的数据保存数据。
_WXQPMGP@[$G7_1JE5[)5OI.png
回复

使用道具 举报

ID:136485 发表于 2020-5-28 12:01 | 显示全部楼层
wulin 发表于 2020-5-28 10:52
unsigned char Temp[x]={......};//需要保存的数据
       
        IapEraseSector(ISP_ADDRESS);//擦除指定扇区

谢谢,现在是按指定的地址
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表