#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned int addr;
/*Declare SFR associated with the ISP */
sfr IAP_DATA = 0xE2; //Flash data register 闪存数据寄存器
sfr IAP_ADDRH = 0xE3; //Flash address HIGH 闪存地址高
sfr IAP_ADDRL = 0xE4; //Flash address LOW 闪存地址低
sfr IAP_CMD = 0xE5; //Flash command register 闪存命令寄存器
sfr IAP_TRIG = 0xE6; //Flash command trigger 闪存命令触发
sfr IAP_CONTR = 0xE7; //Flash control register 闪存控制寄存器
/*Define ISP/IAP/EEPROM command*/
#define CMD_IDLE 0x00 //Stand-By
#define CMD_READ 0x00 //unsigned char-Read
#define CMD_PROGRAM 0x02 //unsigned char-Program
#define CMD_ERASE 0x03 //Sector-Erase
/*Define ISP/IAP/EEPROM operation const for IAP_CONTR*/
//#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
//#define ENABLE_IAP 0x82 //if SYSCLK<200MHz
#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x80 //if SYSCLK<6MHz
/**EEPROM延时函数********/
void Delay_EEprom(uchar n)
{
uint x;
while(n--)
{
x=0;
while(++x);
}
}
/****关闭ISP,IAP功能*******/
void ISP_IAP_Disable()
{
IAP_CONTR=0x00;//Close IAP function关闭控制寄存器
IAP_CMD =0x00;//clear command to standby清除命令备用
IAP_TRIG =0x00;//Clear trigger register
IAP_ADDRH=0x80;//Data ptr point to non-EEPROM area
IAP_ADDRL=0x00;//Clear IAP address to prevent misuse
}
/**向EEPROM16位地址读出8位数据**/
unsigned char IapReadINT8U(unsigned int addr)
{
unsigned char dat;
IAP_CONTR=ENABLE_IAP; // 打开IAP功能,设置Flash操作等待时间
IAP_CMD =CMD_READ; // 对用户的应用程序Flash区及数据Flash区字节读
IAP_ADDRH=addr>>8; //设置目标单元地址的高8位地址
IAP_ADDRL=addr; //设置目标单元地址的低8位地址
IAP_TRIG =0x46; //触发ISP_IAP命令字节1(0x46)
IAP_TRIG =0xb9; //触发ISP_IAP命令字节2(0xb9)
_nop_(); //延时一个机器周期
dat=IAP_DATA; //读出数据准备
ISP_IAP_Disable(); //关闭IAP,ISP功能
return dat; //返回给函数
}
/**向EEPROM16位地址写入8位数据**/
void IapProgramINT8U(unsigned int addr,unsigned char dat)
{
IAP_CONTR=ENABLE_IAP;//Open IAP function,and set wait time 打开IAP功能,设置Flash操作等待时间
IAP_CMD=CMD_PROGRAM;//对用户的应用程序Flash区及数据Flash区编程
IAP_ADDRH=addr>>8;//设置目标单元地址的高8位地址
IAP_ADDRL=addr;//设置目标单元地址的低8位地址
IAP_DATA=dat; //写入数据准备
IAP_TRIG=0x46;//Send trigger command1 (0x46)
IAP_TRIG=0xb9;//Send trigger command1 (0xb9)
_nop_(); //延时一个机器周期
ISP_IAP_Disable(); //关闭IAP,ISP功能
}
/**扇区擦除**/
void IapEraseSector(unsigned int addr)
{
IAP_CONTR = ENABLE_IAP;//打开IAP功能,设置Flash操作等待时间
IAP_CMD = CMD_ERASE;//对用户的应用程序Flash区及数据Flash区擦出
IAP_ADDRH=addr>>8;//设置目标单元地址的高8位地址
IAP_ADDRL=addr;//设置目标单元地址的低8位地址
IAP_TRIG=0x46;//Send trigger command1 (0x46)
IAP_TRIG=0xb9;//Send trigger command1 (0xb9)
_nop_();
ISP_IAP_Disable();
}
/**主函数**/
void main()
{
}
帮忙看看单片机EEPROM写的对吗?
在应用时不知道怎么使用,我要用AD采集的值存储在EEPROM中,再用串口将EEPROM值读取出来???? |