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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc89c52單片機eeprom問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:358460 發表于 2020-8-19 17:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
近期制作了一個計數器,想增加eeprom來掉電存儲。但是發現數碼管數字增加一次就不再增加(從512跳到2),不知是何故,求指教

#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
float c=2;
uchar duan[]={
          0x3f,  /*0*/
      0x06,  /*1*/
      0x5b,  /*2*/
      0x4f,  /*3*/
      0x66,  /*4*/
      0x6d,  /*5*/
      0x7d,  /*6*/
      0x07,  /*7*/
      0x7f,  /*8*/
      0x6f,   /*9*/
          0x00    //ximie
          };
sbit key=P3^2;//霍爾傳感器
sbit nnn=P1^7;//小數點dp控制位
unsigned long jishu=4294967295;
double meterd;
unsigned long meter;<font color="#ff0000">//在此以上是原來的,無誤</font>
/*eeprom<font color="#ff0000">(這些是復制的stc示例程序)</font>*/
/*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   0x81           //if SYSCLK<20MHz
//Start address for STC89C58xx EEPROM
#define IAP_ADDRESS 0x2000<font color="#ff0000">//這里已經改成89c52的eeprom地址</font>

/*MCU初始設置<font color="#ff0000">(開中斷)</font>*/
void init_MCU(void)         
{
         EX0=1;
         IT0=1;
         EA=1;
}

/*1ms delay*/
void delayms(uint xms)
{
uint timems;
for(;xms>0;xms--)
        for(timems=115;timems>0;timems--);
}
/*顯示*/
void display(uint dat)
{
uchar ge,shi,bai,qian;
ge=dat%1000%100%10;
shi=dat%1000%100/10;
bai=dat%1000/100;
qian=dat/1000;        
P2=0XF7;//個位
P1=duan[ge];
delayms(3);
P2=0XFB;//十位
P1=duan[shi];
delayms(3);
P2=0XFD;//百位
P1=duan[bai];
delayms(3);
P2=0XFE;//千位
P1=duan[qian];
delayms(3);
}
/*eeprom(<font color="#ff0000">也是示例程序</font>)*/
/*----------------------------
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
----------------------------*/
uchar IapReadByte(uint addr)
{
    uchar 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(uint addr, uchar 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(uint 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();
}

/*主程序(和原來一樣)*/
void main()
{
uint i;
init_MCU();
while(1)
{
meterd=jishu*c;
meter=meterd;
if (meter<10000)
{
P1=0X00;
P2=0XFE;
nnn=1;
delayms(3);
P2=0XFF;
display (meter);
}
else
{
P1=0X00;
P2=0XFD;
nnn=1;
delayms(3);
P2=0XFF;
display(meter/10);
}
}
}
void Int0() interrupt 0<font color="#ff0000">//這里面改了
{
delayms(50);
if(key==0)
{
jishu=IapReadByte(IAP_ADDRESS);
jishu++;  
    IapProgramByte(IAP_ADDRESS,jishu);
}
}



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

使用道具 舉報

沙發
ID:213173 發表于 2020-8-19 21:10 | 只看該作者
stc單片機的eeprom哪怕只寫1個字節也得先把整個扇區擦除才能正常寫入。如果只改寫某一個或多個字節就得把有效地址的數據全部讀出來保存,改變其中一個或多個數據后再將整個扇區擦除,把改變后的和原樣的數據一道按原地址寫回去。
void Int0() interrupt 0  
{
        delayms(50);
        if(key==0)
        {
                jishu=IapReadByte(IAP_ADDRESS);
                jishu++;  
                IapEraseSector(IAP_ADDRESS);//擦除扇區
                IapProgramByte(IAP_ADDRESS,jishu);
        }
}
回復

使用道具 舉報

板凳
ID:71233 發表于 2020-8-20 07:58 | 只看該作者
wulin 發表于 2020-8-19 21:10
stc單片機的eeprom哪怕只寫1個字節也得先把整個扇區擦除才能正常寫入。如果只改寫某一個或多個字節就得把有 ...

沒錯,讀寫STC內部eeprom麻煩變麻煩在這里
回復

使用道具 舉報

地板
ID:213173 發表于 2020-8-20 10:05 | 只看該作者
新新科技 發表于 2020-8-20 07:58
沒錯,讀寫STC內部eeprom麻煩變麻煩在這里

這是由于硬件材料的物理特性所致,Data Flash只能寫0不能寫1,只有全部擦除后全部都為1。
回復

使用道具 舉報

5#
ID:358460 發表于 2020-8-21 13:24 來自手機 | 只看該作者
謝謝大家的幫助。問題現在已經解決了,一個是大家所說的問題.需要先把整個扇區給擦掉才能寫。第二點是對eeprom操作時候要關掉系統的總中斷,我的程序是在中斷里邊兒直接就把中斷給關了,還沒有寫入進去,中斷就跳出。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日精品 | www久久久| 99热99| 亚洲免费精品 | 国产91久久久久蜜臀青青天草二 | a国产视频 | 羞羞羞视频 | 日本国产一区二区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品久久久一区二区三区 | 中文字幕亚洲区一区二 | 日韩欧美三级在线 | 久久精品国产一区二区三区 | 国产这里只有精品 | 欧美一极视频 | 日韩淫片免费看 | 欧美日韩亚洲视频 | 亚洲精品视频网站在线观看 | 91精品国产综合久久小仙女图片 | 欧美日韩在线综合 | 色综合一区 | 国产精品久久久久久久久久久久 | 国产精品视频一二三 | 日本大香伊一区二区三区 | 国产精品有限公司 | 人人干人人干人人 | 99福利视频 | 日韩欧美在线观看视频 | 精品久久久久久久久久久久久久 | 一级在线毛片 | 99精品欧美一区二区三区综合在线 | 一区二区三区国产精品 | 亚洲美女在线一区 | 99视频在线 | 中文在线一区二区 | 午夜精品在线 | 中文字幕av在线一二三区 | 精品视频99 | 精品一区二区三区免费毛片 | 日韩毛片播放 | www.9191.com|