ImageVerifierCode 换一换
格式:DOC , 页数:7 ,大小:51.50KB ,
资源ID:12334387      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-12334387.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STC单片机EEPROM读写程序.doc)为本站会员(11xg27ws)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

STC单片机EEPROM读写程序.doc

1、/* STC89C54RD+的 flash 空间从 0x40000xf3ff 共 90 个扇区,每扇区 512 字节 */ #define BaseAddr 0x1000 /* 51rc */ #define EndSectoraddr 0x3d00 /* 51rc */ #define EndAddr 0x3fff /* 51rc 12K eeprom */#define BaseAddr 0x4000#define EndSectoraddr 0xf200#define EndAddr 0xf3ff#define UseAddr 0x1000/* - 定义扇区大小 - */#define

2、PerSector 512/* 用户程序需要记忆的数组 , 用户实际使用了 n-1 个数据,数组长度规整到2 4 8 16 32 64 上 */uchar Ttotal16 =0x55, /* 作为判别引导头使用,用户程序请不要修改它 */* 用户保存记忆的数据 */0x01, /* 用途说明*/0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,;uint timerForDelay, /* 专供延时用的变量 */i, /* 循环变量 */EepromPtr; /* eeprom 读写指针 */* - 命

3、令定义 - */#define RdCommand 0x01 /* 字节读 */#define PrgCommand 0x02 /* 字节写 */#define EraseCommand 0x03 /* 扇区擦除 */* 定义常量 */#define Error 1#define Ok 0/* 定义 Flash 对应于 20MHz 晶振系统的操作等待时间 */* 时钟倍频时 WaitTime 用 0x00*/#define WaitTime 0x01/* = 打开 ISP,IAP 功能 = */void ISP_IAP_enable(void)EA = 0; /* 关中断 */ISP_CONT

4、R = ISP_CONTR /* 0001,1000 */ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */* = 关闭 ISP,IAP 功能 = */void ISP_IAP_disable(void)ISP_CONTR = ISP_CONTR /* ISPEN = 0 */ISP_TRIG = 0x00;EA = 1; /* 开中断 */* = 公用的触发代码 = */void ISPgoon(void)ISP_IAP_enable(); /* 打开 ISP,IA

5、P 功能 */ISP_TRIG = 0x46; /* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9; /* 触发 ISP_IAP 命令字节 2 */_nop_();/* = 字节读 = */uchar byte_read(uint byte_addr)ISP_ADDRH = (uchar)(byte_addr 8); /* 地址赋值 */ISP_ADDRL = (uchar)(byte_addr ISP_CMD = ISP_CMD /* 清除低 3 位 */ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */ISPgoon(); /*

6、触发执行 */ISP_IAP_disable(); /* 关闭 ISP,IAP 功能 */return (ISP_DATA); /* 返回读到的数据 */* = 扇区擦除 = */void SectorErase(uint sector_addr)uint iSectorAddr;iSectorAddr = (sector_addr /* 取扇区地址 */ISP_ADDRH = (uchar)(iSectorAddr 8);ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD /* 清空低 3 位 */ISP_CMD = ISP_CMD | EraseCommand; /* 擦

7、除命令 3 */ISPgoon(); /* 触发执行 */ISP_IAP_disable(); /* 关闭 ISP,IAP 功能 */* = 字节写 = */void byte_write(uint byte_addr, uchar original_data)ISP_ADDRH = (uchar)(byte_addr 8); /* 取地址 */ISP_ADDRL = (uchar)(byte_addr ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */ISP_DATA = original_dat

8、a; /* 写入数据准备 */ISPgoon(); /* 触发执行 */ISP_IAP_disable(); /* 关闭 IAP 功能 */* = 字节写并校验 = */uchar byte_write_verify(uint byte_addr, uchar original_data)ISP_ADDRH = (uchar)(byte_addr 8); /* 取地址 */ISP_ADDRL = (uchar)(byte_addr ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */ISP_DATA

9、= original_data;ISPgoon(); /* 触发执行 */* 开始读,没有在此重复给地址,地址不会被自动改变 */ISP_DATA = 0x00; /* 清数据传递寄存器 */ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD = ISP_CMD | RdCommand; /* 读命令 1 */ISP_TRIG = 0x46; /* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9; /* 触发 ISP_IAP 命令字节 2 */_nop_(); /* 延时 */ISP_IAP_disable(); /* 关闭 IAP 功能 */i

10、f(ISP_DATA = original_data) /* 读写数据校验 */return Ok; /* 返回校验结果 */elsereturn Error;/* = 数组写入 = */uchar ArrayWrite(uint begin_addr, uint len, uchar *array)uint i;uint in_addr;/* 判是否是有效范围,此函数不允许跨扇区操作 */if(len PerSector)return Error;in_addr = begin_addr /* 扇区内偏移量 */if(in_addr + len) PerSector)return Error

11、;in_addr = begin_addr;/* 逐个写入并校对 */ISP_IAP_enable(); /* 打开 IAP 功能 */for(i = 0; i 8);ISP_ADDRL = (uchar)(in_addr ISP_DATA = arrayi; /* 取数据 */ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD = ISP_CMD | PrgCommand; /* 写命令 2 */ISP_TRIG = 0x46; /* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9; /* 触发 ISP_IAP 命令字节 2 */_nop_()

12、;/* 读回来 */ISP_DATA = 0x00;ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD = ISP_CMD | RdCommand; /* 读命令 1 */ISP_TRIG = 0x46; /* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9; /* 触发 ISP_IAP 命令字节 2 */_nop_();/* 比较对错 */if(ISP_DATA != arrayi)ISP_IAP_disable();return Error;in_addr+; /* 指向下一个字节 */ISP_IAP_disable();return Ok;

13、/* = 扇区读出 = */* 程序对地址没有作有效性判断,请调用方事先保证他在规定范围内 */void ArrayRead(uint begin_addr, uchar len)/ uchar xdata data_buffer; /* 整个扇区读取缓存区 */uint iSectorAddr;uint i;iSectorAddr = begin_addr; / /* 取扇区地址 */ISP_IAP_enable();for(i = 0; i 8);ISP_ADDRL = (uchar)(iSectorAddr ISP_CMD = ISP_CMD /* 清低 3 位 */ISP_CMD =

14、ISP_CMD | RdCommand; /* 读命令 1 */ISP_DATA = 0;ISP_TRIG = 0x46; /* 触发 ISP_IAP 命令字节 1 */ISP_TRIG = 0xb9; /* 触发 ISP_IAP 命令字节 2 */_nop_();Ttotali = ISP_DATA;iSectorAddr+;ISP_IAP_disable(); /* 关闭 IAP 功能 */* =从 eeprom 中读取数据= */void DataRestore()EepromPtr = BaseAddr; /* 指向 eeprom 的起始点 */while(EepromPtr = EndAddr) /* 如果照遍都没有,是新片*/EepromPtr = BaseAddr; /* 指向 eeprom 的起始点 */for(i=0;i=EndAddr) /* 已经用完了最后一个区域 */EepromPtr = BaseAddr; /* 从头开始 */* - 数据存入前的准备 - */* 。 。 。 。 。 。 。 。 。 。 。 。 。 。转移、处理 */Ttotal0 = 0x55; /* 重申启用标记 */if(ArrayWrite(EepromPtr, 0x10, Ttotal) /* 数据写入,如果有错换一块 */goto NextArea;

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报