用51hei-5板子学习单片机内部eeprom的应用

上传人:wt****50 文档编号:45664564 上传时间:2018-06-18 格式:PDF 页数:6 大小:449.54KB
返回 下载 相关 举报
用51hei-5板子学习单片机内部eeprom的应用_第1页
第1页 / 共6页
用51hei-5板子学习单片机内部eeprom的应用_第2页
第2页 / 共6页
用51hei-5板子学习单片机内部eeprom的应用_第3页
第3页 / 共6页
用51hei-5板子学习单片机内部eeprom的应用_第4页
第4页 / 共6页
用51hei-5板子学习单片机内部eeprom的应用_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《用51hei-5板子学习单片机内部eeprom的应用》由会员分享,可在线阅读,更多相关《用51hei-5板子学习单片机内部eeprom的应用(6页珍藏版)》请在金锄头文库上搜索。

1、5 5 5 51 1 1 1系列单片机内系列单片机内部部 EEPROEEPROEEPROEEPROMMMM应用应用STC89C51、52 内部都带有 2K 字节的 EEPROM,54、55 和 58都带有 16K 字节的 EEPROM,STC 单机是利 IAP 技术实现的EEPROM,内部 Flash 擦写次数可达 100,000 次以上,先来介绍下 ISP与 IAP 的区别和特点。用用 51hei-551hei-5 板子学习单片机内部板子学习单片机内部 EEPROMEEPROM 的应用的应用STC89C51、 52 内部都自带有 2K 字节的EEPROM, 54、 55 和 58 都自带有

2、16K 字节的 EEPROM, STC 单片机是利用 IAP 技术实现的 EEPROM,内部 Flash 擦写次数可达 100,000 次以上, 先 来介绍下 ISP 与 IAP 的区别和特点。 ISP:In System Programable 是指在系统编程,通俗的讲,就是片子已经焊板子上, 不用取下,就可以简单而方便地对其进行编程。比如我们通过电脑给 STC 单片机下载程序, 或给 AT89S51 单片机下载程序,这就是利用了 ISP 技术。 IAP:In Application Programable 是指在应用编程,就是片子提供一系列的机制(硬 件/软件上的)当片子在运行程序的时候可

3、以提供一种改变 flash 数据的方法。通俗点讲, 也 就是说程序自己可以往程序存储器里写数据或修改程序。 这种方式的典型应用就是用一小段 代码来实现程序的下载, 实际上单片机的 ISP 功能就是通过 IAP 技术来实现的, 即片子在出 厂前就已经有一段小的 boot 程序在里面,片子上电后,开始运行这段程序,当检测到上位 机有下载要求时,便和上位机通信,然后下载数据到存储区。大家要注意千万不要尝试去擦 除这段 ISP 引导程序,否则恐怕以后再也下载不了程序了。STC 单片机内部有几个专门的特 殊功能寄存器负责管理 ISP/IAP 功能的,见表 1。 表 1ISP/IAPISP/IAP 相关寄

4、存器列表相关寄存器列表相关寄存器列表相关寄存器列表名称地址功能描述D7D6D5D4D3D2D1D0复位值ISP_DATAE2hFlash 数据寄存器11111111ISP_ADDRHE3hFlash 高字节地址存储器00000000ISP_ADDRLE4hFlash 高字节地址存储器00000000ISP_CMDE5hFlash 命令模式寄存器MS2MS1MS0XXXXX000ISP_TRIGE6hFlash 命令触发寄存器XXXXXXXXSP_CONTRE7HISP/IA 控制寄存器ISPENSWBSSWRSTWT2WT1WT0000xx000ISP_DATA:ISP/IAP 操作时的数据寄

5、存器。 ISP/IAP: 从 Flash 读出的数据放在此处, 向 Flash 写入的数据也需放在此处。 ISP_ADDRH:ISP/IAP 操作时的地址寄存器高八位。 ISP_ADDRL:ISP/IAP 操作时的地址寄存器低八位。 ISP_CMD:ISP/IAP 操作时的命令模式寄存器,须命令触发寄存器触发方可 生效。 命令模式如表 2 所示D7D6D5D4D3D2D1D0模式选择保留命令选择000待机模式,无 ISP 操001对用户的应用程序 flash 区及数据 flash 区字节读010对用户的应用程序 flash 区及数据 flash 区字节编程表表 2 2ISP_CMDISP_CM

6、D 寄存器模式设置寄存器模式设置程序在系统 ISP 程序区时可以对用户应用程序区/数据 Flash 区(EEPROM)进行字节读/ 字节编程/扇区擦除;程序在用户应用程序区时,仅可以对数据 Flash 区(EEPROM)进行字节 读/字节编程/扇区擦除。STC89C51RC/RD+系列单片机出厂时已经固化有 ISP 引导码,并设 置为上电复位进入 ISP 程序区,并且出厂时就已完全加密。 ISP_TRIG:ISP/IAP 操作时的命令触发寄存器。 在 ISPEN(ISP_CONTR.7) =1 时,对 ISP_TRIG 先写入 46h, 再写入 B9h, ISP/IAP 命令才会生效。 STC

7、89C52RC, STC89LE52RC 单片机内部可用 Data Flash(EEPROM)的地址如表 3 所示, 其它型号单片机请查阅相关资料。 表 3STC89C52RCSTC89C52RCSTC89C52RCSTC89C52RC、STC89LE52RCSTC89LE52RCSTC89LE52RCSTC89LE52RC 单片机内部单片机内部 EEPROMEEPROMEEPROMEEPROM 地址表地址表第一扇区第二扇区第三扇区第四扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2000H21FFH2200H23FFH2400H25FFH2600H27FFH第五扇区第六

8、扇区第七扇区第八扇区起始地址结束地址起始地址结束地址起始地址结束地址起始地址结束地址2800H29FFH2A00H2BFFH2C00H2DFFH2E00H2FFFH每个扇区为 512 字节,建议大家在写程序时,将同一次修改的数据放在同一个扇区, 方 便修改,因为在执行擦除命令时,一次最少要擦除一个扇区的数据,每次在更新数据前都必 须 擦除原数据方可重新写入新数据,不能直接在原来数据基础上更新内容。 下面通过一个例子来讲解 STC 系列单片机 EEPROM 的具体用法。 【例】 :在实验板上实现如下描述,操作 STC单片机自带的 EEPROM,存储一组按秒 递增的二位数据,并且将数据实时显示在数

9、码管上,数据每变化一次就往 EEPROM 中写入 一次,当关闭实验板电源,再次开启电源时,从 EEPROM 中读取先前存储的数据,接着递 增显示。 #include #include /52 系列单片机头文件 #define uchar unsigned char #define uint unsignedint #define RdCommand 0x01 /定义 ISP 的操作命令 #define PrgCommand 0x02 #define EraseCommand 0x03 #define Error 1 #define Ok 0 #define WaitTime 0x01 /定义

10、CPU 的等待时间 sfrISP_DATA=0xe2;/寄存器申明 sfrISP_ADDRH=0xe3; sfrISP_ADDRL=0xe4; sfrISP_CMD=0xe5; sfrISP_TRIG=0xe6; sfrISP_CONTR=0xe7; sbit dula=P26;/申明 U1 锁存器的锁存端 sbit wela=P27;/申明 U2 锁存器的锁存端 ucharcodetable=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,011对用户的应用程序 flash 区及数据 flash 区扇区擦除0x39,0x

11、5e,0x79,0x71; uchar num; void delayms(uint xms) uint i,j;for(i=xms;i0;i-)/i=xms 即延时约 xms 毫秒 for(j=110;j0;j-); void display(uchar shi,ucharge)/显示子函数 dula=1;P0=tableshi;/送十位段选数据 dula=0;P0=0xff;/送位选数据前关闭所有显示,防止打开位选锁存时 wela=1;/原来段选数据通过位选锁存器造成混乱P0=0xfe;/送位选数据 wela=0;delayms(5); /延时 dula=1; P0=tablege;/送个

12、位段选数据 dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delayms(5); /* = 打开 ISP,IAP 功能 = */ void ISP_IAP_enable(void) EA= 0;/* 关中断*/ ISP_CONTR= ISP_CONTR /* 0001,1000 */ ISP_CONTR= ISP_CONTR | WaitTime; /* 写入硬件延时 */ ISP_CONTR= ISP_CONTR | 0x80;/* ISPEN=1*/ /* = 关闭 ISP,IAP 功能 = */ void ISP_IAP_disable(void)

13、ISP_CONTR= ISP_CONTR /* ISPEN = 0 */ ISP_TRIG = 0x00;EA=1;/* 开中断 */ /* = 公用的触发代码 = */ void ISPgoon(void) ISP_IAP_enable();/* 打开 ISP,IAP 功能 */ ISP_TRIG = 0x46;/* 触发 ISP_IAP 命令字节 1 */ ISP_TRIG = 0xb9;/* 触发 ISP_IAP 命令字节 2 */ _nop_(); /* = 字节读 = */ unsigned char byte_read(unsignedintbyte_addr) ISP_ADDRH

14、 = (unsigned char)(byte_addr 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr ISP_CMD= ISP_CMD /* 清除低 3 位*/ ISP_CMD= ISP_CMD | RdCommand; /* 写入读命令 */ ISPgoon();/* 触发执行*/ ISP_IAP_disable();/* 关闭 ISP,IAP 功能 */ return (ISP_DATA);/* 返回读到的数据 */ /* = 扇区擦除 = */ void SectorErase(unsignedintsector_addr) u

15、nsignedintiSectorAddr; iSectorAddr = (sector_addr /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr 8); ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD /* 清空低 3 位*/ ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令 3*/ ISPgoon();/* 触发执行*/ ISP_IAP_disable();/* 关闭 ISP,IAP 功能 */ /* = 字节写 = */ void byte_write(unsignedintbyte_addr, unsigned char original_data) ISP_ADDRH = (unsigned char)(byte_addr 8);/* 取地址*/ ISP_ADDRL = (unsigned char)(byte_addr ISP_CMD= ISP_CMD /* 清低 3 位 */ ISP_CMD= ISP_CMD | Pr

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号