找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2208|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

向各位大佬學(xué)習(xí):這個(gè)單片機(jī)EEPROMD的例子無法保存數(shù)據(jù)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:706724 發(fā)表于 2023-2-28 22:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)是論壇的例子,在開發(fā)板將這個(gè)EEPROMD的例子進(jìn)行驗(yàn)證,發(fā)現(xiàn)無法保存關(guān)機(jī)前的LED 燈的狀態(tài)!不知道問題出在哪里?懇請(qǐng)高手指點(diǎn)一二!

單片機(jī)源程序如下:
  1. /***************************************************************
  2.     作品:EEPROM實(shí)驗(yàn),開機(jī)還原關(guān)電前LED的亮滅狀況
  3.   單片機(jī):STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/     
  7. //#include <STC89C52RC.H>
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define uchar unsigned char   
  11. #define uint unsigned int
  12. /****************特殊功能寄存器聲明****************/
  13. sfr ISP_DATA = 0xe2;   
  14. sfr ISP_ADDRH = 0xe3;     
  15. sfr ISP_ADDRL = 0xe4;   
  16. sfr ISP_CMD = 0xe5;   
  17. sfr ISP_TRIG = 0xe6;      
  18. sfr ISP_CONTR = 0xe7;
  19. sbit LED1 = P2^0;
  20. sbit LED2 = P2^1;
  21. sbit K1   = P3^2;                           //按鈕1
  22. sbit K2   = P3^3;                           //按鈕2
  23. void  cc(uint addr);
  24. void  xcx(uint addr,uchar dat);
  25. uchar dcx(uint addr);
  26. void  Q0();
  27. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  28. 函數(shù):主程序
  29. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

  30. void main(void)
  31. {
  32.    uchar V;
  33.    V = dcx(0x2002);                          // 開機(jī)讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
  34.    if(V == 2)          {LED1=0;LED2=1;}
  35.    else if(V == 6){LED1=0;LED2=0;}
  36.    while(1)
  37.      {
  38.       if(!K1)
  39.             {
  40.               while(!K1);
  41.               LED1=0;LED2=1;
  42.               cc(0x2000);                  // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
  43.               xcx(0x2002,2);          // 對(duì)EEPROM區(qū)2002h寫入2
  44.             }
  45.           if(!K2)
  46.             {
  47.               while(!K2);
  48.               LED1=0;LED2=0;
  49.               cc(0x2000);                  // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
  50.               xcx(0x2002,6);                          // 對(duì)EEPROM區(qū)2002h寫入6
  51.             }
  52.      }
  53. }
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2023-3-1 07:34 | 只看該作者
  1. /***************************************************************
  2.     作品:EEPROM實(shí)驗(yàn),開機(jī)還原關(guān)電前LED的亮滅狀況
  3.   單片機(jī):STC89C52RC
  4.     晶振:12M
  5. 編譯環(huán)境:Keil uVision4 V9.00
  6. ***************************************************************/     
  7. //#include <STC89C52RC.H>
  8. #include <reg52.h>
  9. #include <intrins.h>
  10. #define uchar unsigned char   
  11. #define uint unsigned int
  12. //定義ISP的操作命令
  13. #define RdCommand 0x01                //讀命令
  14. #define PrgCommand 0x02                //寫命令
  15. #define EraseCommand 0x03        //擦除命令
  16. #define WaitTime 0x01                 //定義CPU的等待時(shí)間,寫入硬件延時(shí)
  17. /****************特殊功能寄存器聲明****************/
  18. sfr ISP_DATA = 0xe2;   
  19. sfr ISP_ADDRH = 0xe3;     
  20. sfr ISP_ADDRL = 0xe4;   
  21. sfr ISP_CMD = 0xe5;   
  22. sfr ISP_TRIG = 0xe6;      
  23. sfr ISP_CONTR = 0xe7;

  24. sbit LED1 = P2^0;
  25. sbit LED2 = P2^1;
  26. sbit K1   = P3^2;                           //按鈕1
  27. sbit K2   = P3^3;                           //按鈕2

  28. /* ================ 打開 ISP,IAP 功能 ================= */
  29. void ISP_IAP_enable(void)
  30. {
  31.         EA = 0;       /* 關(guān)中斷   */
  32.         ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  33.         ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時(shí) */
  34.         ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  35. }
  36. /* =============== 關(guān)閉 ISP,IAP 功能 ================== */
  37. void ISP_IAP_disable(void)
  38. {
  39.         ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  40.         ISP_TRIG = 0x00;
  41.         EA   =   1;   /* 開中斷 */
  42. }
  43. /* ================ 公用的觸發(fā)代碼 ==================== */
  44. void ISPgoon(void)
  45. {
  46.         ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
  47.         ISP_TRIG = 0x46;  /* 觸發(fā)ISP_IAP命令字節(jié)1 */
  48.         ISP_TRIG = 0xb9;  /* 觸發(fā)ISP_IAP命令字節(jié)2 */
  49.         _nop_();
  50. }
  51. /* ==================== 字節(jié)讀 ======================== */
  52. unsigned char byte_read(unsigned int byte_addr)
  53. {
  54.         ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
  55.         ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  56.         ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
  57.         ISP_CMD   = ISP_CMD | RdCommand; /* 寫入讀命令 */
  58.         ISPgoon();       /* 觸發(fā)執(zhí)行  */
  59.         ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
  60.         return (ISP_DATA);    /* 返回讀到的數(shù)據(jù) */
  61. }
  62. /* ================== 扇區(qū)擦除 ======================== */
  63. void SectorErase(unsigned int sector_addr)
  64. {
  65.         unsigned int iSectorAddr;
  66.         iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
  67.         ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  68.         ISP_ADDRL = 0x00;
  69.         ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
  70.         ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
  71.         ISPgoon();       /* 觸發(fā)執(zhí)行  */
  72.         ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
  73. }
  74. /* ==================== 字節(jié)寫 ======================== */
  75. void byte_write(unsigned int byte_addr, unsigned char original_data)
  76. {
  77.         ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
  78.         ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  79.         ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
  80.         ISP_CMD  = ISP_CMD | PrgCommand;  /* 寫命令2 */
  81.         ISP_DATA = original_data;   /* 寫入數(shù)據(jù)準(zhǔn)備 */
  82.         ISPgoon();       /* 觸發(fā)執(zhí)行  */
  83.         ISP_IAP_disable();     /* 關(guān)閉IAP功能 */
  84. }
  85. void delayms(uint xms)  
  86. {
  87.         uint i,j;
  88.         for(i=xms;i>0;i--)
  89.                 for(j=120;j>0;j--);
  90. }

  91. /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
  92. 函數(shù):主程序
  93. ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/

  94. void main(void)
  95. {
  96.         uchar V;
  97.         V = byte_read(0x2002);             // 開機(jī)讀取EEPROM區(qū)2002h數(shù)據(jù),還原關(guān)電前LED的亮滅狀況
  98.         if(V == 2){LED1=0;LED2=1;}
  99.         else if(V == 6){LED1=1;LED2=0;}
  100.         else {LED1=0;LED2=0;}//首次上電EEPROM的默認(rèn)數(shù)據(jù)是0xff
  101.         while(1)
  102.         {
  103.                 if(!K1)
  104.                 {
  105.                         delayms(10);
  106.                         if(!K1)
  107.                         {
  108.                                 LED1=0;LED2=1;
  109.                                 while(!K1);//等待松手
  110.                                 SectorErase(0x2000);          // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
  111.                                 byte_write(0x2002,2);         // 對(duì)EEPROM區(qū)2002h寫入2
  112.                         }
  113.                 }
  114.                 if(!K2)
  115.                 {
  116.                         delayms(10);
  117.                         if(!K2)
  118.                         {
  119.                                 LED1=1;LED2=0;
  120.                                 while(!K2);//等待松手
  121.                                 SectorErase(0x2000);                  // 擦除第1個(gè)扇區(qū)(2000h~21FFh)
  122.                                 byte_write(0x2002,6);               // 對(duì)EEPROM區(qū)2002h寫入6
  123.                         }
  124.                 }
  125.         }
  126. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 2023-3-1 09:10 | 只看該作者
代碼不全,請(qǐng)重貼
回復(fù)

使用道具 舉報(bào)

地板
ID:996773 發(fā)表于 2023-3-1 15:39 | 只看該作者
c語言怎么這么長,測試eeprom不要整這些按鈕啥的,直接寫個(gè)八位數(shù)據(jù)存到2000H,

下次通電直接讀取出來發(fā)送到p0口八個(gè)指示燈看看就行了,新手寫程序一個(gè)按鈕延時(shí)

就可能把擦除過程給攪黃了。
回復(fù)

使用道具 舉報(bào)

5#
ID:706724 發(fā)表于 2023-3-4 10:44 | 只看該作者

這個(gè)例子,開機(jī)也總是回到默認(rèn)的狀態(tài)。LED1,LED2同時(shí)亮
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表