以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a 这样的赋值语句,编译时将会出错。
(二)变量
变量是可以在程序运行过程中不断变化的量,变量的定义可以使用所有C51编译器支持的数据类型。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。
1. 变量的定义和作用范围
定义一个变量的格式如下:
[存储类型] 数据类型 [存储器类型] 变量名表
在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。
(1)存储类型
不同存储类型的变量以及不同位置定义的变量具有不同的代码有效范围,也就是变量的作用域。在单片机程序中,按照变量的存储类型,可以分为:自动变量、全局变量、静态变量和寄存器变量。
① 自动变量
自动变量是以关键字auto标识的变量类型,其一般是在函数的内部或者复合语句中使用。
自动型变量的作用域范围是函数或者复合语句的内部。在C51中,函数或复合语句内部定义自动变量时,关键字auto可以省略,即默认为自动型变量。
在程序执行过程中,自动变量是动态分配存储空间的。当程序执行到该变量声明语句时,根据变量类型自动为其分配存储空间。当该函数或者复合语句执行完毕后,该变量的存储空间将立刻自动取消,此时,该自动变量失效,在函数或者复合语句外部将不能够使用该变量。
② 全局变量
全局变量是以关键字extern标识的变量类型,如果一个变量定义在所有函数的外部,即整个程序文件的最前面,那么这个变量便是全局变量。全局变量有时也称为外部变量。
在编译程序时,全局变量将被静态地分配适当的存储空间。该变量一旦分配空间,在整个程序运行过程中便不会消失。因此,全局变量对整个程序文件都有效,即全局变量可以被该程序文件中的任何函数使用。
③ 静态变量
静态变量以关键字static定义,从变量作用域来看,静态变量和自动变量类似,作用域只是定义该变量的函数内部。如果静态变量定义在函数外部,将具有全局的作用域。
而从内存占用的角度,静态变量和全局变量类似,其始终占有内存空间。
④ 寄存器变量
单片机的CPU寄存器中也可以保存少量的变量,这种变量称为寄存器变量。寄存器变量以关键字register声明。
由于单片机对CPU寄存器的读写十分快,因此寄存器变量的操作速度要原高于其他类型的变量。寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度。
由于单片机资源有限,程序中只允许同时定义两个寄存器变量。如果多于两个,在编译时会自动地将其他的寄存器变量当做非寄存器变量来处理。
(2)存储器类型
存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。表3-4中是KEIL uVision2所能认别的存储器类型。
表3-4 存储器类型
提示
在AT89C51芯片中RAM只有低128位,位于80H到FFH的高128位则在52芯片中才有用,并和特殊寄存器地址重叠。
如果省略存储器类型,系统则会按编译模式small,compact或large所规定的默认存储器类型去指定变量的存储区域。
① small存储模式
small存储模式将函数参数和局部变量放在片内RAM(默认变量类型为DATA,最大128字节)。另外所有对象包括栈都优先放置在片内RAM,当片内RAM用满,再向片外RAM放置。
② compact存储模式
compact存储模式中将参数和局部变量放在片外RAM(默认存储类型是PDATA,最大256字节);通过R0、R1间接寻址。
③ large存储模式
large存储模式将参数和局部变量直接放入片外RAM(默认的存储类型是XDATA,最大64KB);使用数据指针DPTR间接寻址,因此访问效率较低。
(3)对变量进行绝对定位
C51扩展的关键字_at_专门用于对变量作绝对定位,_at_使用在变量的定义中,其格式为:
[存储类型] 数据类型 [存储区] 变量名1 _at_ 地址常数[,变量名2…]
例如:
① 对data区域中的 unsigned char变量aa作绝对定位:
unsigned char data aa _at_ 0x30;
② 对pdata区域中的 unsigned int数组cc作绝对定位:
unsigned int pdata cc[10] _at_ 0x34;
③ 对xdata区域中的 unsigned char变量printer_port作绝对定位:
unsigned char xdata printer_port _at_ 0x7fff;
对变量绝对定位的几点说明:
① 绝对地址变量在定义时不能初始化,因此不能对code型常量绝对定位;
② 绝对地址变量只能够是全局变量,不能在函数中对变量绝对定位;
③ 绝对地址变量多用于I/O端口,一般情况下不对变量作绝对定位;
④ 位变量不能使用_at_绝对定位。
2. 变量的初始化和赋值
(1)变量的初始化
变量的初始化是指变量在被说明的同时赋给一个初值。外部变量和静态全程变量在程序开始处被初始化,局部变量包括静态局部变量是在进入定义它们的函数或复合语句时才作初始化。所有全程变量在没有明确的初始化时将被自动清零,而局部变量和寄存器变量在未赋值前其值是不确定的。
对于外部变量和静态变量,初值必须是常数表达式,而自动变量和寄存器变量可以是任意的表达式,这个表达式可以包括常数和前面说明过的变量和函数。
例如:
(2)变量的赋值
变量赋值是给已说明的变量赋给一个特定值。
单个变量的赋值:
① 整型变量和浮点变量
赋值格式如下:
变量名=表达式;
例如:
说明:
C语言中允许给多个变量赋同一值时可用连等的方式。
例如: