stc51单片机有类似flash的功能eeprom,可以掉电保存数据,不同型号的可以保存不同大小的数据,以12c5a60s2为例,eeprom的大小为2k,分为两个扇区,掉电保存在很多地方需要。
首先寄存器的问题,不同系列的stc单片机的与eeprom有关的寄存器不同,比如10/11/12系列的sfr isp_data = 0xc2;sfr isp_addrh = 0xc3;sfr isp_addrl = 0xc4;sfr isp_cmd = 0xc5;sfr isp_trig = 0xc6;sfr isp_contr = 0xc7;89/90系列的sfr isp_data = 0xe2;sfr isp_addrh = 0xe3;sfr isp_addrl = 0xe4;sfr isp_cmd = 0xe5;sfr isp_trig = 0xe6;sfr isp_contr = 0xe7;注意寄存器一定要按数据手册中的配置,isp触发命令也不相同,详情请看下方代码
其次是关于扇区问题,不同型号的mcu扇区个数不尽相同,详情请查询数据手册,在这里我以12c5a60s2为例,一共2扇区,每扇区512b,地址区间为0x0000~0x03ff,使用时请勿超出范围。
eeprom使用时有三个功能,分别为读、写、和擦除,由isp_cmd寄存器控制,分别对应1/2/3
下面为此项内容的代码部分,分别为初始化、读、擦除和写,本程序为11.0592mhz晶振,stc12c5a60s2的mcu,以下程序测试可用
eeprom.c
void disableeeprom(void)
{
isp_contr = 0;//禁止isp/iap操作
isp_cmd = 0;//去除isp/iap命令
isp_trig = 0;//防止isp/iap命令误触发
isp_addrh = 0xff;//指向非eeprom区,防止误操作
isp_addrl = 0xff;//指向非eeprom区,防止误操作
}
void eeprom_read_n(unsigned int ee_address,unsigned char *dataaddress,unsigned char lenth)
{
ea = 0;//禁止中断
isp_enable();//宏调用, 设置等待时间,允许isp/iap操作,送一次就够
isp_read();//宏调用, 送字节读命令,命令不需改变时,不需重新送命令
do
{
isp_addrh = ee_address / 256;//送地址高字节(地址需要改变时才需重新送地址)
isp_addrl = ee_address % 256;//送地址低字节
isp_trig();//宏调用, 先送5ah,再送a5h到isp/iap触发寄存器,每次都需要如此
_nop_();
*dataaddress = isp_data;//读出的数据送往
ee_address++;
dataaddress++;
}while(--lenth);
disableeeprom();
ea = 1;//重新允许中断
}
void eeprom_sectorerase(unsigned int ee_address)
{
ea = 0;//禁止中断
//只有扇区擦除,没有字节擦除,512字节/扇区。
//扇区中任意一个字节地址都是扇区地址。
isp_addrh = ee_address / 256;//送扇区地址高字节(地址需要改变时才需重新送地址)
isp_addrl = ee_address % 256;//送扇区地址低字节
isp_enable();//设置等待时间,允许isp/iap操作,送一次就够
isp_erase();//宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
isp_trig();//宏调用, 先送5ah,再送a5h到isp/iap触发寄存器,每次都需要如此
disableeeprom();
ea = 1;//重新允许中断
}
void eeprom_write_n(unsigned int ee_address,unsigned char *dataaddress,unsigned char lenth)
{
ea = 0;//禁止中断
isp_enable();//设置等待时间,允许isp/iap操作,送一次就够
isp_write();//宏调用, 送字节写命令,命令不需改变时,不需重新送命令
do
{
isp_addrh = ee_address / 256;//送地址高字节(地址需要改变时才需重新送地址)
isp_addrl = ee_address % 256;//送地址低字节
isp_data = *dataaddress;//送数据到isp_data,只有数据改变时才需重新送
isp_trig();//宏调用, 先送5ah,再送a5h到isp/iap触发寄存器,每次都需要如此
_nop_();
ee_address++;//下一个地址
dataaddress++;//下一个数据
}while(--lenth);//直到结束
disableeeprom();
ea = 1;//重新允许中断
}
epprom.h
#ifndef __eeprom_h__
#define __eeprom_h__
#include“max52.h”
#include
#defineisp_wait_frequencyisp_wait_2mhz
#defineisp_wait_2mhz6
#define isp_trig() isp_trig12()
#define isp_trig12()isp_trig = 0x5a,isp_trig = 0xa5//等待指令分12和89系列
#define isp_trig89()isp_trig = 0x46,isp_trig = 0xb9
#define isp_en(1《《7)
#define isp_swbs(1《《6)
#define isp_swrst(1《《5)
#define isp_cmd_fail(1《《4)
#defineisp_standby()isp_cmd = 0//isp空闲命令(禁止)
#defineisp_read()isp_cmd = 1//isp读出命令
#defineisp_write()isp_cmd = 2//isp写入命令
#defineisp_erase()isp_cmd = 3//isp擦除命令
#defineisp_enable()isp_contr = (isp_en + isp_wait_frequency)
#defineisp_disable()isp_contr = 0; isp_cmd = 0; isp_trig = 0; isp_addrh = 0xff; isp_addrl = 0xff
void disableeeprom(void);
void eeprom_read_n(unsigned int ee_address,unsigned char *dataaddress,unsigned char lenth);
void eeprom_sectorerase(unsigned int ee_address);
void eeprom_write_n(unsigned int ee_address,unsigned char *dataaddress,unsigned char lenth);
#endif
构建大数据产业发展格局,主要从三个方向着手
什么是骨传导耳机?骨传导耳机的好处
荣耀年度最强拍照手机荣耀20系列为何会深受用户的喜爱
专为工业应用设计的采用电气隔离技术的测量系统的实现
携手苏宁开启超级品牌日 创维Wi-Fi6护眼智慧屏新品福利再升级
STC51单片机EEPROM的使用方法
2006年德国法兰克福春季消费品博览会Tendence Li
拨号上网设置的方法
关于一体化反激式功率集成电路芯片的介绍和分析
LED化妆镜触控方案
聚辰股份:拥有A1、A2、A3 等级的全系列汽车级 EEPROM 产品
高精度倾角传感器的应用环境
洲明成为全球Mini LED显示屏创新制造的“航母基地”
物联网设备中的MEMS器件是如何被超声波影响的
长电科技表示企业转型升级不可能一蹴而就 做大做强封装测试产业要有战略耐心
华为在忆阻器芯片领域申请两项专利
PoE系统对敏感电源电路实施电涌瞬态事故保护设计(电路原理图)
双电源供电原理_双电源供电规范要求
电动自行车蓄电池标准要求
智能交通解决方案为现有和新的交通基础设施项目提供重要的推动力