STC12c5A60s2单片机 想通过片外EEPROM保存掉电信息!

用的以前51单片机的IIC读写eeprom程序,改了延时,但还是用问题!第一次接触STC12c5A60s2,不晓得要注意些什么。有谁有可运行的程序吗?我想参考下!STC12c5A60s2-能成功的读eeprom和写eeprom就行!

我正在用的代码,如果需要可以添加到你的程序里,直接调用其中的相关函数即可实现读写功能,至于为什么这么写不作赘述,自己查查资料,再对照代码应该就可以理解。加油吧!:

头文件:
EEPstore.h
#ifndef _EEPSTORE_H_
#define _EEPSTORE_H_

#define USE_IAR 1 //程序中是否使用中断(1:是,0:否)
#define READPointer //连续读函数的指针指向数据类型(方便复制:idata,xdata,code,空:通用指针)
#define WRITEPointer //连续写函数的指针指向数据类型(方便复制:idata,xdata,code,空:通用指针)

/*=============【载减函数】================*/
#define USE_EROM_read_continuous 0
#define USE_EROM_write_continuous 0
#define USE_EROM_read_word 1
#define USE_EROM_write_word 1
/*=========================================*/
//进行选择编译的条件
extern UINT8 EROM_read_byte(UINT16 addr);//读制定地址一字
extern void EROM_write_byte(UINT16 addr,UINT8 dat);//向指定地址写一字
extern void EROM_erase_sector(UINT8 n);//擦除指定扇区
extern void EROM_read_continuous(UINT16 addr,UINT8 READPointer *pr,UINT8 len);//连续读出EROM内容到指定缓存
extern void EROM_write_continuous(UINT16 addr,UINT8 WRITEPointer *pr,UINT8 len);//将缓存内容连续写入EROM
extern UINT16 EROM_read_word(UINT16 addr);//读指定地址一字数据
extern void EROM_write_word(UINT16 addr,UINT16 dat);//向指定地址写一字数据
//
//************************************************************
// 【 以下宏不要修改 】
//************************************************************
//EEOPROM首址(不同STC型号有所不同)
#define EROM_START 0x0000 //STC12C5A60S2
#define IAPTRIG() IAP_TRIG = 0x5A, IAP_TRIG = 0xA5
#define EN_IAP 0x82 //系统时钟 >= 12MHz

#endif

C文件
EEPstore.c
/*******************************************************************
STC12C5A60S2扇区分布:

第一扇区(512个字节) 第二扇区(512个字节)

起始地址 结束地址 起始地址 结束地址

0000H 01FFH 0200H 03FFH

*******************************************************************/

#include"main.h"
#include"EEPstore.h"
//UINT8 num1;
//UINT16 num2;
/********************************************************************

*函数名称:command_and_close

*输入:无

*输出:无

*函数功能:IAP触发命令 + 禁止IAP操作(清IAP相关寄存器)
********************************************************************/
static void command_and_close( void )
{
//#if (USE_ISR)
// EA = 0;
//#endif
//
IAPTRIG();
_nop_();
_nop_();
_nop_();

//#if (USE_ISR)
// EA = 1;
//#endif

IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0xFF;
IAP_ADDRL = 0xFF;
}
/********************************************************************

*函数名称:EROM_read_byte

*输入:(地址)

*返回:(地址内容)

*函数功能:读指定地址一字节数据

********************************************************************/
UINT8 EROM_read_byte(UINT16 addr)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 1; //允许读取EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = (UINT8)(addr>>8) + (UINT8)(EROM_START>>8);

command_and_close();

return IAP_DATA;
}
/********************************************************************

*函数名称:EROM_write_byte

*输入:(地址,数据)

*输出:无

*函数功能:向指定地址写一字节数据

********************************************************************/
void EROM_write_byte(UINT16 addr, UINT8 dat)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 2; //允许编写EEPROM
IAP_ADDRL = addr;
IAP_ADDRH = (UINT8)(addr>>8) + (UINT8)(EROM_START>>8);
IAP_DATA = dat;

command_and_close();
}
/********************************************************************

*函数名称:

*输入:(扇区号)

*输出:无

*函数功能:擦除指定扇区

********************************************************************/
void EROM_erase_sector(UINT8 n)
{
IAP_CONTR = EN_IAP;
IAP_CMD = 3; //允许擦除EEPROM
IAP_ADDRL = 0x00;
IAP_ADDRH = (UINT8)(EROM_START>>8) + n*0x02;

command_and_close();
}
/********************************************************************

*函数名称:EROM_read_continuous

*输入:(起始地址,指针指向,字节长)

*输出:无

*函数功能:连续读数据

********************************************************************/
#if (USE_EROM_read_continuous)
void EROM_read_continuous(UINT16 addr, UINT8 READPointer *pr, UINT8 len)
{
while (len--)
{
*pr = EROM_read_byte(addr);
pr++;
addr++;
}
}
#endif

/********************************************************************
*函数名称:EROM_write_continuous

*输入:(起始地址,指针指向,字节长)

*输出:无

*函数功能:连续写数据

********************************************************************/
#if (USE_EROM_write_continuous)
void EROM_write_continuous(UINT16 addr, UINT8 WRITEPointer *pr, UINT8 len)
{
while (len--)
{
EROM_write_byte(addr, *pr);
pr++;
addr++;
}
}
#endif
/********************************************************************

*函数名称:EROM_read_word

*输入:起始地址

*输出:读取的数据

*函数功能:读指定地址一字数据

********************************************************************/
#if (USE_EROM_read_word)
UINT16 EROM_read_word(UINT16 addr)
{
UINT16 dat;

((UINT8 *)&dat)[0] = EROM_read_byte(addr++);
((UINT8 *)&dat)[1] = EROM_read_byte(addr);
return dat;
}
#endif

/********************************************************************

*函数名称:EROM_write_word

*输入:写入的地址,写入的数据

*输出:无

*函数功能:向指定地址写一字数据

********************************************************************/
#if (USE_EROM_write_word)
void EROM_write_word(UINT16 addr, UINT16 dat)
{
EROM_write_byte(addr++, ((UINT8 *)&dat)[0]);
EROM_write_byte(addr, ((UINT8 *)&dat)[1]);
}
#endif追问

谢谢啊!如楼上说的在手册里找到了片内EEPROM的实现方法!所以分给他了!但还是非常感谢!我会加油的!你的程序我收下了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-27
我都是用STC12c5A60s2内部自带的eeprom。也很方便,设置下控制寄存器然后套模板,并且不用像IIC的那样还得考虑时序、晶振。官方手册上有模板程序追问

我写了下,把一个数组存入到eeprom,然后读到另一个数组。对比两个数组还是不一样。数组元素有三个!最后一个一样的!不晓得哪里出了问题!

追答

不把手册翻个几遍,不可能详细了解一款芯片。有问题,先看手册

本回答被提问者采纳