




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、浮点数据在E2PROM中的存取方法摘 要 介绍了C51语言的浮点数在E2PROM中的存取方法。关键词 浮点数 非易失存储器 存取方法 C51编程1 引言由于C语言的高效性和易维护性,因而C51语言在工程中得到了广泛应用。以下所讨论的问题中的程序举例就是用C51语言编写来实现其功能和目的。在我们设计产品的过程中,通常要将一些仪器参数保存起来,作为仪器正常工作的保障,这些浮点参数一般都保存在非易失性存储器(E2PROM)中,以防丢失。2 浮点数在E2PROM中的存取21 浮点数在并行E2PROM中的存取MCS-51单片机在智能化仪器仪表的设计中得到了广泛的应用,同时C51单片机开发语言方便灵活的接
2、口编程能力和强大的数据处理能力,在单片机的开发中占有重要地位。其特有的浮点数处理能力为智能化仪器仪表的非线性矫正、数字化校准提供了方便。在C51中,如果浮点数被分配在RAM存储空间,如6264、6116、62256、62128等,其数据的存取由C51自动编译完成,不必编写专门的程序。而非易失性存储器2817A、2864等虽然硬件接口没有特殊要求,但写周期与RAM不同,因此必须为浮点数存储编写专门的存储程序。一般情况下,用户定义的浮点数在RAM中的地址、存储方式对用户是未知的。但是用户可以通过C51的指针实现对C51浮点数的按字节访问,C51语言的指针是它的一大特色,表现出很强的数据处理能力和灵
3、活性。使用指针可以有效地表示复杂的数据结构,动态分配存储器,直接处理内存地址等,简化程序设计。浮点数在内存中的存储方式如表1所示。地址0123内容MMMMMMMMMMMMMMMMEMMMMMMMSEEEEEEE 表1 浮点数在内存中的存储其中,S 符号位,1表示负,0表示正; E 阶码(在两个字节中)偏移最大为127; M 23位尾数,最高位为1。例如浮点数变量k=12.5的十六进制表示为:0xC1 48 00 00,它按如下方式保存于内存RAM的连续4个字节中。地址 内容
4、ADD+00H 0x00ADD+01H 0x00ADD+02H 0x48ADD+03H 0xC1通过以下语句可以直接对变量进行读写操作。float xdata k, s ;定义浮点数k,s位于外部RAMk=12.5 ;为变量k赋值为12.5s= k ;为变量s赋值为12.5由于非易失性存储器2817A、2864等的读操作与RAM类似,而擦、写时间周期比随机存储器RAM要长得多,一般一个字节的擦除和写访问时间为200S或1 mS,最大的写入周期(包括擦除和写入)时间不超过10mS,典型时间为5mS。因此在实际应用中要满足擦、写周期时间要求,应根据芯片的要求设置等待或中断、查询。每个C51浮点数占
5、用连续的4个字节的存储单元,浮点数的存储也必须是连续的4个字节存储单元。以上语句不能完成浮点数在2817、2864等E2PROM中的保存,因此必须为浮点数存储编写专门的存储程序。定义ap是指向非易失性存储器2817A、2864的指针,非易失性存储器2817A、2864分配的地址为0x2200。利用指针将RAM中的浮点数依次取出,按字节依次连续存储在非易失性存储器2817A、2864中。也可以使用联合(共用体)将RAM中的浮点数依次取出,按字节依次连续存储在非易失性存储器2817A、2864中。程序执行后,浮点数s的值就自动变为12.5,并可以由浮点变量xx直接引用或参与运算。程序流程框图如图1
6、所示,程序如下:#include <reg51.h>#include <math.h>#include <absacc.h>#include <defines.h>#define uchar unsigned char#define uint unsigned int#define d2864 XBYTE0x2200 开始市从RAM中按字节取浮点数 是否取完按字节写入EEPROM是否写完延 时从EEPROM中读是否读完结 束 N Y N Y N Y 图1 并行EEPROM2864程序框图#define s XFLOAT0x0880 /*4*0x8
7、80=0x2200浮点数占用4个字节*/float xdata k=12.5;uchar *ap=&d2864;uchar *k_ap=&k;float xdata xx;void delay(uint tt) /* 延迟1mS子程序*/ uint k;while(tt-!=0) for(k=0;k<72;k+)continue; void writef_P2864(uint byte_address,float value) uchar i;union float a; /* 定义一个联合 */ uchar b4; y;y.a=value; /* 将要写入的浮点数送给联
8、合型变量 */ for(i=0;i<4;i+) /* 写浮点数的四个字节数据至指定的地址 */ XDATAbyte_address+i=y.bi;delay(10);float readf_XDATA(uint byte_address) union float a; /* 定义一个联合 */ uchar b4; y; uchar i; float x_value; for(i=0;i<4;i+) /* 从指定的地址读四个字节的浮点数据 */y.bi = XBYTEbyte_address+i; x_value = y.a; /* 将读出的浮点数送给浮点变量x_value */ r
9、eturn(x_value); /* 返回读出的浮点数值x_value至原调用程序 */main() uchar i;for(i=0;i<4;i+) /* 依次从RAM中读出四个字节的浮点数 */ while(*ap!=*k_ap) *ap=*k_ap; delay(10); /* 延迟10mS时间,等待单字节写入结束*/ ap+; /* 指向EEPROM的指针变量加1 */k_ap+; /* 指向RAM的指针变量加1 */xx=s; /* 从EEPROM中读出浮点数 */xx= readf_XDATA(0x2200); 22浮点数在串行E2PROM中的存取由于串行E2PROM如24C&
10、#180; ´ 系列、93C´ ´ 系列等集成电路具有体积小、功耗低、价格便宜,使用中占用系统的信号线少,接口简单、通信方便的特点,但相对工作速度慢,读写方法要稍许复杂一些,因此被广泛应用于存储数据量不太大、写入速度要求不很高的场合。自定时写周期包括自动擦除时间不超过10mS,典型时间为5mS。同时串行E2PROM还有一个重要的特点是所有的DIP封装的产品都是8个引脚,而且引脚输出兼容,这就使性能更新升级变得很简单而经济。由于串行E2PROM按字节或字操作,位串行通信,因此浮点数也只能以字节或字方式进行写操作,将浮点数四个字节依次分开的方法类似于并行的E2PROM
11、,但必须有专门的写程序进行每个字节的串行写入。而其读操作也与并行的E2PROM截然不同,被程序重新调用之前,必须将存储在串行E2PROM中的字节用专门的读程序串行的恢复到相应RAM中,不能直接在E2PROM中进行读操作。24C32与8031的接口电路如图2所示。同样可定义ap是指向存储器RAM6264(0x2200)的指针,串行非易失性存储器24C08、24C32等分配的地址为0xb000。利用指针将在RAM中的浮点数依次取出(使用联合也可以将RAM中的浮点数依次取出),然后调用专门的串行字节写入子程序按字节依次连续存储在非易失性存储器24C08、24C32等中。由于其特点,为了调用存储的浮点
12、参数,首先要将存储在E2PROM连续单元中的字节数据,串行的读出来恢复到RAM中,进行各种操作。程序执行后,浮点数s的值就自动变为12.5,并可以由浮点变量xx直接引用或参与运算。A0 VCC A1 WPA2 SCLVSS SDARESET 8031P1.0P1.1 Vcc 9 24C32 1 2VCC图2 24C32与8031接口电路下面是以图2所示的电路编写的24C32存储浮点数程序。24C32时序如图3、图5所示,程序流程框图如图4所示。#include <reg51.h>#include <math.h>#include <absacc.h>图 3
13、24C32时序图#include <defines.h>#define d6264 XBYTE0x2200#define s XFLOAT0x880 /* 4*0x880=0x2200浮点数占用4个字节 */float xdata k=-12.5;uchar *ap=&d6264;uchar *k_ap=&k;uchar i,xbyte;float xdata xx=10;main() Init24C32();for(i=0;i<4;i+) xbyte=*k_ap; /*xbyte=浮点数的第i个字节值*/write(0xb000+i,xbyte); /*串行
14、E2PROM字节写子程序*/delay(720); /* 延迟数10mS的时间,等待自定时写周期结束*/k_ap+;for(i=0;i<4;i+) 开始从RAM中按字节取浮点数按位写入EEPROM是否8位是否写完4字节从EEPROM中按字节读浮点数结 束是否8位是否读完4字节 按位从EEPROM读 N Y N Y N Y N Y图4 串行EEPROM24c32程序框图 xbyte=read(0xb000+i);/*串行E2PROM字节读子程序读浮点数第i个字节*/*ap=xbyte; /* 将字节值放入RAM中 */ap+;xx=s;write(addr,value)、read(addr
15、)分别为单字节串行E2PROM存储、读取子程序。Init24C32() SDA=1; /* SDA设定为“1”电平 */ SCL=1; /* SCL设定为“1”电平 */void delay(uchar tt) /* tt=72,延迟1mS */ uchar k; for(k=0;k<tt;k+)continue;void SendAcknowledge(bit ack) SDA=ack; /*设定SDA为要传送的确认信号*/ SCL=1;delay(1); /*SCL作“1”到“0”的变化(即产生SCL下降沿)*/ SCL=0;void Start() SDA=1; SCL=1;del
16、ay(1); /*SDA和SCL先置为“1”电平,并延迟数S的时间 */ SDA=0;delay(1); /*SDA必须先清为“0”电平,并延迟数S的时间*/ SCL=0; /*SCL才可以清为“0”电平*/void Stop() SDA=0;delay(1); /*SDA清为“0”电平,并延迟数S的时间*/ SCL=1;delay(1); /*SCL必须先置为“1”电平,并延迟数S的时间*/ 图 5 串行E2PROM启动和停止时序 SDA=1; /*SDA才可以置为“1”电平*/void write(uint addr,uchar value) /* 写字节数据到指定的地址 */ Start
17、(); /* 传送起始信号 */ SendByte(0xA0); /* 传送从地址0xA0 */SendByte(addr>>8); /* 先传送地址高字节,再传送地址低字节 */SedByte(addr&0xff);SendByte(value); /* 再将数据写入指定的地址内 */Stop(); /* 传送停止信号 */uchar read(uint addr) /* 从指定的地址读字节数据 */ uchar temp;start(); /* 传送起始信号 */SendByte(0xA0); /* 传送从地址0xA0 */SendByte(addr>>8)
18、; /* 先传送地址高字节,再传送地址低字节 */SedByte(addr&0xff);Start(); /* 再一次传送起始信号 */SendByte(0xA1); /* 传送从地址0xA1,即“读出”的从地址 */temp=ReceiveByte(); /* 接收从EEPROM读出的数据,并暂存至temp变量*/SendAcknowledge(1); /* 传送确认信号等于“1”电平 */Stop(); /* 传送停止信号 */return(temp); /* 返回读出值temp至原调用程序 */bit SendByte(uchar bytedata)/* 传送一个字节数据的子程序 */ uchar i;bit ack; /* ack为“确认标志变量” */SDA=1; /* SDA先置为“1”电平 */for(i=0;i<8;i+) /* 要传送一个Byte数据,所以要执行8次 */ if(bytedata&0x80)SDA=1; /* 如果最高位为“1”,置SDA=“1”*/else SDA=0; /* 否则清SDA=“0”*/bytedata<<=1;delay(1); /*每传送1位,则将待传数据左移1位 */SCL=1; delay(1); /*SCL作“1”到“0”的变化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 虚拟现实房地产虚拟现实体验馆建设合同
- 进出口代理合同纠纷撤诉申请书
- 次性采购合同5篇
- 装修合作框架合同模板
- 培训机构劳动合同范本模板
- 维修安装服务合同协议书范本10篇
- 广州华南商贸职业学院《国土空间总体规划设计》2023-2024学年第二学期期末试卷
- 2025年聚氨基双马来酰胺合作协议书
- 2025年烟度计合作协议书
- 会计师审计工作经历证明书(7篇)
- 四下劳动实践试题及答案
- 青马工程测试题及答案
- 医疗机构经营情况说明范文
- 月子中心产康部产后恢复流程解析
- 中国邮政集团有限公司国企招聘笔试真题2024
- 社会福利 课件汇 高和荣 第6-11章 社会福利客体-社会福利的挑战
- 2025年安徽合肥东部新中心建设管理办公室招聘2人历年高频重点模拟试卷提升(共500题附带答案详解)
- 热电材料与器件-深度研究
- 2024-2025学年统编版道德与法治八年级下册第四单元检测卷(含答案)
- GB/T 2812-2024头部防护通用测试方法
- 呼吸机湿化的护理
评论
0/150
提交评论