📄 stcrom.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 + -