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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(浮点数在E2PROM中的存取方法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

浮点数在E2PROM中的存取方法.docx

1、浮点数在E2PROM中的存取方法浮点数据在E2PROM中的存取方法摘 要 介绍了C51语言的浮点数在E2PROM中的存取方法。关键词 浮点数 非易失存储器 存取方法 C51编程1 引言由于C语言的高效性和易维护性,因而C51语言在工程中得到了广泛应用。以下所讨论的问题中的程序举例就是用C51语言编写来实现其功能和目的。在我们设计产品的过程中,通常要将一些仪器参数保存起来,作为仪器正常工作的保障,这些浮点参数一般都保存在非易失性存储器(E2PROM)中,以防丢失。2 浮点数在E2PROM中的存取21 浮点数在并行E2PROM中的存取MCS-51单片机在智能化仪器仪表的设计中得到了广泛的应用,同时

2、C51单片机开发语言方便灵活的接口编程能力和强大的数据处理能力,在单片机的开发中占有重要地位。其特有的浮点数处理能力为智能化仪器仪表的非线性矫正、数字化校准提供了方便。在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个字节中。地址 内容 ADD+00H 0x00ADD+01H 0x00ADD+02H 0x48ADD+03H

4、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浮点数占用连续的4个字节的存储单元,浮点数的存储也必须是连续的4个字节存储单元。以上语句不能完成

5、浮点数在2817、2864等E2PROM中的保存,因此必须为浮点数存储编写专门的存储程序。定义ap是指向非易失性存储器2817A、2864的指针,非易失性存储器2817A、2864分配的地址为0x2200。利用指针将RAM中的浮点数依次取出,按字节依次连续存储在非易失性存储器2817A、2864中。也可以使用联合(共用体)将RAM中的浮点数依次取出,按字节依次连续存储在非易失性存储器2817A、2864中。程序执行后,浮点数s的值就自动变为12.5,并可以由浮点变量xx直接引用或参与运算。程序流程框图如图1所示,程序如下:#include #include #include #include

6、#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*0x880=0x2200浮点数占用4个字节*/float xdata k=12.5;uchar *ap=&d2864;uchar *k_ap=&k;float xdata xx;void delay(uint tt)

7、/* 延迟1mS子程序*/ uint k;while(tt-!=0) for(k=0;k72;k+)continue; void writef_P2864(uint byte_address,float value) uchar i;union float a; /* 定义一个联合 */ uchar b4; y;y.a=value; /* 将要写入的浮点数送给联合型变量 */ for(i=0;i4;i+) /* 写浮点数的四个字节数据至指定的地址 */ XDATAbyte_address+i=y.bi;delay(10);float readf_XDATA(uint byte_address)

8、 union float a; /* 定义一个联合 */ uchar b4; y; uchar i; float x_value; for(i=0;i4;i+) /* 从指定的地址读四个字节的浮点数据 */y.bi = XBYTEbyte_address+i; x_value = y.a; /* 将读出的浮点数送给浮点变量x_value */ return(x_value); /* 返回读出的浮点数值x_value至原调用程序 */main() uchar i;for(i=0;i4;i+) /* 依次从RAM中读出四个字节的浮点数 */ while(*ap!=*k_ap) *ap=*k_ap;

9、 delay(10); /* 延迟10mS时间,等待单字节写入结束*/ ap+; /* 指向EEPROM的指针变量加1 */k_ap+; /* 指向RAM的指针变量加1 */xx=s; /* 从EEPROM中读出浮点数 */xx= readf_XDATA(0x2200); 22浮点数在串行E2PROM中的存取由于串行E2PROM如24C 系列、93C 系列等集成电路具有体积小、功耗低、价格便宜,使用中占用系统的信号线少,接口简单、通信方便的特点,但相对工作速度慢,读写方法要稍许复杂一些,因此被广泛应用于存储数据量不太大、写入速度要求不很高的场合。自定时写周期包括自动擦除时间不超过10mS,典型

10、时间为5mS。同时串行E2PROM还有一个重要的特点是所有的DIP封装的产品都是8个引脚,而且引脚输出兼容,这就使性能更新升级变得很简单而经济。由于串行E2PROM按字节或字操作,位串行通信,因此浮点数也只能以字节或字方式进行写操作,将浮点数四个字节依次分开的方法类似于并行的E2PROM,但必须有专门的写程序进行每个字节的串行写入。而其读操作也与并行的E2PROM截然不同,被程序重新调用之前,必须将存储在串行E2PROM中的字节用专门的读程序串行的恢复到相应RAM中,不能直接在E2PROM中进行读操作。24C32与8031的接口电路如图2所示。同样可定义ap是指向存储器RAM6264(0x22

11、00)的指针,串行非易失性存储器24C08、24C32等分配的地址为0xb000。利用指针将在RAM中的浮点数依次取出(使用联合也可以将RAM中的浮点数依次取出),然后调用专门的串行字节写入子程序按字节依次连续存储在非易失性存储器24C08、24C32等中。由于其特点,为了调用存储的浮点参数,首先要将存储在E2PROM连续单元中的字节数据,串行的读出来恢复到RAM中,进行各种操作。程序执行后,浮点数s的值就自动变为12.5,并可以由浮点变量xx直接引用或参与运算。A0 VCC A1 WPA2 SCLVSS SDARESET 8031P1.0P1.1 Vcc 9 24C32 1 2VCC图2 2

12、4C32与8031接口电路 下面是以图2所示的电路编写的24C32存储浮点数程序。24C32时序如图3、图5所示,程序流程框图如图4所示。#include #include #include 图 3 24C32时序图#include #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(

13、i=0;i4;i+) xbyte=*k_ap; /*xbyte=浮点数的第i个字节值*/write(0xb000+i,xbyte); /*串行E2PROM字节写子程序*/delay(720); /* 延迟数10mS的时间,等待自定时写周期结束*/k_ap+;for(i=0;i4;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个

14、字节*/*ap=xbyte; /* 将字节值放入RAM中 */ap+;xx=s;write(addr,value)、read(addr)分别为单字节串行E2PROM存储、读取子程序。Init24C32() SDA=1; /* SDA设定为“1”电平 */ SCL=1; /* SCL设定为“1”电平 */void delay(uchar tt) /* tt=72,延迟1mS */ uchar k; for(k=0;k8); /* 先传送地址高字节,再传送地址低字节 */SedByte(addr&0xff);SendByte(value); /* 再将数据写入指定的地址内 */Stop(); /*

15、 传送停止信号 */uchar read(uint addr) /* 从指定的地址读字节数据 */ uchar temp;start(); /* 传送起始信号 */SendByte(0xA0); /* 传送从地址0xA0 */SendByte(addr8); /* 先传送地址高字节,再传送地址低字节 */SedByte(addr&0xff);Start(); /* 再一次传送起始信号 */SendByte(0xA1); /* 传送从地址0xA1,即“读出”的从地址 */temp=ReceiveByte(); /* 接收从EEPROM读出的数据,并暂存至temp变量*/SendAcknowled

16、ge(1); /* 传送确认信号等于“1”电平 */Stop(); /* 传送停止信号 */return(temp); /* 返回读出值temp至原调用程序 */bit SendByte(uchar bytedata)/* 传送一个字节数据的子程序 */ uchar i;bit ack; /* ack为“确认标志变量” */SDA=1; /* SDA先置为“1”电平 */for(i=0;i8;i+) /* 要传送一个Byte数据,所以要执行8次 */ if(bytedata&0x80)SDA=1; /* 如果最高位为“1”,置SDA=“1”*/else SDA=0; /* 否则清SDA=“0”

17、*/bytedata=1;delay(1); /*每传送1位,则将待传数据左移1位 */SCL=1; delay(1); /*SCL作“1”到“0”的变化(即产生SCL下降沿)*/ SCL=0; delay(1); SDA=1; delay(1); /*SDA和SCL先置为“1”电平,以让确认信号出现 */SCL=1; delay(1); ack=SDA; /* 读取确认信号 */SCL=0; delay(1); /* 将SCL恢复为“0”电平 */return(ack); /* 返回确认信号(ack)至原调程序 */uchar ReceiveByte() /* 读取一个字节数据的子程序 */

18、 uchar i,bytedata=0; /* 定义循环变量、读取的数据变量及初始化*/for(i=0;i8;i+) /* 读取8个位,循环作8次 */ SCL=1;delay(1); /* SCL必须先置为“1”电平,并延迟数S的时间*/byteData=1; /* 先将数据变量左移1位 */if(SDA) bytedata |=0x01;/*如果SDA=“1”,则接收数据加1(bit0置“1”)*/SCL=0;delay(1); /*否则左移一位,bit0会自动清为0 */ return(bytedata); /*返回读到的数据至原调用程序*/3 结论对于字节数据和字型数据的存取操作相对比较容易,而对C51浮点数的E2PROM存取操作则比较复杂,以上的方法在产品的设计过程中有切实的实用价值。参考文献马忠梅. 单片机C语言应用程序设计. 北京:北京航空航天大学出版,2007.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1