STC89C51系列 EEPROM测试程序 证明扇区512个字节的擦除
1测试程序
/*
单片机内置的 EEPROM测试程序
适用
STC89C51
STC89C52
STC89C53
STC89C54
STC89C58
STC89C510
STC89C512
STC89C514测试晶振:11.05926M 12M 都可以用 功能:
读取指定地址的一个字节内容,并显示在8 P1总线上擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上*/#include <reg51.h>
#include <intrins.h>/******************EEPROM用到的sfr中的寄存器地址stc型号不同地址不同*****************************************/
sfr IAP_DATA = 0xE2; //IAP操作时的数据寄存器(从flash读数据和写数据都在此处)
sfr IAP_ADDRH = 0xE3; //IAP操作时的地址寄存器高8位
sfr IAP_ADDRL = 0xE4; // IAP操作时的地址寄存器低8位
sfr IAP_CMD = 0xE5; //IAP命令模式寄存器(需命令触发寄存器触发方生效)3种模式
sfr IAP_TRIG = 0xE6; //IAP命令触发寄存器,在IAP_CONTR.7=1时;对IAP_TRIG先写//入46h,再写入B9h,IAP命令生效
sfr IAP_CONTR = 0xE7; //IAP控制寄存器/***********定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数(属于IAP_CONTR寄存器)***********/
#define ENABLE_ISP 0x82 //实测 12M 11.0592M 都可以使用void DELAY_MS (unsigned int a)
{unsigned int i;while ( --a != 0 ){for (i=0;i<=110;i++);}
}/*************关闭IAP功能子程序*****************************/
void IAP_Disable() //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
{ //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0; //高八位地址清0IAP_ADDRL = 0; //低八位地址清0
}/**********EEPROM读一字节子程序***********************/
unsigned char Byte_Read(unsigned int add) //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
{IAP_DATA = 0x00; //IAP数据寄存器清0IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关return (IAP_DATA);
}/************EEPROM字节编程子程序**************************/
void Byte_Program(unsigned int add,unsigned char ch) //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
{IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}/*************EEPROM擦除扇区子程序**************************/
void Sector_Erase(unsigned int add) //擦除扇区, 入口:DPTR = 扇区地址
{IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}void main (void){unsigned char mydata = 0x0F;
unsigned int address = 0x2000;P1 = Byte_Read(address); //读取当前地址存储的8个bit,并显示出来
DELAY_MS(1000);Sector_Erase(address); //擦除这个地址所在的扇区
Byte_Program(address,mydata);//写入新的8个bit
P1 = Byte_Read(address); //读取当前地址存储的8个bit,并显示出来while(1);
}
2证明程序
/*
单片机内置的 EEPROM测试程序
适用
STC89C51
STC89C52
STC89C53
STC89C54
STC89C58
STC89C510
STC89C512
STC89C514测试晶振:11.05926M 12M 都可以用 功能:
读取指定地址的一个字节内容,并显示在8 P1总线上擦除一个扇区,修改取指定地址的一个字节内容,并显示在8 P1总线上*/#include <reg51.h>
#include <intrins.h>/******************EEPROM用到的sfr中的寄存器地址stc型号不同地址不同*****************************************/
sfr IAP_DATA = 0xE2; //IAP操作时的数据寄存器(从flash读数据和写数据都在此处)
sfr IAP_ADDRH = 0xE3; //IAP操作时的地址寄存器高8位
sfr IAP_ADDRL = 0xE4; // IAP操作时的地址寄存器低8位
sfr IAP_CMD = 0xE5; //IAP命令模式寄存器(需命令触发寄存器触发方生效)3种模式
sfr IAP_TRIG = 0xE6; //IAP命令触发寄存器,在IAP_CONTR.7=1时;对IAP_TRIG先写//入46h,再写入B9h,IAP命令生效
sfr IAP_CONTR = 0xE7; //IAP控制寄存器/***********定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数(属于IAP_CONTR寄存器)***********/
#define ENABLE_ISP 0x82 //实测 12M 11.0592M 都可以使用void DELAY_MS (unsigned int a)
{unsigned int i;while ( --a != 0 ){for (i=0;i<=110;i++);}
}/*************关闭IAP功能子程序*****************************/
void IAP_Disable() //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
{ //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关 IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0; //高八位地址清0IAP_ADDRL = 0; //低八位地址清0
}/**********EEPROM读一字节子程序***********************/
unsigned char Byte_Read(unsigned int add) //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
{IAP_DATA = 0x00; //IAP数据寄存器清0IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关return (IAP_DATA);
}/************EEPROM字节编程子程序**************************/
void Byte_Program(unsigned int add,unsigned char ch) //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
{IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}/*************EEPROM擦除扇区子程序**************************/
void Sector_Erase(unsigned int add) //擦除扇区, 入口:DPTR = 扇区地址
{IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令IAP_ADDRH = (unsigned char)(add>>8); //设置目标单元地址的高8 位地址IAP_ADDRL = (unsigned char)(add&0xff); //设置目标单元地址的低8 位地址EA = 0;IAP_TRIG = 0x46; //先送 46h,再送B9h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xB9; //送完 B9h 后,ISP/IAP 命令立即被触发起动_nop_();EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
}void main (void){unsigned char mydata1 = 0xF0;
unsigned char mydata2 = 0x0F;
unsigned int address1 = 0x2000;
unsigned int address2 = 0x21FF;Sector_Erase(address1); //为了数据的写入
Byte_Program(address1,mydata1);
Byte_Program(address2,mydata2);P1 = Byte_Read(address1); //显示出来
DELAY_MS(500);
P1 = Byte_Read(address2); //显示出来
DELAY_MS(500); //Sector_Erase(address1); //无论是擦除address1还是address2
Sector_Erase(address2);
P1 = Byte_Read(address1); //读取到的是0xFF
DELAY_MS(500);
P1 = Byte_Read(address2); //读取到的是0xFF
DELAY_MS(500); /*
可以证明:
A和B属于用一个扇区
擦除A或者B 字节的地址
再次读取A或B 都已经改变为0xFF
*/while(1);
}
转载于:https://my.oschina.net/u/3776585/blog/1616776
STC89C51系列 EEPROM测试程序 证明扇区512个字节的擦除相关推荐
- STC系列单片机内部EEPROM 测试程序
硬件电路: P1口接8个LED到VCC. 适用硬件: STC12C2052系列(杜洋工作室改进部分) STC12C5AxxAD系列单片机 STC12C52xxAD系列单片机 STC11xx系列单片机 ...
- STM32L0 系列 EEPROM 读写,程序卡死?
STM32L0 系列EEPROM读写,使用过程必须注意到的问题,踩坑史 = =!......by 矜辰所致 目录 前言 一.写入地址问题 二.写入时候容易死机问题 2.1 问题的原因 2.2 问题的解 ...
- 初学24CXX系列EEPROM使用详解STM32库函数I2C总线
24CXX系列芯片属于EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存 ...
- stc89C51系列单片机介绍
STC89C51 是一款基于 8051 内核的高性价比单片机,由国内的 STC 微电子公司生产.STC89C51 系列单片机的特点是具有高速运行.丰富的外设接口.广泛的应用领域等优点.本文将从以下几个 ...
- 开发STC89C51系列单片机需要的单片机技术
文章目录 1. 端口操作 1.1. 设置端口方向 1.2. 读取端口状态 1.3. 控制端口状态 1.4. 实现按键检测 2. 中断处理 2.1. 定时器/计数器中断 2.2. 外部中断 2.3. 串 ...
- 开发STC89C51系列单片机需要用到的C语言技术
文章目录 1. 概述 2. 数据类型 2.1 整数类型 2.2 浮点类型 2.3 无符号类型 3. 控制语句 3.1 分支语句 3.2 循环语句 4. 数组 7. 中断 8. 延时 1. 概述 STC ...
- 硬盘检测 Victoria教程:每个扇区512byte(现在新的硬盘每个扇区有4K)一个块是4K(4096)扇区,1个块由连续的8个扇区组成。Victoria扫描常选块由2048扇区每扇区512字节
一.注意事项 1. 下载完成后不要在压缩包内运行软件直接使用,先解压: 2. 如果软件无法正常打开,请右键使用管理员模式运行. 3. 为确保检测结果准确 (避免卡深灰块),运行 Victoria 检测 ...
- AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序
一.概述 EEPROM是嵌入式开发中比较常用的芯片,用来保存参数及掉电记忆的数据等,最常用的是ATMEL的AT24Cxx系列的IIC接口,也有其他厂家的如罗姆Rohm的BR24Gxx系列.ST的M24 ...
- 【组件】24系列EEPROM/FRAM通用接口
1.写在前面 "24系列"的EEPROM,一般地我们认为是以i2c为通信接口的一系列串行EEPROM,各大半导体厂商出产的该系列EEPROM都遵循这个规则,而且电路和控制程序上 ...
- 汇编语言SD24系列功能测试程序
;=============================================================================== ; SD24系列功能测试程序 ; 本程 ...
最新文章
- Django MTV结构分析
- 现金流为王!中小企业如何“疫”境求生?
- AngularJS中关于ng-class和*ngIf指令
- go语言基础之工程管理和工作区介绍
- 小程序css之字体镂空
- (78)Verilog HDL条件编译:`ifdef
- Json.Net学习笔记(十二) 协议解析
- php-5.6.31安装视频教程_php安装图解教程
- 状态规划P4270小奇挖矿2
- js foreach用法_36 个JS 面试题为你助力金九银十(面试必读)
- Fire Net C++
- vmware安装dsm7.0
- c语言教程免费ppt,《C语言教程》PPT课件.ppt
- Windows安装--拼音分词器
- 学习能力篇:“拼图式”学习法
- 拼多多商品详情查询V1新版接口
- RVB2601应用开发实战系列六:网络播放器设计(二)
- c语言程序如何在keil中运行,keil c51中C程序的启动过程
- C++多线程详细讲解
- 【BI学习心得13-淘宝定向广告演化与天猫用户复购预测】
热门文章
- CPE/CPA/CPL/CPC/CPM/CPO/CPS/CPV/CPT/CPP广告
- 一个程序员的成长之路(持续更新)
- 搜题公众号题库对接教程
- python怎么注释作者_python作者注释
- Centos7 下配置Samba服务器---犯二的经历
- 为什么计算机桌面图标不见了,为什么电脑桌面上的图标全不见了?
- 华为云OBS数据桶使用
- 电脑桌面没有计算机图标鼠标也点不起来,电脑桌面上的图标不见了,鼠标也没用了该怎么办呢?...
- 判断邮箱格式是否正确
- Inrie(洪晓军)