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

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

QQ登錄

只需一步,快速開始

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

stc單片機(jī)程序 EEPROM無法寫入0和1

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:956872 發(fā)表于 2021-8-31 19:14 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
后面三種狀態(tài)都能寫入,掉電后正常讀取,為啥第一種狀態(tài)死活寫不進(jìn)去呢,返回的一直都是FF。我把數(shù)據(jù)全部加1后測(cè)試,上電后默認(rèn)第一種狀態(tài)點(diǎn)亮,也能掉電存儲(chǔ)了,其它幾種狀態(tài)都正常。當(dāng)num從0或1開始就無法正常寫入,第一種狀態(tài)上電默認(rèn)關(guān)閉,手動(dòng)點(diǎn)亮后掉電無法存儲(chǔ)。只有num從2開始才正常。

單片機(jī)源程序如下:
#include <STC15F2K60S2.H>  
#include <intrins.h>  
#include "eeprom.h"

sbit K1=P3^2;
sbit K2=P3^3;
sbit l1=P1^4;
sbit l2=P1^5;
sbit l3=P1^6;

static unsigned char num=0;        

void Delay30ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 2;
        j = 67;
        k = 183;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void init()//中斷初始化
{
        IT0=1;//外部中斷0 跳變觸發(fā)
        EX0=1;//外部中斷0 p32
        EA=1;
}

void init0() interrupt 0//中斷程序 K1
{        
        if(K1==0)
        {
                Delay30ms();
                 if(K1==0)
     num=num+1;
     if(num>4){num=1;}               
          while(!K1);}
}
void lsd0()
{
        while(1)
        {
                if(num!=1){return;}
                 P1=0xfe;
        }
}
void lsd1()
{
        while(1)
        {  l3=0;
                if(num!=2){return;}
                           P1=0xfd;}
        }

void lsd2()
{
        while(1)
        { l2=0;
                if(num!=3){return;}
                    P1=0xfb;}
        }
void lsd3()
{
        while(1)
        {
                P1=0xf7;
                     if(num!=4)
         {return;}
        }

}

void main()
{ char v;
        init();
        v=IapReadByte(IAP_ADDRESS);
        num=v+1;
        while(1)
        {
                 
               
                        switch(num)
                        {
                         case 1:lsd0();
                                       P1=0xfe;
                                      if(IapReadByte(IAP_ADDRESS)!=1)
                                                        {IapEraseSector(IAP_ADDRESS);             // 擦除扇區(qū)
               IapProgramByte(IAP_ADDRESS,1);}               
                                      break;
                         case 2:lsd1();
               P1=0xfd;
                                                         if(IapReadByte(IAP_ADDRESS)!=2)
               {IapEraseSector(IAP_ADDRESS);             // 擦除扇區(qū)
               IapProgramByte(IAP_ADDRESS,2);}                                       
                                      break;
                         case 3:lsd2();
                                       P1=0xfb;
                                                         if(IapReadByte(IAP_ADDRESS)!=3)
                                       {IapEraseSector(IAP_ADDRESS);             // 擦除扇區(qū)
               IapProgramByte(IAP_ADDRESS,3);        }
                                       break;//num++;
                         case 4:lsd3();
                                       P1=0xf7;
                                                         if(IapReadByte(IAP_ADDRESS)!=4)
                                       {IapEraseSector(IAP_ADDRESS);             // 擦除扇區(qū)
               IapProgramByte(IAP_ADDRESS,4);}
                                        break;
                                default:break;
                        
                        }
                        
        }         
}

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

使用道具 舉報(bào)

沙發(fā)
ID:57657 發(fā)表于 2021-8-31 23:13 | 只看該作者
請(qǐng)將 eeprom.h 里的內(nèi)容發(fā)上來
回復(fù)

使用道具 舉報(bào)

板凳
ID:57657 發(fā)表于 2021-8-31 23:22 | 只看該作者
寫EEPROM 1可以寫成0,0不可寫成1,只有擦除才可以恢復(fù)為1(0xFF),一次至少擦1扇區(qū)(512字節(jié))。
回復(fù)

使用道具 舉報(bào)

地板
ID:956872 發(fā)表于 2021-9-1 06:44 | 只看該作者
npn 發(fā)表于 2021-8-31 23:13
請(qǐng)將 eeprom.h 里的內(nèi)容發(fā)上來

#ifndef __EEPROM_H_
#define __EEPROM_H_

typedef unsigned char BYTE;
typedef unsigned int WORD;
#define     FOSC    11059200UL
#define     BAUD    115200

#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節(jié)讀命令
#define CMD_PROGRAM 2               //IAP字節(jié)編程命令
#define CMD_ERASE   3               //IAP扇區(qū)擦除命令

//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
//#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

//測(cè)試地址
#define IAP_ADDRESS 0x0400


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

#endif
回復(fù)

使用道具 舉報(bào)

5#
ID:956872 發(fā)表于 2021-9-1 06:47 | 只看該作者
npn 發(fā)表于 2021-8-31 23:22
寫EEPROM 1可以寫成0,0不可寫成1,只有擦除才可以恢復(fù)為1(0xFF),一次至少擦1扇區(qū)(512字節(jié))。

那就是說只有擦除后恢復(fù)默認(rèn)1,不能自己寫1是嗎,那就只能從2開始寫了?
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2021-9-1 06:49 | 只看該作者
  1. #include <STC15F2K60S2.H>  
  2. #include <intrins.h>  
  3. #include "eeprom.h"

  4. sbit K1=P3^2;
  5. sbit K2=P3^3;
  6. sbit l1=P1^4;
  7. sbit l2=P1^5;
  8. sbit l3=P1^6;

  9. static unsigned char num=0;        

  10. void Delay30ms()                //@11.0592MHz
  11. {
  12.         unsigned char i, j, k;
  13.         _nop_();
  14.         _nop_();
  15.         i = 2;
  16.         j = 67;
  17.         k = 183;
  18.         do
  19.         {
  20.                 do
  21.                 {
  22.                         while (--k);
  23.                 } while (--j);
  24.         } while (--i);
  25. }


  26. void init()//中斷初始化
  27. {
  28.         IT0=1;//外部中斷0 跳變觸發(fā)
  29.         EX0=1;//外部中斷0 p32
  30.         EA=1;
  31. }

  32. void init0() interrupt 0//中斷程序 K1
  33. {        
  34.         if(K1==0)
  35.         {
  36.                 Delay30ms();
  37.                 if(K1==0)
  38.                         num=num+1;
  39.                 if(num>4){num=1;}
  40.                 while(!K1);
  41.         }
  42. }

  43. void main()
  44. {
  45.         char v;
  46.         init();
  47.         num=IapReadByte(IAP_ADDRESS);//判斷數(shù)據(jù)在設(shè)定范圍
  48.         if(num>4||num<0)
  49.                 num=0;
  50.         v=num;        //數(shù)據(jù)保存在臨時(shí)變量v
  51.         P1=~num;//LED低電平顯示
  52.         while(1)
  53.         {
  54.                 if(num!=v)//判斷num有變化
  55.                 {
  56.                         IapEraseSector(IAP_ADDRESS);    // 擦除扇區(qū)
  57.                         IapProgramByte(IAP_ADDRESS,num);// 寫數(shù)據(jù)
  58.                         v=num;//數(shù)據(jù)保存在臨時(shí)變量v
  59.                         P1=~num;//LED低電平顯示
  60.                 }
  61.         }         
  62. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

7#
ID:57657 發(fā)表于 2021-9-1 07:46 | 只看該作者
PEB188 發(fā)表于 2021-9-1 06:47
那就是說只有擦除后恢復(fù)默認(rèn)1,不能自己寫1是嗎,那就只能從2開始寫了?

1是二進(jìn)制的1,懂?
回復(fù)

使用道具 舉報(bào)

8#
ID:879348 發(fā)表于 2021-9-1 08:18 | 只看該作者
先搞清楚基本概念
回復(fù)

使用道具 舉報(bào)

9#
ID:130230 發(fā)表于 2021-9-1 11:23 | 只看該作者
stc的不是eeprom是flash,擦除后才能重新寫。你這多半是擦除函數(shù)寫的有問題。
回復(fù)

使用道具 舉報(bào)

10#
ID:956872 發(fā)表于 2021-9-2 17:25 | 只看該作者
npn 發(fā)表于 2021-9-1 07:46
1是二進(jìn)制的1,懂?

搞不懂,實(shí)際測(cè)試反正寫0和1都有問題,只有從2開始寫才能達(dá)到我想要的效果
回復(fù)

使用道具 舉報(bào)

11#
ID:624769 發(fā)表于 2021-9-2 19:40 | 只看該作者
PEB188 發(fā)表于 2021-9-2 17:25
搞不懂,實(shí)際測(cè)試反正寫0和1都有問題,只有從2開始寫才能達(dá)到我想要的效果

我看你關(guān)于這類問題,開了好幾個(gè)帖子了。
建議:
你先別搞的這么復(fù)雜,寫個(gè)最簡單的串口發(fā)數(shù)據(jù),讓Eeprom寫,然后,讓Eeprom讀出來給你串口發(fā)回來。STC的下載器里有例程,你先確保能正確讀寫了,再搞其他的。
回復(fù)

使用道具 舉報(bào)

12#
ID:956872 發(fā)表于 2021-9-2 21:16 | 只看該作者
188610329 發(fā)表于 2021-9-2 19:40
我看你關(guān)于這類問題,開了好幾個(gè)帖子了。
建議:
你先別搞的這么復(fù)雜,寫個(gè)最簡單的串口發(fā)數(shù)據(jù),讓Eepr ...

現(xiàn)在不自己去輸入,直接寫入變量名,變量從1到100的,到是沒啥問題了,正常擦寫讀取了。也有可能之前讀取數(shù)值的地方改來改去改的有問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产特一级黄色片 | 久久国产高清 | 亚洲一区中文字幕 | 亚洲精品3 | av香港经典三级级 在线 | 亚洲一区影院 | 欧美精品久久久久 | aⅴ色国产 欧美 | 观看av | 超碰8| 色就是色欧美 | 欧美日韩在线一区二区 | 黄色一级视频免费 | 欧美一区二区三区在线看 | 色香婷婷 | 亚洲一区二区中文字幕在线观看 | 欧美精品二区 | 国产精品无码久久久久 | 中文字幕 国产 | 久久影音先锋 | 国产成人精品一区二区在线 | 91精品国产92| 色先锋影音 | 久久精品免费看 | 国产一区二区三区在线看 | 久久一级| 青青久久av北条麻妃海外网 | 国产精品成人在线播放 | 91pao对白在线播放 | 91久久国产综合久久91精品网站 | 无码日韩精品一区二区免费 | 欧美精品中文 | 日韩在线小视频 | 国产精品视频久久 | 视频一区在线观看 | 国产精品久久久久久久久免费桃花 | 久久精品99国产精品 | 高清视频一区二区三区 | 81精品国产乱码久久久久久 | 精品国产乱码久久久久久88av | 一二三四在线视频观看社区 |