栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【出坑笔记】正确使用STC单片机内部EEPROM

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【出坑笔记】正确使用STC单片机内部EEPROM

        作者今天使用了STC12C5A60S2单片机内部的EEPROM存储数据,在使用过程中发现一个坑,最后经过试验避免了该问题,这里详细记录一下。

【出坑笔记】正确使用STC12系列单片机内部EEPROM

目录

一、实验环境

二、EEPROM掉电存储实验(基础实验)   

三、EEPROM多次“写”操作实验(重点注意)

四、实验感悟

五、链接

六、关于作者


一、实验环境

◆单片机最小系统

◆STC12C5A60S2单片机       

◆11.0592MHZ晶振(实验中需用到串口通信)

二、EEPROM掉电存储实验(基础实验)   

        对STC12C5A60S2单片机内部EEPROM进行操作,断开电源,重新上电,检查是否可以实现掉电存储,试验成功。

main函数如下:

void main(void)
{	
	Uart_Init();//串口初始化函数
	IAP_EraseSector(0);//扇区擦除,一个扇区512字节

	
	IAP_ProgramByte(0,0);
	IAP_ProgramByte(1,1);
	IAP_ProgramByte(2,2);
	
	
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));

	while(1);
	
}

(1)编译下载程序,通过串口工具查看实验现象:

 通过以上程序,已将STC12C5A60S2单片机内部EEPROM的前三个地址内容写入了数据0、1、2,现在修改主程序,屏蔽“写”操作,只进行“读”操作,修改如下:

 (2)重新编译,下载,发现串口打印效果和上一次一样,如图:

(3)断开开发板电源,然后重新通电,查看串口工具,发现打印的数据依然是0、1、2(实验效果和上图串口工具显示的内容一致),说明我们EEPROM确实操作成功了,实现了“掉电保存”功能。

三、EEPROM多次“写”操作实验(重点注意)

        对STC12C5A60S2单片机内部EEPROM前三个地址进行操作,第一次写入数据,第二次写入新的数据,然后查看这三个地址存储的数据(理论上应该是第二次写入的数据),实验失败。

程序下载链接:

main函数如下:

#include "common.h"
#include "uart.h"
#include "eeprom.h"

void main(void)
{	
	Uart_Init();
	IAP_EraseSector(0);//扇区擦除,一个扇区512字节

	
	IAP_ProgramByte(0,0);
	IAP_ProgramByte(1,1);
	IAP_ProgramByte(2,2);
	
	
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));
	
	
	IAP_ProgramByte(0,3);
	IAP_ProgramByte(1,4);
	IAP_ProgramByte(2,5);
	
	
	Uart_SendByte(IAP_ReadByte(0));
	Uart_SendByte(IAP_ReadByte(1));
	Uart_SendByte(IAP_ReadByte(2));
	
	while(1);
	
}

实验效果如下图:

 很明显,第一次写入数据成功,但是第二次写入数据失败了。通过前面的基础实验,说明我们的“写”操作是成功的,但是为什么第一次写入成功了,但是第二次写入失败了呢?仔细阅读STC12C5A60S2的手册,会发现以下内容:

仅仅看上面的说明,一头雾水,作者翻译一下就是:要对单片机内部EEPROM进行“写”操作,该地址数据必须是0xff才行,在我们实验中,我们第一次写入了数据0、1、2,然后准备再次写入数据3、4、5,因为该地址的数据不是0xff,所以无法进行“写”操作,所以作者修改程序如下:

 只是新增了一句代码,然后看实验现象:

实验成功,这就是我们想要的结果,然后再回头看STC12C5A60S2的说明:

 就更加容易理解了。然后引用手册里面的话(重点领会!!!!!!):

如果在一个扇区中存放了大量数据,某次只需要修改其中一个字节或者一部分字节时,则另外的不需要修改的数据须先读出放在STC单片机的RAM中,然后擦除整个扇区,再将需要保留的数据和需修改的数据按字节逐字节写回该扇区中……

四、实验感悟

        通过上面的实验,说明要结合实验和官方手册,多方实验求证,才能真正学好、用好手头的单片机,要学会和单片机“对话”,用事实说话。

【注意】

        (1)STC89C51系列单片机内部也有EEPROM,但是STC89C51系列单片机和STC12系列单片机内部关于EEPROM的特殊功能寄存器和EEPROM地址不同,所以代码需要适当修改,具体方法请对比STC89C51系列单片机、STC12系列单片机手册。

五、链接

1.程序链接:程序下载--------百度网盘

2.视频连接:

链接①:哔哩哔哩--------点击播放

链接②:优酷视频--------点击播放

链接③:爱奇艺----点击播放

链接④:腾讯视频--------点击播放

链接⑤:搜狐视频--------点击播放

六、关于作者

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号