- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、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为单位读写。 ?
???简单解释一下: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, COMPACT,LARGE所规定的默认存储器类型确定变量的存储区域,(#pragma 预编译命令,可以指定函数的默认存储器模式。)C51编译器的三种存储器模式(默认的存储器类型)对变量的影响如下:?? 1. SMALL:变量被定义在8051单片机的内部数据存储器中,因此对这种变量的访问速度最快。另外,所有的对象,包括堆栈,都必须嵌入内部数据存储器,而堆栈的长度是很重要的,实际栈长取决于不同函数的嵌套深度。?? 2. COMPACT:变量被定义在分页外部数据存储器中,外部数据段的长度可达256字节。这时对变量的访问是通过寄存器间接寻址(MOVX@Ri)进行的,堆栈位于8051单片机内部数据存储器中。采用这种编译模式时,变量的高
文档评论(0)