变量是在程序运行过程中其值可以改变的量。在C51中,在使用变量前必须对变量进行定义,指出变量的数据类型和存储模式,以便编译系统为它分配相应的存储单元。变量的定义格式如下:
[存储种类数据类型说明符  [存储器类型变量名1[=初值],变量名2[=初值]…;
1)格式说明
1)存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有四种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。
auto定义的变量作用范围仅在定义它的函数体或复合语句内部有效。
extern定义的变量称为外部变量,其作用范围为整个程序。
static定义的变量称为静态变量。其作用范围仅在定义的函数体内有效,一直存在,再次进入该函数时,变量的值为上次结束函数时的值。
register定义的变量称为寄存器变量,处理速度快,但数目少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户无需专门声明。
2)在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用typedef#define定义的类型别名。别名要按用户自定义标识符的原则命名。例如:使用“#define  uchar  unsigned  char”定义了“uchar”,则可以使用这个类型定义变量。
3)存储器类型是用于指明变量所处的单片机的存储器区域情况。省略则默认为data类型,即片内前128字节的RAMbdata为可位寻址内部数据存储器,定义的变量可以用sbit定义位变量访问其中的二进制位;idata可以访问51的内部256字节的RAMcode定义的变量存储在程序存储器,只能读出不能写入,相当于常量。
4)变量名是C51区分不同变量,为不同变量取的名称,也就是用户自定义标识符,要遵循标识符的命名原则。
5)允许在一个类型说明符后,定义多个相同类型的变量。各变量名之间用逗号隔开,类型说明符与变量名之间至少用一个空格间隔。
6)最后一个变量名之后必须以“;”号结尾。
7)变量定义必须放在变量使用之前。一般放在函数体的开头部分。
2)变量定义示例
int  a,b,c=2;    //a,b,c为整型变量,并将变量c的初值赋为2
long  x,y;    //x,y为长整型变量
unsigned char  p,q; //p,q为无符号字符型变量
float  t=-2.3;      //定义实型变量t,并给t赋初值为-2.3
code  float  Vref=2.5;//定义变量Vref为实型,初始值为2.5,只读
一、变量的作用范围
从变量的作用范围来看,有全局变量和局部变量之分。
全局变量是指在程序开始处或各个功能函数的外面定义的变量,在程序开始处定义的全局变量对于整个程序都有效,可供程序中所有函数共同使用;而在各功能函数外面定义的全局变量只对从定义处开始往后的各个函数有效,只有从定义处往后的那些功能函数才可以使用该变量,定义处之前的函数则不能使用它。
局部变量是指在函数内部或以花括号{ }围起来的功能块内部所定义的变量,局部变量只在定义它的函数或功能块以内有效,在该函数或功能块以外则不能使用它。局部变量可以与全局变量同名,但在这种情况下局部变量的优先级较高,而同名的全局变量在该功能块内被暂时屏蔽。
二、变量的生存期
变量的生存期即该变量存在的时间。从变量的存在时间来看又可分为静态存储变量和动态存储变量。静态存储变量是指该变量在程序运行期间其存储空间固定不变;动态存储变量是指该变量的存储空间不确定,在程序运行期间根据需要动态地为该变量分配存储空间。
在定义变量时,可以指定变量的存储种类。在C51中,变量的存储种类有四种:自动(auto)、外部(extern)、静态(static)和寄存器(register)
1、自动变量
用关键字auto作存储类型说明的局部变量(包括形参)称为自动变量。
自动变量的默认范围在定义它的函数体或符合语句内部,只有在定义它的函数被调用,或是定义它的复合语句被执行时,编译器才为其分配内存空间,开始其生存期。当函数调用结束返回,或复合语句执行结束时,自动变量所占用的内存空间就被释放,其生存期结束,占用的内存空间有可能分配给其他函数中定义的自动变量。
当函数被再次调用或符合语句被再次执行时,自动变量所对应的内存空间的值将不确定,有可能不是上次运行时的值,因而必须被重新赋值。
2、外部变量(extern
按照默认规则,凡是在所有函数之前,在函数外部定义的变量都是外部变量,定义时可以不写extern说明符。但是,在一个函数体内说明一个已在该函数体外或别的程序模块文件中定义过的外部变量时,则必须使用extern说明符。一个外部变量被定义后,它就被分配了固定的内存空间。
外部变量的生存期为程序的整个执行时间,即在程序执行期间外部变量可以被随意使用,当一条复合语句执行完毕或是某一函数返回时,外部变量的存储空间并不被释放,其值也仍然保留。一次外部变量属于全局变量。
C51允许将大型程序分解为若干个独立的程序模块文件,各个模块可分别进行编译,然后再将它们连接在一起。在这种情况下,如果某个变量需要在所有程序模块文件中使用,只要在一个程序模块文件中将该变量定义成全局变量,而在其他程序模块文件中用extern说明该变量是已经被定义过的外部变量就可以了。
3、静态变量(static
静态变量不像自动变量那样只有当函数调用它时才存在,退出函数时它就消失,静态变量所分配的内存空间是独占的,始终都是存在的。静态变量只能在定义它的函数内部进行访问,退出函数时,变量的值仍然保持但是不能进行访问。使用静态变量需要占用较多的内存空间,而且降低了程序的可读性。
4、寄存器变量(register
编译器给使用register定义的变量分配单片机的通用寄存器空间,有较快的运行速度。寄存器变量可以被认为是自动变量的一种,它的有效作用范围也与自动变量相同。
由于单片机中的寄存器是有限的,不能所有变量都定义成寄存器变量。CX51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。
一般来说全局变量为静态存储变量,局部变量为动态存储变量。
A21中列出了 KEIL uVision2  C51 编译器所支持的数据类型。在标准 C 言中基本的数据类型为 charintshortlongfloat double,而在 C51 编译器中 int short 相同,float double 相同,这里就不列出说明了。
附表1  KEIL C51 编译器所支持的数据类型
数据类型    长度    值域
unsigned char    单字节    0255
signed  char    单字节    -128+127
unsigned int    双字节    065535
signed int    双字节    -32768+32767
unsigned long    四字节    04294967295
signed long    四字节    -2147483648+2147483647
float    四字节    ±1.175494E-38~±3.402823E+38
*    13字节    对象的地址
bit        01
sfr    单字节    0255
sfr16    双字节    065535
sbit        01
具体的类型说明如下:
1char 字符类型
char  类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字 符类型 unsigned char 和有符号字符类型 signed char,默认值为 signed char 类型。
unsigned char 类型用字节中所有的位来表示数值,所可以表达的数值范围是 0255 signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数, 负数用补码表示。所能表示的数值范围是-128+127unsigned char 常用于处理 ASCII 字符或用于处理小于或等于 255 的整型数。
正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1
2 int 整型
int 整型长度为两个字节,用于存放一个双字节数据。分有符号 int 整型数 signed int 和无符号整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范 围是-32768
+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。 unsigned int 表示的数值范围是 065535
3 long 长整型
long 长整型长度为四个字节,用于存放一个四字节数据。分有符号 long 长整型 signed long 和无符号长整型 unsigned long,默认值为 signed long 类型。signed int 表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned long 表示的数值范围是 04294967295
4 float 浮点型
float 浮点型在十进制中具有 7 位有效数字,是符合 IEEE754 标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。
5 * 指针型
指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要
占据一定的内存单元,对不同的处理器长度也不尽相同,在 C51 中它的长度一般为 13 个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。
6bit 位标量
bit 位标量是指针变量的定义格式 C51 编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,类似一些高级语 言中的 Boolean 类型中的 True False
7sfr 特殊功能寄存器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。