51单片机eeprom为什么不能断电保存,求发烧友们给看看??

2019-07-15 19:56发布

程序贴上,用595驱动数码管,数组显示按键按一下加一,要求加到几,断电之后继续显示几,求助烧友们帮忙看看程序,谢谢了
/*
************************************************************************************
Fuction:STC89C52单片机内部4K的EEPROM操作驱动
Software Designer:Jason
************************************************************************************
*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************定义命令字节******************/     
#define Read_COM    0x01                                         //字节读数据命令   
#define Prog_COM    0x02                                //字节编程数据命令   
#define Erase_COM    0x03                               //扇区擦除数据命令   
#define En_Wait_TIME    0x81                            //设置等待时间 ,并使能ISP/IAP      
#define Start_ADDRH 0x20                                //扇区地址高位   
#define Start_ADDRL 0x00                                //扇区地址低位
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;   
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;   
sfr ISP_CONTR = 0xe7;
/*****************关闭ISP&IAP功能*****************/  
sbit  SD=P3^5;
sbit  SCK=P3^7;
sbit  RCK=P3^6;
sbit  ADD=P1^7;
uchar i,u,n;

uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void  WR1_595(uchar num1)
{
    uchar date;  
   uchar b;
   date=num1;

  for(b=0;b<=7;b++)
    {
     if((date&0x80)==0x80)   //最高位为1,则向SDATA_595发送1
            SD=1;            //发出数据的最高位
         else  
            SD=0;
         
         date<<=1;               //左移位
         SCK=0;          
         _nop_();
         _nop_();
         SCK=1;            //产生上升沿
            }
}
void ISP_IAP_disable(void)   
{   
        ISP_CONTR = 0x00;   
    ISP_CMD = 0x00;   
    ISP_TRIG = 0x00;   
}   
/*********************字节读**********************/     
uchar Byte_read(uint byte_addr)   
{   
    EA = 0;                                             //关中断   
    ISP_CONTR = En_Wait_TIME;                   //开启ISP&IAP,并送等待时间   
    ISP_CMD = Read_COM;                         //送字节读命令字      
    ISP_ADDRH = (uchar)(byte_addr >> 8);              //送地址高字节   
    ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字节        
    ISP_TRIG = 0x46;                            //送触发命令字0x46   
    ISP_TRIG = 0xB9;                                                        //送触发命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //关闭ISP&IAP功能   
    EA = 1;                                     //开中断   
    return (ISP_DATA);   
}     
/*********************字节编程*********************/   
void Byte_program(uint byte_addr,uchar isp_iap_data)   
{   
    EA = 0;                                     //关中断   
    ISP_CONTR = En_Wait_TIME;                   //开启ISP&IAP,并送等待时间   
    ISP_CMD = Prog_COM;                         //送字节编程命令字      
    ISP_ADDRH = (uchar)(byte_addr >> 8);              //送地址高字节   
    ISP_ADDRL = (uchar)(byte_addr & 0x00ff);    //送地址低字节        
    ISP_DATA = isp_iap_data;                    //送数据进ISP_DATA   
    ISP_TRIG = 0x46;                            //送触发命令字0x46   
    ISP_TRIG = 0xB9;                                                        //送触发命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //关闭ISP&IAP功能   
    EA = 1;                                     //开中断      
}   

/*********************扇区擦除*********************/   
void Sector_erase(uint sector_addr)   
{   
    EA = 0;                                     //关中断   
    ISP_CONTR = En_Wait_TIME;                   //开启ISP&IAP;并送等待时间   
    ISP_CMD = Erase_COM;                        //送扇区擦除命令字      
    ISP_ADDRH = (uchar)(sector_addr >> 8);           //送地址高字节   
    ISP_ADDRL = (uchar)(sector_addr & 0X00FF);        //送地址低字节        
    ISP_TRIG = 0X46;                            //送触发命令字0x46  
    ISP_TRIG = 0XB9;                                                        //送触发命令字0xB9   
    _nop_();   
    ISP_IAP_disable();                          //关闭ISP&IAP功能   
    EA = 1;   
}

void main()   
{   
     TMOD = 0x01;
    TH0 = 0x4C;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
                u=Byte_read(0x2000);
while(1)
        {
                RCK=0;
                WR1_595(u);
                RCK=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                Sector_erase(0x2000);                 //扇区擦除
                Byte_program(0x2000,tab[n]);
           }
}  
void tim0() interrupt 1                                //中断函数
{

    TH0 = 0x4C;
    TL0 = 0x00;
//        t++;
        //if(t==20)
        //{
        //        t=0;

          if(ADD==1)
          {
                n++;
                if(n==11)
                        n=0;
                        }
       

}      

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。