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