⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stcrom.c

📁 stc系列的单片机跟at的不同
💻 C
字号:
/***********************************************************
  文件  名:STCROM.c
  文件功能:使用STC单片机内部FLASH EEPROM
  起始地址:STC89C51/52     0x2000
            STC89C54/55/58  0x8000
  存储空间:STC89C52RC单片机内部有2K的EEPROM存储空间,
            划分为8个扇区,每个扇区512个字节
            第1个扇区的存储地址:0x2000~0x21FF
            第2个扇区的存储地址:0x2200~0x23FF
            第3个扇区的存储地址:0x2400~0x25FF
            第4个扇区的存储地址:0x2600~0x27FF
            第5个扇区的存储地址:0x2800~0x29FF
            第6个扇区的存储地址:0x2A00~0x2BFF
            第7个扇区的存储地址:0x2C00~0x2DFF
            第8个扇区的存储地址:0x2E00~0x2FFF
  读写特点:随时可读,修改前要擦除,擦除则需要擦除整个扇区,
            先读出这个扇区的所有数据,擦除后,再写入新的数据。
            建议同一次修改的数据放在一个扇区。
  擦除速度:晶振为40MHz、20MHz、10MHz、5MHz,分别为0、1、2、3
***********************************************************/
#include<reg51.h>
#include<shu_code.c>
sfr  ISP_DATA  = 0xE2;   /* FLASH EEPROM 数据寄存器       */
sfr  ISP_ADDRH = 0xE3;   /* FLASH EEPROM 地址高字节寄存器 */
sfr  ISP_ADDRL = 0xE4;   /* FLASH EEPROM 地址低字节寄存器 */
sfr  ISP_CMD   = 0xE5;   /* FLASH EEPROM 命令寄存器       */
sfr  ISP_TRIG  = 0xE6;   /* FLASH EEPROM 触发寄存器       */
sfr  ISP_CONTR = 0xE7;   /* FLASH EEPROM 控制寄存器       */
//sbit Erase_End_flag = SFST^2; /* 芯片擦除结束标志 */

unsigned char code ISP_IAP_BYTE_READ    =1; //read
unsigned char code ISP_IAP_BYTE_PROGRAM =2; //program
unsigned char code ISP_IAP_SECTOR       =3; //clear sector

unsigned char code WAIT_TIME_40MHz      =0; //fosc 40MHz time
unsigned char code WAIT_TIME_20MHz      =1; //fosc 420MHz time
unsigned char code WAIT_TIME_10MHz      =2; //fosc 10MHz time
unsigned char code WAIT_TIME_05MHz      =3; //fosc 05MHz time

unsigned int  code STC_FLASH_ADDR       =0x2000;//STC89C52
/******************************************************
  子程序名:void Enable_IAP()
  程序功能:允许FLASH EEPROM的操作
  入口参数:无
  出口参数:无
*******************************************************/
void Enable_IAP()
{
     EA = 0;
     ISP_TRIG  = 0x46; //  Enable FLASH EEPROM
     ISP_TRIG  = 0xB9;
     EA = 1;       
}
/******************************************************
  子程序名:void Disable_IAP()
  程序功能:禁止FLASH EEPROM的操作,清除有关寄存器
  入口参数:无
  出口参数:无
*******************************************************/
void Disable_IAP()
{
     ISP_CONTR=0x00;   // Disable FLASH EEPROM
     ISP_CMD=0x00;
     ISP_TRIG=0x00;
     ISP_ADDRH=0x00;
     ISP_ADDRL=0x00;   
}
/*********************************************
  子程序名:void Erase_Sector(unsigned int addr)
  程序功能:擦除扇区
  入口参数:unsigned int addr 擦除扇区的首地址
  出口参数:无
**********************************************/
void Erase_Sector(unsigned int addr)
{
     ISP_CONTR = WAIT_TIME_20MHz|0x80;
     ISP_CMD   = ISP_IAP_SECTOR;

     ISP_ADDRH  = addr/0x0100; // Sector high  addr
     ISP_ADDRL  = addr%0x0100; // Sector lower addr
     
     Enable_IAP();
     Disable_IAP();
}
/*********************************************
 子程序名:void write_Byte(unsigned int addr,unsigned char ch)
 程序功能:向1个地址,写1个字节
 入口参数:unsigned int  addr写字节的地址
          unsigned char ch  写入的数据
 出口参数:无
**********************************************/
void write_Byte(unsigned int addr,unsigned char ch)
{         
     ISP_CONTR = WAIT_TIME_20MHz|0x80;
     ISP_CMD   = ISP_IAP_BYTE_PROGRAM;
     
     ISP_DATA  = ch;
     ISP_ADDRH = addr/0x0100; // high  addr
     ISP_ADDRL = addr%0x0100; // lower addr
     
     Enable_IAP();
     Disable_IAP();
}
/*********************************************
 子程序名:unsigned char read_Byte(unsigned int addr)
 程序功能:读出1个地址的数据
 入口参数:unsigned int  addr读出数据的地址
 出口参数:返回读出的数据,数据在ISP_DATA寄存器中
**********************************************/
unsigned char read_Byte(unsigned int addr)
{
     ISP_CONTR = WAIT_TIME_20MHz|0x80;
     ISP_CMD   = ISP_IAP_BYTE_READ; //read command
     
     ISP_ADDRH  = addr/0x0100; // high  addr
     ISP_ADDRL  = addr%0x0100; // lower addr
          
     Enable_IAP();
     Disable_IAP();
     
     return(ISP_DATA);
}

void main()
{
     unsigned char x,y=0x88,z;
     delay(1000);  Erase_Sector(STC_FLASH_ADDR+0x0300);  
     delay(1000);  x=read_Byte( STC_FLASH_ADDR+0x0300);  
     delay(1000);  write_Byte(  STC_FLASH_ADDR+0x0300,y);
     delay(1000);  z=read_Byte( STC_FLASH_ADDR+0x0300);
loop1:
     display(x,y,z);
     goto loop1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -