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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

52單片機掉電存儲功能怎么通過代碼實現

[復制鏈接]
跳轉到指定樓層
樓主
ID:398949 發表于 2021-5-23 19:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
求STC89C52單片機關掉電源之后能把程序中的某個變量(比如說a)保存下來,下次啟動之后還是變成上次的數據。比如第一次用的時候a=100而關電源時是a=200,;那么下次開機時a=200....一次類推,不希望用到硬件功能
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:752974 發表于 2021-5-24 08:32 | 只看該作者
  52內部沒有EEPROM,要實現這個功能需要外掛個存儲器,如24系列。
回復

使用道具 舉報

板凳
ID:189235 發表于 2021-5-24 08:39 | 只看該作者

老鐵,STC89C52內部有4KEEPROM,下載軟件里面有例程
回復

使用道具 舉報

地板
ID:170318 發表于 2021-5-24 09:08 | 只看該作者
將a存儲到EEprom里,下次啟動后讀取這個值,并將這個值給a,接著這a的值繼續。如果有其它功能時,對讀取EEprom的值進行判斷,再執行下一步的工作
回復

使用道具 舉報

5#
ID:213173 發表于 2021-5-24 09:40 | 只看該作者
STC89C52單片機掉電之后,保存在EEPROM的數據不會丟失。但這里有一個問題,寫EEPROM是有一定壽命的,大約30萬次。為了在設備使用年限內不至于EEPROM失效,不宜太頻繁改寫EEPROM,只在掉電時把特定數據寫入EEPROM保存。如果完全不依賴硬件功能想達到掉電保存EEPROM不太可靠。因為寫EEPROM需要電源和時間。從單片機檢測到掉電到數據保存到EEPROM必須要使電源維持最低限度。通常是用較大的電解電容維持電源電壓數十ms。對此增加的成本可以忽略。
回復

使用道具 舉報

6#
ID:926217 發表于 2021-5-24 09:43 | 只看該作者
保存數據到flash
回復

使用道具 舉報

7#
ID:554500 發表于 2021-5-24 09:59 | 只看該作者
STC89C52內部沒有EEPROM,沒辦法掉電保存。總不能加個備用電源吧。
可以選STC其他系列的單片機,內部帶EEPROM的。這樣不就能解決了!
回復

使用道具 舉報

8#
ID:398949 發表于 2021-5-24 13:50 | 只看該作者
wulin 發表于 2021-5-24 09:40
STC89C52單片機掉電之后,保存在EEPROM的數據不會丟失。但這里有一個問題,寫EEPROM是有一定壽命的,大約30 ...

大佬,可以問一下這個電解電容維持電源可以不用嘛,只用低電壓檢測中斷是否可以保證數據寫入
回復

使用道具 舉報

9#
ID:213173 發表于 2021-5-24 14:33 | 只看該作者
universe 發表于 2021-5-24 13:50
大佬,可以問一下這個電解電容維持電源可以不用嘛,只用低電壓檢測中斷是否可以保證數據寫入

如果你有其它方法在掉電后還能維持VCC持續到寫完EEPROM當然可以不用電解電容。但目前還沒有哪個方案比這成本更低。
回復

使用道具 舉報

10#
ID:883031 發表于 2021-5-24 15:10 | 只看該作者
#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*Declare SFR associated with the IAP */
sfr IAP_DATA    =   0xE2;           //Flash data register
sfr IAP_ADDRH   =   0xE3;           //Flash address HIGH
sfr IAP_ADDRL   =   0xE4;           //Flash address LOW
sfr IAP_CMD     =   0xE5;           //Flash command register
sfr IAP_TRIG    =   0xE6;           //Flash command trigger
sfr IAP_CONTR   =   0xE7;           //Flash control register

/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE    0               //Stand-By
#define CMD_READ    1               //Byte-Read
#define CMD_PROGRAM 2               //Byte-Program
#define CMD_ERASE   3               //Sector-Erase

/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80           //if SYSCLK<40MHz
#define ENABLE_IAP   0x81           //if SYSCLK<20MHz
//#define ENABLE_IAP x82            //if SYSCLK<10MHz
//#define ENABLE_IAP 0x83           //if SYSCLK<5MHz

//Start address for STC89C58xx EEPROM
#define IAP_ADDRESS 0x08000

void Delay(BYTE n);
void IapIdle();
BYTE IapReadByte(WORD addr);
void IapProgramByte(WORD addr, BYTE dat);
void IapEraseSector(WORD addr);

void main()
{
    WORD i;

    P1 = 0xfe;                      //1111,1110 System Reset OK
    Delay(10);                      //Delay
    IapEraseSector(IAP_ADDRESS);    //Erase current sector
    for (i=0; i<512; i++)           //Check whether all sector data is FF
    {
        if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //If error, break
    }
    P1 = 0xfc;                      //1111,1100 Erase successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Program 512 bytes data into data flash
    {
        IapProgramByte(IAP_ADDRESS+i, (BYTE)i);
    }
    P1 = 0xf8;                      //1111,1000 Program successful
    Delay(10);                      //Delay
    for (i=0; i<512; i++)           //Verify 512 bytes data
    {
        if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)
            goto Error;             //If error, break
    }
    P1 = 0xf0;                      //1111,0000 Verify successful
    while (1);
Error:
    P1 &= 0x7f;                     //0xxx,xxxx IAP operation fail
    while (1);
}

/*----------------------------
Software delay function
----------------------------*/
void Delay(BYTE n)
{
    WORD x;

    while (n--)
    {
        x = 0;
        while (++x);
    }
}

/*----------------------------
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //Close IAP function
    IAP_CMD = 0;                    //Clear command to standby
    IAP_TRIG = 0;                   //Clear trigger register
    IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
    IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
}

/*----------------------------
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output:Flash data
----------------------------*/
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //Data buffer

    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_READ;             //Set ISP/IAP/EEPROM READ command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
    IapIdle();                      //Close ISP/IAP/EEPROM function

    return dat;                     //Return Flash data
}

/*----------------------------
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
       dat (ISP/IAP/EEPROM data)
Output:-
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_PROGRAM;          //Set ISP/IAP/EEPROM PROGRAM command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}

/*----------------------------
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:-
----------------------------*/
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //Open IAP function, and set wait time
    IAP_CMD = CMD_ERASE;            //Set ISP/IAP/EEPROM ERASE command
    IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
    IAP_ADDRH = addr >> 8;          //Set ISP/IAP/EEPROM address high
    IAP_TRIG = 0x46;                //Send trigger command1 (0x46)
    IAP_TRIG = 0xb9;                //Send trigger command2 (0xb9)
    _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
    IapIdle();
}

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区三区在线 | 欧美一区二 | 午夜在线视频一区二区三区 | 欧美在线国产精品 | 色精品视频 | 日日夜夜av| 最新91在线| 四虎影院在线免费观看 | a毛片视频网站 | 色综合久久88色综合天天 | 亚洲精品视频久久 | 一区精品在线观看 | 久在线 | 国产玖玖 | 一区二区亚洲 | 欧美成人h版在线观看 | 亚洲精选久久 | 丁香五月缴情综合网 | 色婷婷综合网站 | 欧美 中文字幕 | 中文字幕国产精品 | 亚洲国产二区 | 91欧美激情一区二区三区成人 | 91精品中文字幕一区二区三区 | 不卡视频在线 | 欧美日韩a | 国产精品视频网 | 一区二区三区视频免费观看 | 99久久久久 | 男女网站免费观看 | 日韩a视频| 一区二区三区国产好 | 国产精品99久久久久久动医院 | 精品无码久久久久久国产 | 国产精品视频一区二区三区四区国 | 亚洲视频www | 91精品久久久久 | 天堂在线91 | 免费中文字幕 | 91精品国产综合久久精品 | 成人在线一区二区 |