久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4503|回復: 7
打印 上一主題 下一主題
收起左側

關于STC單片機掉電存儲數據的問題,請求各位大佬們支招?

[復制鏈接]
跳轉到指定樓層
樓主
ID:792404 發表于 2022-6-4 15:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在用STC8G單片機測試掉電存儲的實驗,就是用秒表計數,通電后,秒表開始計數,斷電后保存斷電之前的秒數,下次通電要讀取斷電前的秒數繼續計數。我用的方法是每記一個數,就寫入EEPROM,但是這種方法不理想,很容易干擾數碼管顯示,小一點的數還可以用,大一點的數就不能用了,比如幾百、幾千的數。請求各位大佬們支招,有沒有更好的方法?                                                                                 
#include"STC8G.H"#include"EEPROM.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char

sbit sin=P3^5;
sbit sck=P3^6;
sbit rck=P3^7;

sbit duan1=P1^4;
sbit duan2=P1^5;
sbit duan3=P1^6;
sbit duan4=P1^7;


uchar code ledduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                                  0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
uint x,num;
uchar mb[2];
void delay(uint i)
{
   while(i--);
}

void hc595secondbyte(uchar dat)
{
   uchar a;
   sck=0;
   rck=0;
   for(a=0;a<8;a++)
   {
      sin=dat>>7;
          dat<<=1;
          sck=1;
          _nop_();
          _nop_();  
          sck=0;
   }
   rck=1;
   _nop_();
   _nop_();
   rck=0;
}

void display()
{
   uchar i;
   for(i=0;i<2;i++)
   {
         switch(i)
         {
              case(0):duan1=0;duan2=1;duan3=1;duan4=1;break;
              case(1):duan1=1;duan2=0;duan3=1;duan4=1;break;
         }
         hc595secondbyte(ledduan[mb[i]]);
         delay(500);
         hc595secondbyte(0xff);
   }
}

void datpros()
{
                mb[1]=num/10;
                mb[0]=num%10;                 
}


void main()
{   
        num=IapRead(1);

        P1M0=0X00;
        P1M1=0X00;
        P3M0=0X00;
        P3M1=0X00;
        P5M0=0X00;
        P5M1=0X00;

        TMOD=0X00;
        TL0=0X66;
        TH0=0Xfc;
        ET0=1;
        TR0=1;
        EA=1;

        while(1)
        {
            datpros();
            display();
        }                       
}

void T0_time() interrupt 1
{
   x++;       
   if(x==1000)
   {
          x=0;
          num++;
          IapErase(1);
          IapProgram(1,num);          
          if(num==60)
          num=0;
   }
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2022-6-5 08:31 | 只看該作者
STC8G在11.0592MHz擦寫一個扇區耗時大于50ms,遠大于你的中斷周期。不但干擾數碼管,也影響計時精度。
STC內置EEPROM是有壽命限制的,手冊標明擦寫次數可達 10 萬次以上。如果每秒記錄一次,可能持續兩天就報廢了。通常做法是利用芯片的外部中斷、低壓檢測、比較器、ADC等功能實時檢測電源電壓。一旦檢測到掉電,利用備用電池或濾波電容貯存的電能,立即把需要保存的數據寫入EEPROM,供下次上電時讀取使用。
回復

使用道具 舉報

板凳
ID:213173 發表于 2022-6-5 09:26 | 只看該作者
  1. #include"STC8G.H"
  2. #include"EEPROM.h"
  3. #include"intrins.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit sin=P3^5;
  7. sbit sck=P3^6;
  8. sbit rck=P3^7;

  9. sbit duan1=P1^4;
  10. sbit duan2=P1^5;
  11. sbit duan3=P1^6;
  12. sbit duan4=P1^7;


  13. uchar code ledduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
  14.                       0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  15. uint x,num;
  16. uchar mb[4];

  17. void Delay1ms()                //@11.0592MHz
  18. {
  19.         unsigned char i, j;

  20.         i = 15;
  21.         j = 90;
  22.         do
  23.         {
  24.                 while (--j);
  25.         } while (--i);
  26. }


  27. void hc595secondbyte(uchar dat)
  28. {
  29.         uchar a;
  30.         sck=0;
  31.         rck=0;
  32.         for(a=0;a<8;a++)
  33.         {
  34.                 sin=dat>>7;
  35.                 dat<<=1;
  36.                 sck=1;
  37.                 _nop_();
  38.                 _nop_();  
  39.                 sck=0;
  40.         }
  41.         rck=1;
  42.         _nop_();
  43.         _nop_();
  44.         rck=0;
  45. }

  46. void display()
  47. {
  48.         static uchar i=0;
  49.         mb[0]=ledduan[num/1000%10];
  50.         mb[1]=ledduan[num/100%10];
  51.         mb[2]=ledduan[num/10%10];
  52.         mb[3]=ledduan[num%10];
  53.         P1&=0x0f;        //消隱
  54.         P1|=0x10<<i;//位碼
  55.         hc595secondbyte(mb[i]);//段碼
  56.         i=++i%4;
  57.         Delay1ms();
  58. }
  59. /*
  60. void datpros()
  61. {
  62.         mb[1]=num/10;
  63.         mb[0]=num%10;
  64. }*/

  65. void main()
  66. {   
  67.         P1M0=0X00;
  68.         P1M1=0X00;
  69.         P3M0=0X00;
  70.         P3M1=0X00;
  71.         P5M0=0X00;
  72.         P5M1=0X00;
  73.         //1毫秒@11.0592MHz
  74.         AUXR |= 0x80;        //定時器時鐘1T模式
  75.         TMOD &= 0xF0;        //設置定時器自動重裝模式
  76.         TL0 = 0xCD;                //設置定時初始值
  77.         TH0 = 0xD4;                //設置定時初始值
  78.         TR0 = 1;                //定時器0開始計時
  79.         EA=1;                        //使能總中斷
  80.         ET0=1;                        //使能T0中斷
  81.     EX0 = 1;        //使能INT0中斷
  82.     IT0 = 1;        //使能INT0下降沿中斷

  83.         num=IapRead(0);//讀高8位
  84.         num<<=8;
  85.         num|=IapRead(1);//讀低8位
  86.         if(num==0xffff)//檢測是否初次上電
  87.                 num=0;

  88.         while(1)
  89.         {
  90. //                datpros();
  91.                 display();
  92.         }                        
  93. }

  94. void T0_time() interrupt 1
  95. {
  96.         x++;        
  97.         if(x==1000)
  98.         {
  99.                 x=0;
  100.                 num++;     
  101.                 if(num>9999)
  102.                         num=0;
  103.         }
  104. }
  105. //檢測外部掉電
  106. void INT0_Isr() interrupt 0
  107. {
  108.         IapErase(0);//擦除扇區(扇區首地址0x0000)
  109.         IapProgram(0,num>>8);//寫高8位數據
  110.         IapProgram(1,num);        //寫低8位數據
  111. }
復制代碼
回復

使用道具 舉報

地板
ID:792404 發表于 2022-6-5 11:58 | 只看該作者
wulin 發表于 2022-6-5 08:31
STC8G在11.0592MHz擦寫一個扇區耗時大于50ms,遠大于你的中斷周期。不但干擾數碼管,也影響計時精度。
STC ...

感謝指導,沒有仔細閱讀手冊,忽略了EEPROM擦寫次數的問題,難怪連續幾天就報廢了一個單片機,感謝,感謝!
回復

使用道具 舉報

5#
ID:792404 發表于 2022-6-5 12:02 | 只看該作者

感謝指點!已經用ADC功能檢測低壓的方法實驗了,目前很穩定,正在測試中。再次感謝老師的指導。
回復

使用道具 舉報

6#
ID:624769 發表于 2022-6-5 14:21 | 只看該作者
如果只是為了,掉電后的數據不丟失,反復擦寫 STC 的 Eeprom 是不合適的。

建議,使用STC的掉電中斷來對Eeprom進行掉電前的寫入,只要單片機有 22~47uf的低頻濾波,儲電足夠保存數據了。不需要增加額外硬件,只要多開一個中斷即可。

詳情可參考此帖:
http://www.zg4o1577.cn/bbs/dpj-213012-1.html
回復

使用道具 舉報

7#
ID:792404 發表于 2022-6-5 15:51 | 只看該作者
188610329 發表于 2022-6-5 14:21
如果只是為了,掉電后的數據不丟失,反復擦寫 STC 的 Eeprom 是不合適的。

建議,使用STC的掉電中斷來對 ...

感謝老師指導,已驗證此方法也挺好用的,感謝感謝!
回復

使用道具 舉報

8#
ID:64283 發表于 2022-6-5 22:29 | 只看該作者
你沒有處理好超過256之后的數,大于256后,你就要用到16位來做記憶,如果有更大的數,你就需要用更多的位來保存記憶值,你先處理好,超過256的數
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合激情av | 在线一区视频 | 国产亚洲精品精品国产亚洲综合 | 91在线中文字幕 | 国产精品久久久久久久久久久久 | 亚洲第一区国产精品 | 天堂在线www| 久久天堂网 | 中文成人无字幕乱码精品 | 91在线视频免费观看 | 国产一伦一伦一伦 | 五月激情婷婷在线 | 一区免费 | 日日碰狠狠躁久久躁婷婷 | 亚洲精品国产a久久久久久 午夜影院网站 | 2018国产精品 | 精品一区二区三区视频在线观看 | 一本色道精品久久一区二区三区 | 韩国欧洲一级毛片 | 欧美操操操 | 四虎影院在线免费观看 | 欧美国产精品 | 亚洲视频一区在线 | 婷婷免费在线 | www国产精| 北条麻妃一区二区三区在线观看 | 亚洲精品一区二区网址 | 自拍第一页 | 欧美激情视频网站 | 国产成人在线播放 | 欧美网址在线观看 | 欧美日韩国产不卡 | 欧美激情欧美激情在线五月 | 欧美一区二区三区国产精品 | 国产日韩一区二区 | 免费一区二区三区 | 91av精品 | 91精品国产综合久久久密闭 | 精品国产乱码久久久久久88av | 日韩精品a在线观看图片 | 黄网站色大毛片 |