单片机数据存储类型和申明方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单片机数据存储类型和申明方法

?一.51的存储器结构??? ??? 笼统来说单片机片内存储器分为CODE区和data区,cpu从code区读取指令,对data区的数据进行运算处理。前者在程序运行中为只读,一般为FLASH,用来放置程序代码和一些只读的数据(如字模表之类),后者可以随机读写,用来存放程序运行中的临时数据,如局部变量或全局变量,全局变量一直占用着RAM内存,而局部变量在使用完后会自动清除RAM空间。当然在片外,可以外扩FLASH和RAM(此时称为XRAM,因为寻址方式不一样),外扩的大小与单片机寻址能力有关。有的单片机将外扩RAM封装在片内,如AT89C51,所以有了所谓的片内XRAM。 二.变量的存储模式 ?? 变量是一种在程序执行过程中能不断变化的量。它有数据类型、存储类型、存储器模式和有效范围四种属性。C语言规定每个变量必须有一个标识符作为变量名,在使用一个变量前,必须先对变量进行定义,指出其数据类型和存储模式。以便编译系统为其分配存储单元。在C51中对变量进行定义的格式如下:? ???[存储类型] 数据类型 [存储器类型] 变量名表,如auto char data i; 存储类型指明变量的存储区域,而变量的存储类型和变量在程序中说明的位置决定了它的作用范围。存储类型含义与C语言相同。存储类型有四种:auto型、extern型、static型、register型,缺省为auto型(看来我一直都是凹凸型啊)。其区别如下: ??? auto:自动变量。存储在内存的堆栈区,属于临时性存储变量,并不长期占用内存,可以被多次覆盖。 ?? ?register:寄存器变量。register与auto一样属于自动类别。区别在于register的值保存在CPU的寄存器中。计算机中只有寄存器中的数据才能直接参与运算,而一般变量是放在内存中的,变量参加运算是,需要先把变量从内存中取到寄存器中,然后计算。所以一般把使用最频繁的变量定义成register变量。register变量只能在函数中定义,并只能是int和char型。 ??? static:静态变量。声明静态变量的,也就是C语言中的私有成员.如果在一个函数中声明一个静态变量,静态变量的空间不在栈里面,而是存储在静态空间里,这个函数结束后,静态变量的值依旧存在,内存不会收会此变量占用的内存空间,而是等整个程序都结果后才收回静态变量空间。 ?? extern:外部类型。extern用来声明外部变量,可以用于此程序外的程序中(可在两个C文件间交叉使用),类型要一致。变量在数据运行时被分配了一定的内存空间,该空间在整个运行程序中,只要程序存在,自始自终都被该变量使用,即其值始终不变。 ?? 数据类型就不用多说了,bit,byte,char什么的。 ???存储器类型与单片机的寻址方式有关,影响程序的执行效率。下表是传统C51的存储器类型,不同单片机类型有所差别。?? 空间名称 地址范围 说明 DATA D:00H~7FH 片内RAM直接寻址区 BDATA D:20H~2FH 片内RAM位寻址区 IDATA I:00H~FFH 片内RAM间接寻址区 XDATA X:0000H~FFFFH 64K片外RAM数据区 CODE C:0000H~FFFFH 64K片内外ROM代码区 BANK0~BANK31 B0:0000H~FFFFH : : B31:0000H~FFFFH 分组代码区,最大可扩展32X64KB ROM,应该只能以BANK为单位读写。 ? ???简单解释一下: data: 低128字节,可直接寻址,可以用acc直接读写的,速度最快,生成的代码也最小。 bdata:16字节位寻址区(当然也可以按字节寻址),一般很小。 idata: 固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为: MOVX ACC,@Rx。 xdata: 外部扩展RAM,一般指外部0x0000-0xffff空间,有的集成于片内,用DPTR访问。 pdata: 外部扩展RAM的低256个字节,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。 如果要指定存储地址可用如:uchar bdata LED _at_ 0x20; sbit led_7=led^7;//用关键字sbit定义位变量来独立访问可寻址位对象 int bdata ab[2];//在可位寻址区定义数组ab[2] sbit ab12=as[1]^12; 操作符“^”后面的位位置的最大值取决于指定的基址类型char 0-7,int 0-15,long 0-31。 定义变量时如果省略了“存储器类型”,则按编译模式SAMLL, CO

文档评论(0)

82393aa + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档