[存储种类] 数据类型 [存储器类型] 变量名表 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为自动(auto)。 |
||||||||||||||
表6-1 存储器类型 |
||||||||||||||
如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无关的。 SMALL存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区这使访问数据非常快,但SMALL存储模式的地址空间受限。在写小型的应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快,但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。 COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区。外部数据存储区可有最多256字节(一页),在本模式中外部数据存储区的短地址用@R0/R1。 LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区外部数据区最多可有64KB,这要求用DPTR数据指针访问数据。 之前提到简单提到sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。 sfr和sfr16可以直接对51单片机的特殊寄存器进行定义,定义方法如下: sfr 特殊功能寄存器名= 特殊功能寄存器地址常数; sfr16 特殊功能寄存器名= 特殊功能寄存器地址常数; 我们可以这样定义AT89C51的P1口 sfr P1 = 0x90; //定义P1 I/O口,其地址90H sfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1口可以用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH),具体可查看附录中的相关表。sfr是定义8位的特殊功能寄存器而sfr16则是用来定义16位特殊功能寄存器,如8052的T2定时器,可以定义为: (1)sbit 位变量名=位地址
sbit P1_1 = Ox91; 这样是把位的绝对地址赋给位变量。同sfr一样sbit的位地址必须位于80H-FFH之间。 sft P1 = 0x90; sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置 当可寻址位位于特殊功能寄存器中时可采用这种方法 sbit P1_1 = 0x90 ^ 1; 这种方法其实和2是一样的,只是把特殊功能寄存器的位址直接用常数表示。 unsigned char bdata ib; //在可位录址区定义ucsigned char类型的变量ib int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象 sbit ib7=ib^7 //用关键字sbit定义位变量来独立访问可寻址位对象的其中一位 sbit ab12=ab[1]^12; 操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31。
sfr P1 = 0x90; //这里没有使用预定义文件, sbit P1_0 = P1 ^ 0; //而是自己定义特殊寄存器 sbit P1_7 = 0x90 ^ 7; //之前我们使用的预定义文件其实就是这个作用 sbit P1_1 = 0x91; //这里分别定义P1端口和P10,P11,P17引脚 void main(void) { unsigned int a; unsigned char b; do{ for (a=0;a<50000;a++) P1_0 = 0; //点亮P1_0 for (a=0;a<50000;a++) P1_7 = 0; //点亮P1_7 for (b=0;b<255;b++) { for (a=0;a<10000;a++) P1 = b; //用b的值来做跑马灯的花样 } P1 = 255; //熄灭P1上的LED for (b=0;b<255;b++) { for (a=0;a<10000;a++) //P1_1闪烁 P1_1 = 0; for (a=0;a<10000;a++) P1_1 = 1; } }while(1); }
转自:http://blog.sina.com.cn/s/blog_739afc250100vbpj.html
|