找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5891|回复: 1
收起左侧

使用51单片机内部EPROM断电保存程序

[复制链接]
ID:188619 发表于 2017-5-26 23:24 | 显示全部楼层 |阅读模式
//#include <STC89C52RC.H>
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char   
#define uint unsigned int
uint temp,aa,a,V;

sbit mmm=P3^4;//复位
sbit nnn=P3^2;//继电器
sbit kkk=P3^3;//灯
void cc(uint addr) ;
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
/****************特殊功能寄存器声明****************/
sfr ISP_DATA = 0xc2;   
sfr ISP_ADDRH = 0xc3;     
sfr ISP_ADDRL = 0xc4;   
sfr ISP_CMD = 0xc5;   
sfr ISP_TRIG = 0xc6;      
sfr ISP_CONTR = 0xc7;

void  cc(uint addr);
void  xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void  Q0();
void init1();
                                         //计数器初始化
void delay1(unsigned int cnt);
void delay_50us(uint t)
   {
  uchar F;
  for(;t>0;t--)
  for(F=19;F>0;F--);
   }
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{  
        //uchar gg;
     init1();
        temp=dcx(0x2002);
       //if(gg==2)
      // {  
        //   bai=temp/100;
       //   shi=temp%100/10;
       //   ge=temp%10;
    // display(bai,shi,ge);
  // }
  while(1)
   {
      if(aa==20)
      {
        aa=0;
        temp++;   
  cc(0x2000);
  delay1(300);              // 擦除第1个扇区(2000h~21FFh)
        xcx(0x2002,temp);
  delay1(300);
  if(temp<=5)
   {
   nnn=1;
   kkk=1;
   }
  if(temp>1&&temp<20)
  {
   nnn=0;
   kkk=0;
  }
         
      if(temp>=20)
       {
         temp=20;
   nnn=1;
   kkk=1;
  }
   if(mmm==0)
{
  delay_50us(200);
     if(mmm==0)
     {
   cc(0x2000);
   delay1(300);
   temp=1;
   nnn=1;
   kkk=1;
   xcx(0x2002,temp);
   delay1(300);
   temp=dcx(0x2002);
   delay1(300);
   while(!mmm);
   }
    delay_50us(200);
    while(!mmm);
}
         

    }
}
   
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:擦除某一扇区(每个扇区512字节)
入口:addr = 某一扇区首地址                          
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)
{        
// 打开 IAP 功能(ISP_CONTR.7)=1:允许编程改变Flash, 设置Flash操作等待时间
// 0x83(晶振<5M)   0x82(晶振<10M)   0x81(晶振<20M)   0x80(晶振<40M)
    ISP_CONTR = 0x81;  
    ISP_CMD   = 0x03;                  // 用户可以对"Data Flash/EEPROM区"进行扇区擦除
    ISP_ADDRL = addr;         // ISP/IAP操作时的地址寄存器低八位,
    ISP_ADDRH = addr>>8;      // ISP/IAP操作时的地址寄存器高八位。   
    ISP_TRIG = 0x5A;          // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
    ISP_TRIG = 0xA5;          // 再写入B9h,ISP/IAP命令才会生效。
          _nop_();
           Q0();             // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:写一字节
入口:addr = 扇区单元地址 , dat = 待写入数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
    ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x02;         // 用户可以对"Data Flash/EEPROM区"进行字节编程
    ISP_ADDRL = addr;        
    ISP_ADDRH = addr>>8;      
    ISP_DATA  = dat;          // 数据进ISP_DATA
ISP_TRIG = 0x5A;         
    ISP_TRIG = 0xA5;         
    _nop_();
           _nop_();
          _nop_();
       Q0();                 // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:读一字节
入口:addr = 扇区单元地址
出口:dat  = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{   
    uchar dat;
    ISP_CONTR = 0x81;                  
    ISP_CMD   = 0x01;         // 用户可以对"Data Flash/EEPROM区"进行字节读
    ISP_ADDRL = addr;         
    ISP_ADDRH = addr>>8;
    ISP_TRIG = 0x5A;         
    ISP_TRIG = 0xA5;         
        _nop_();

    dat = ISP_DATA;                          // 取出数据
          Q0();                              // 关闭ISP/IAP                  
    return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
          ISP_CONTR = 0;            // 关闭IAP功能
          ISP_CMD   = 0;            // 待机模式,无ISP操作
          ISP_TRIG  = 0;            // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
}

void delay1(unsigned int cnt)
{
while(--cnt);
}

void init1()                                            //计数器初始化
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}

/*
STC89C52RC内部EEPROM详细地址表:
第一扇区            第二扇区             第三扇区              第四扇区
起始地址 结束地址   起始地址  结束地址   起始地址   结束地址   起始地址   结束地址
2000h     21FFh     2200h    23FFh       2400h      25FFh       2600h      27FFH
第五扇区              第六扇区               第七扇区          第八扇区
起始地址  结束地址  起始地址   结束地址   起始地址  结束地址   起始地址   结束地址
2800h      29FFh      2A00h      2BFFh     2C00h    2DFFh      2E00h      2FFFh
*/
回复

使用道具 举报

ID:459030 发表于 2019-2-27 18:28 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表