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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助STC8A8K64S4A12單片機寫EEPROM,重啟后讀EEPROM數據錯誤

[復制鏈接]
跳轉到指定樓層
樓主
ID:343304 發表于 2020-2-21 20:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
內部晶振22.1184M,想實現啟動計數器,保存在EEPROM中(0x0000和0x0001中),測試數據初始值為605,通過szx變量保存,使用了共同體切分兩字節。
首次運行帶賦值時,TB燈亮,證明變量szx是正常的610以下值(應該為604).再重新寫入程序后(去除賦值部分,直接讀取EEPROM)TB燈滅,證明數值有錯誤,請問程序中哪個部分出了問題呢?難道還沒寫進EEPROM?



#define WT_24M 0x81    //EEPROM 24M晶振延時

sbit RR = P2^1;
sbit GG = P2^2;
sbit BB = P2^3;

sbit TA = P2^4;      
sbit TB = P2^5;      
sbit TC = P2^6;


unsigned int szx;        //EEPROM的計數器變量

void IapIdle()             //EEPROM 結束復位
{
  IAP_CONTR = 0;     //EEPROM 關閉IAP功能
  IAP_CMD = 0;                  //EEPROM 清除命令寄存器
  IAP_TRIG = 0;                  //EEPROM 清除觸發寄存器
  IAP_ADDRH = 0x80;         //EEPROM 將地址設置到非IAP區域
  IAP_ADDRL = 0;         //EEPROM
}





char IapRead(unsigned int addr) //EEPROM 讀取EEPROM數據 返回整個IapRead函數
{

  unsigned char dat;  

  IAP_CONTR = WT_24M;  //EEPROM 設定延時
  IAP_CMD = 1;                   //EEPROM 設定1讀取命令
  IAP_ADDRL = addr;           //EEPROM 指定要讀取的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要讀取的高地址
  IAP_TRIG = 0x5a;           //EEPROM 執行的觸發命令
  IAP_TRIG = 0xa5;           //EEPROM 執行的觸發命令
  _nop_();
  dat = IAP_DATA;           //EEPROM 讀取IAP賦值
  IapIdle();                   //EEPROM 關閉IAP功能

  return  dat;                   //EEPROM 返回整個IapRead函數
}



void IapProgram(unsigned int addr, unsigned char dat)         //EEPROM 把addr地址的資料寫成dat的內
{
  IAP_CONTR = WT_24M;  //EEPROM 設定延時
  IAP_CMD = 2;                   //EEPROM 設定2寫命令
  IAP_ADDRL = addr;           //EEPROM 指定要寫的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要寫的高地址
  IAP_DATA = dat;           //EEPROM 寫IAP數據
  IAP_TRIG = 0x5a;           //EEPROM 執行的觸發命令
  IAP_TRIG = 0xa5;           //EEPROM 執行的觸發命令
  _nop_();
  IapIdle();                   //EEPROM 關閉IAP功能
}


void IapErase(unsigned int addr)          //EEPROM 擦除EEPROM數據     
{
  IAP_CONTR = WT_24M;  //EEPROM 設定延時
  IAP_CMD = 3;                   //EEPROM 設定3擦除命令
  IAP_ADDRL = addr;           //EEPROM 指定要擦除的低地址
  IAP_ADDRH = addr>>8; //EEPROM 指定要擦除的高地址
  IAP_TRIG = 0x5a;           //EEPROM 執行的觸發命令
  IAP_TRIG = 0xa5;           //EEPROM 執行的觸發命令
  _nop_();
  IapIdle();                   //EEPROM 關閉IAP功能
}



void main()
{

  union hecheng                         //EEPROM 定義一個共同體
   {
    unsigned char qw[2];        //EEPROM qw有2個char           加入了unsigned
        unsigned int er;                  //EEPROM er是無字符整型
   }hc;                                  //EEPROM 共同體名稱為hc




  hc.qw[0]=IapRead(0x0000);         //EEPROM  讀0x0000到hc[0]
  hc.qw[1]=IapRead(0x0001);         //EEPROM  讀0x0002到hc[1]

  szx = hc.er;
//  szx = 605;    //首次編譯預賦值,保存在EEPROM中,下次重新編譯去除,并且不清除EEPROM中數據


  if(szx <= 585)
   {
    TC = 0x0;                                //EEPROM R38(LED)
        while(1);                                //EEPROM 判斷次數為,停止操作
   }

  szx--;
  hc.er = szx;


   IapErase(0x0000);                         //EEPROM  先擦除0x0000扇區
   IapProgram(0x0000,hc.qw[0]);         //EEPROM  寫hc[0]到0x0000
   IapProgram(0x0001,hc.qw[1]);         //EEPROM  寫hc[1]到0x0002

  hc.qw[0]=IapRead(0x0000);         //EEPROM  讀0x0000到hc[0]
  hc.qw[1]=IapRead(0x0001);         //EEPROM  讀0x0002到hc[1]

  if(szx == hc.er)
   {
    TA = 0x0;                                //EEPROM R34(LED)   }

  if(szx >= 610)
   {
    TB = 0x0;                                //EEPROM R36(LED)   }

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

使用道具 舉報

沙發
ID:213173 發表于 2020-2-21 23:06 | 只看該作者
STC單片機空白EEPROM的寄存器都是0xFF,上電讀EEPROM的數據不在特定范圍就認為是首次上電,寫初始數據到EEPROM。以后上電讀EEPROM的數據在特定范圍就不會改寫。這樣就不必分兩次下載程序。
樓主這個程序好像寫入的數據雖然是605,但最終得到的數據是未必是604。因為main()內沒有約束,執行完跳出后再入,直到滿足if(szx <= 585)條件程序才會停留在while(1);。
回復

使用道具 舉報

板凳
ID:343304 發表于 2020-2-22 09:03 | 只看該作者
wulin 發表于 2020-2-21 23:06
STC單片機空白EEPROM的寄存器都是0xFF,上電讀EEPROM的數據不在特定范圍就認為是首次上電,寫初始數據到EEP ...

很好的建議,已經使用,并且程序通過了~謝謝你!
回復

使用道具 舉報

地板
ID:537245 發表于 2021-7-30 16:26 | 只看該作者
wulin 發表于 2020-2-21 23:06
STC單片機空白EEPROM的寄存器都是0xFF,上電讀EEPROM的數據不在特定范圍就認為是首次上電,寫初始數據到EEP ...

感謝,看了一下就明白了,剛開始一直下載2次,第二次下載后讀數據總是不對
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频一区二区三区 | 国产精品美女在线观看 | 亚洲视频一区二区三区 | 久久久久久综合 | 久久精品视频免费观看 | 精品欧美一区二区在线观看视频 | 国产精品中文字幕一区二区三区 | 日韩视频观看 | 日本成人免费观看 | 一区二区三区精品视频 | 91中文字幕在线观看 | 成人性生交a做片 | 亚洲精品久久久久久国产精华液 | 国产91在线视频 | 狠狠干在线 | 二区视频 | 亚洲精品国产精品国自产在线 | 欧美一级淫片免费视频黄 | 国产一区二区电影 | 亚洲一区二区久久久 | 欧美日韩亚洲系列 | 日批的视频 | 国产高清不卡 | 久久久久国产一区二区 | 91成人午夜性a一级毛片 | 中文字幕一区二区三区四区五区 | 精品欧美一区二区三区久久久 | 欧美精品乱码久久久久久按摩 | 99伊人 | 玖玖玖在线 | 高清成人免费视频 | 成人在线视频一区二区三区 | 亚洲激情一区二区 | 免费人成在线观看网站 | 成人在线视频免费观看 | 中文字字幕一区二区三区四区五区 | 欧美日日| 91在线视频 | 精品视频网 | 日韩av免费看 | 在线中文字幕第一页 |