欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 請教STC12C5608單片機EEPROM如何斷電保存多個數據 [打印本頁]

作者: kxcuser    時間: 2020-5-28 09:29
標題: 請教STC12C5608單片機EEPROM如何斷電保存多個數據
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三個參數,我現在只能按照例子保存一個參數,在上電讀出,請教各位高手


作者: kxcuser    時間: 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;
      }
    }
  }
}

作者: 上善若水001    時間: 2020-5-28 10:15
可以加個大電容,在斷電后短暫時間給單片機供電,完成保存數據
作者: 烈火    時間: 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;
                }
        }
}
作者: wulin    時間: 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);//從指定扇區首地址連續寫入
        }
作者: kxcuser    時間: 2020-5-28 11:34
麻煩管理員把這個帖子關了,我自己解決了
作者: ying鍝    時間: 2020-5-28 11:35
想掉電保存多個數據,用stc15系列或者STC8系列,有帶比較器功能的,檢測到掉電就觸發中斷才有足夠的數據保存數據。

_WXQPMGP@[$G7_1JE5[)5OI.png (217.74 KB, 下載次數: 122)

_WXQPMGP@[$G7_1JE5[)5OI.png

作者: kxcuser    時間: 2020-5-28 12:01
wulin 發表于 2020-5-28 10:52
unsigned char Temp[x]={......};//需要保存的數據
       
        IapEraseSector(ISP_ADDRESS);//擦除指定扇區

謝謝,現在是按指定的地址




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1