微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请大神帮忙指导下我这个程序为什么不能掉电保持数据

请大神帮忙指导下我这个程序为什么不能掉电保持数据

时间:10-02 整理:3721RD 点击:
#include <STC90C5xAD.H>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define RdCommand 0x01    //定义ISP的操作命令 读命令
#define PrgCommand 0x02    //对应用程序Flash区及数据Flash区字节编程
#define EraseCommand 0x03  //对应用程序Flash区及数据Flash区扇区擦除
#define Error 1
#define Ok  0
#define ENABLE_IAP 0x82 //定义CPU的等待时间
sfr IAP_DATA=0XE2;  //Flash数据寄存器
sfr IAP_ADDRH=0XE3;  //Flash高字节地址寄存器
sfr IAP_ADDRL=0XE4;  //Flash低字节地址寄存器
sfr IAP_CMD=0XE5;  //Flash命令模式寄存器
sfr IAP_TRIG=0XE6;  //Flash命令触发寄存器
sfr IAP_CONTR=0XE7;  //ISP/IAP控制寄存器
uchar num1;
uchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  // 共阴数码管 0-/**************关闭ISP,IAP功能*********************/
void IAP_disable(void)
{
     IAP_CONTR=0;
   IAP_CMD=0;
   IAP_TRIG=0;
   IAP_ADDRH=0X80;
   IAP_ADDRL=0;
}
/**************字节读功能*********************/
unsigned char byte_read(unsigned int addr)
{  
   
     IAP_CONTR=ENABLE_IAP;
     IAP_CMD= RdCommand;
     IAP_ADDRL=addr;
     IAP_ADDRH=addr>>8;
     IAP_TRIG=0x46;
     IAP_TRIG=0xb9;
     _nop_();
     IAP_disable();
     return(IAP_DATA);
   

}
/**************扇区擦除功能*********************/
void SectorErase(unsigned int addr )
{
     IAP_CONTR=ENABLE_IAP;
     IAP_CMD=EraseCommand;
     IAP_ADDRL=addr;
      IAP_ADDRH=addr>>8;
      IAP_TRIG=0x46;
      IAP_TRIG=0xb9;
     _nop_();
    IAP_disable();
    }
/**************字节写功能*********************/
void byte_write(unsigned int addr,unsigned char original_data)
{
       IAP_CONTR=ENABLE_IAP;
      IAP_CMD= PrgCommand;
      IAP_ADDRL=addr;
      IAP_ADDRH=addr>>8;
      IAP_DATA=original_data;
      IAP_TRIG=0x46;
      IAP_TRIG=0xb9;
      _nop_();
       IAP_disable();
   
}
void display(uchar shi,uchar ge)
{
          P0=Disp_Tab[shi];
          P1=0XFd;     //十位
         P1=0XFF;
          P0=Disp_Tab[ge];
          P1=0XFe;            //个位  
          P1=0XFF;
}  
   
void  main()
{   
       uchar num,a,b;
   
       num=byte_read(0x2000);
   
      if(num>=60) num=0;
     TMOD=0X01;
     TH0=(65536-45872)/256;
     TL0=(65536-45872)%256;
      EA=1;
      ET0=1;
      TR0=1;
      while(1)
      {  
         if(num1>=20)
         {
              num1=0;
              num++;
              SectorErase(0x2000);   //擦除扇区
              byte_write(0x2000,num); //重新写入数据      
              if(num==60) num=0;
               a=num/10;
               b=num%10;
          }
        display(a,b);
       }   
}
void timer0() interrupt 1
{
   TH0=(65536-45872)/256;
   TL0=(65536-45872)%256;
   num1++;
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top