📄 eeprom.c
字号:
#include <reg52.h>
#include <intrins.h> //use _nop_() function
#define uchar unsigned char
#define uint unsigned int
/*********************定义命令字节******************/
#define Read_COM 0X01 //字节读数据存储区
#define Prog_COM 0X02 //字节编程数据存储区
#define Dele_COM 0X03 //扇区擦除数据存储区
#define En_Wait_TIME 0X81 //设置等待时间 ,并使能ISP/IAP
//0X00==40MHZ以下,0X01==20MHZ以下
//0X02==10MHZ以下,0X03==5MHZ以下
#define Start_ADDRH 0X20 //扇区地址高位,STC89C/LE52RC
#define Start_ADDRL 0X00 //扇区地址低位
/*********************定义常量*********************/
#define temp1 0X25
sbit BP_OUT =P2^0;
uchar temp2;
/****************** 关闭 ISP,IAP 功能 **************/
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、0XB9
ISP_TRIG = 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、0XB9
ISP_TRIG = 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 = Dele_COM; //送扇区擦除命令字
ISP_ADDRH = (uchar)(sector_addr >> 8); //送地址高字节
ISP_ADDRL = (uchar)(sector_addr & 0X00FF); //送地址低字节
ISP_TRIG = 0X46; //送触发命令字 0X46、0XB9
ISP_TRIG = 0XB9;
_nop_();
ISP_IAP_disable(); //关闭ISP/IAP功能
EA = 1;
}
/********************延时子程序**********************/
void Delay_xS(uchar t)
{
unsigned char i,j;
while(t--)
{
i=80;
j=255;
while(i--)
{
while(j--);
}
}
}
/********************蜂鸣器响;n=次数*****************/
void BP_out(uchar n)
{
while(n--)
{
BP_OUT=1;
Delay_xS(1);
BP_OUT=0;
Delay_xS(1);
}
}
/*********************主程序***********************/
void main()
{
while(1)
{
Sector_erase(0X2000); //扇区擦除
Byte_program(0X2000, 0X25); //写EEPROM
_nop_();
_nop_();
_nop_();
temp2=Byte_read(0X2000); //读EEPROM
if(temp1!=temp2)
{BP_out(1);} //响1声
else
{BP_out(2);} //响2声
Delay_xS(5);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -