双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

EEPROM的程序错在哪里?

shenwen11 shenwen11 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#include <AT89X51.H>
#include <intrins.h>

//***********************<define.h>****************************************
#define uchar unsigned char
#define uint unsigned int
#define EEPROMSTARTADDR 0x2000 //STC89C52RD+为0x2000

//STC单片机特殊功能寄存器
sfr ISP_DATA = 0xE2;
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD = 0xE5;
sfr ISP_TRIG = 0xE6;
sfr ISP_CONTR = 0xE7;

#define ISP_IAP_BYTE_READ 1 //读字节
#define ISP_IAP_BYTE_PROGRAM 2 //写字节编程
#define ISP_IAP_SECTOR_ERASE 3 //扇区擦去
#define WAIT_TIME 1 //设置等待时间40M以下 0 ,20M以下1,10M以下2,5M以下3
#define _nop() _nop_() /*定义空指令*/


void delay1S(void) //延时1 秒
{
uchar h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}

//******************************************************************************
//函数名称:FlashEraseSingleSector
//函数的功能:擦除一个扇区
//输入变量:addr 扇区开始地址
//输出变量:没有返回变量
void FlashEraseSingleSector(uint addr)
{
uint tempaddr=addr;
ISP_ADDRL=0;
ISP_ADDRH=(unsigned char)(tempaddr>>8);
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80; //允许编程改变FLASH 区
ISP_CMD=ISP_IAP_SECTOR_ERASE; //擦除
ISP_TRIG=0x46; //触发
ISP_TRIG=0xb9; //触发启动
_nop_();
ISP_CONTR &= 0x7f;
// 高位为0,禁止ISP/IAP编程改变FLash区,同时保持WAIT_TIME不变
}

//******************************************************************************
//函数名称:ReadOneDataFromFlash
//函数的功能: 读取一个扇区数据
//输入变量:rdaddr 扇区开始地址
//输出变量:没有返回变量
uchar ReadOneDataFromFlash(uint rdaddr)
{
uchar readda;
uint temlongaddr=rdaddr;
ISP_ADDRL=(uchar) temlongaddr;
temlongaddr=rdaddr;
ISP_ADDRH=(uchar) (temlongaddr>>0);

ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_READ; //读取数据
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop();
ISP_CONTR &= 0x7f;
readda=ISP_DATA;

return readda;
}

//******************************************************************************
//函数名称:WriteOneDataToFlash
//函数的功能:写入 一个数据
//输入变量:wdaddr 写入数据开始地址;wrdata写入的数据
//输出变量:没有返回变量
void WriteOneDataToFlash(uint wdaddr, uchar wrdata)
{

uint tempaddr,tempdata;
tempaddr=wdaddr;

ISP_DATA=wrdata;
ISP_ADDRL=(uchar) tempaddr;
tempaddr=wdaddr;
ISP_ADDRH=(uchar) (tempaddr>>8);
ISP_CONTR=WAIT_TIME;
ISP_CONTR=0x80;
ISP_CMD=ISP_IAP_BYTE_PROGRAM;
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop();
ISP_CONTR&=0x7f;
}

//*******************************************************************************
void main()
{

uchar flag;

flag=ReadOneDataFromFlash(0x2000);
while(1)
{
if(P3==0xf7) //独立键盘按下
flag=0xf0;
WriteOneDataToFlash(0X2000,flag);//写EEPROM
P0=ReadOneDataFromFlash(0x2000);
delay1S();
}
}
__________________________________________________
P0接的是8个发光二极管,上电flag=ReadOneDataFromFlash(0x2050)=0xff;没按下按键,P0显示0XFF;
按下按键后,flag=0xf0;2000中的数值保存为0XF0;P0=0XF0;(上面都可以实现,问题在下面)
断电复位后,经flag=ReadOneDataFromFlash(0x2000)后,flag=@2000=0xf0;P0=0XF0才对,但是为什么我断电复位后,P0还是等于0XFF??肯请高人帮回答一下。谢谢
...全文

相关推荐

什么是EEPROM?EEPROM是什么意思?

EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用(Plug & Play)接口卡中,用来存放硬件设置数据;防止软件非法拷贝的"硬件锁"上面也能找到它。  

weixin_38565631

51单片机SPI通信原理与实战项目

SPI看似简单,实则暗藏玄机。尤其在资源受限的51平台上,想要稳定运行高速外设,必须做到:✅懂时序:Mode 0~3别乱配,查手册为准;✅精控制:延时要准,电平切换时机要卡死;✅善布局:PCB走线短、等长、加去耦;✅会调试:示波器+逻辑分析仪是标配;✅能扩展:多设备用独立CS,别省那几根线;✅要健壮:加CRC、超时重试、看门狗,缺一不可。

雄哥侃运营

ST官网FLASH模拟EEPROM x-cube-eeprom.zip

ST官网FLASH模拟EEPROM,满足8位数据 16位数据 32位数据,同时带CRC校验。提高FLASH的的寿命的同时,确保保存数据的有效性。

DVD1478

EEPROM.rar_EEPROM Data Copy_eeprom_eeprom data

EEPROM局部抄写软件,可以任意设置地址,抄写一段数据,数据由母片提供.

周楷雯

EEPROM的概要

EEPROM从大方面分为并行EEPROM和串行EEPROM。并行EEPROM通过与闪速存储器相同的引脚配置可以并行输人输出数据;而串行EEPROM通过8引脚等较小的封装一位一位进行数据传输。表整理并比较了一般闪速存储器、并行EEP-ROM以及串行EEPROM的特点。   表 闪速存储器与EEPROM的比较   并行EEPROM与闪速存储器的不同只是在以1字节为单位进行替换这一点上,其他基本可以进行相同的操作处理。虽然可以连接一般的微型处理器并应用于编程中,但由于前面所叙述的不能增加容量的原因,主要在必须以1字节为单位进行替换的情况下应用。   而串行EEPROM,包括地址及指令等在内

weixin_38738783
评论 12
收藏 已收藏
分享
返回顶部
shenwen11
单片机/工控 27,522 成员 28,796 内容