(一)标识符
标识符是用来表示源程序中自定义对象名称的符号。其中的自定义对象可以是常量、变量、数组、结构、语句标号以及函数等。
在C51语言中,标识符可以由字母(a~z,A~Z)、数字(0~9)和下划线“_”组成,最多可支持32个字符。
C51标识符的定义不是随意的,应遵循“简洁”和“见名知意”的原则,并需要符合一定的规则:
➢ 标识符的第一个字符必须是字母或者下划线,不能为数字。由于有些编译系统专用的标识符以下划线开头,所以用户在定义标识符时一般不要以下划线开头。
➢ C51的标识符区分大小写,例如“ch1”和“Ch1”表示两个不同的标识符。
➢ 用户自定义的标识符不能与系统保留的关键字重复。
(二)关键字
关键字是C51编译器保留的一些特殊标识符,具有特定的含义和用法。单片机C51程序语言继承了ANSI C标准定义的32个关键字,如表3-1所示。
表3-1 C51的关键字
同时C51又结合单片机硬件的特点扩展了19个关键字:
_at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr
C51数据类型表3-2列出了Keil uVision2 C51编译器所支持的数据类型。
表3-2 C51编译器所支持的数据类型
1. char字符类型
char类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。char字符类型分为无符号字符类型(unsigned char)和有符号字符类型(signed char),默认值为signed char类型。
unsigned char类型用字节中所有的位来表示数值,可以表达的数值范围是0~255;signed char类型中字节最高位表示数据的符号,“0”表示正数,“1”表示负数(负数用补码表示),所能表示的数值范围是-128~ 127。
提示
unsigned char常用于处理ASCII字符或小于等于255的整型数。
正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。
2. int整型
int整型长度为两个字节,用于存放一个双字节数据。分为有符号整型数signed int和无符号整型数unsigned int,默认值为signed int类型。
signed int表示的数值范围是-32768~ 32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned int表示的数值范围是0~65535。
3. long长整型
long长整型长度为四个字节,用于存放一个四字节数据。分有符号长整型signed long和无符号长整型unsigned long,默认值为signed long类型。
signed int表示的数值范围是-2147483648~ 2147483647,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数;unsigned long表示的数值范围是0~4294967295。
4. float浮点型
float浮点型在十进制中具有7位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。浮点数的结构较复杂,单片机使用较少,这里不做详细讨论。
5. *指针型
指针型数据本身是一个变量,在这个变量中存放着指向另一个数据的地址。根据处理器的不同,指针型数据所占的内存单元也不尽相同,在C51中它的长度一般为1~3个字节。
6. bit位标量
bit 位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,非0即1。
定义格式:bit 变量名=变量值。
7. sfr特殊功能寄存器
sfr是一种扩充数据类型,占用一个内存单元,地址范围为0x80~0xFF。
定义格式为:sfr 变量名=变量地址。
利用它可以访问51单片机内部的所有特殊功能寄存器。例如,用“sfr P1=0x90”这一句定P1为P1端口在片内的寄存器。
8. sfr16 16位特殊功能寄存器
sfr16是一种扩充数据类型,占用两个内存单元,sfr16和sfr一样用于操作特殊功能寄存器,所不同的是,此类型的变量可访问16为特殊功能寄存器。
定义格式:sfr16 变量名=变量地址。
此处的变量地址为16位中的低8位地址,其地址范围为0x80~0xFF。通过sfr16变量读16位特殊功能寄存器时,先读低字节,后读高字节;写特殊功能寄存器时先写高字节,后写低字节。
9. sbit可位寻址位
sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。
定义格式:
sbit 变量名=位地址;sbit 变量名=SFR地址^位序号;sbit 变量名=sfr16变量^位序号。
因P1端口的寄存器是可位寻址的,所以我们可以定义P1_1为P1中的P1.1引脚,同样我们可以用P1.1的地址去写,这样在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。
例如:
sbit P1_1=P1^1;
sbit P1_1=0x91
常量与变量(一)常量
常量是在程序运行过程中不能改变的量,如固定的数据表、字符等。常量的数据类型只有整型、浮点型、字符型、字符串型和位标量。
1. 整型常量
不同数据类型的整型常量表示方法不同,十进制如123,0,-89等;十六进制则以0x开头如0x34,-0x3B等;长整型就在数字后面加字母L,如104L,034L,0xF340等。
2. 浮点型常量
浮点型常量可分为十进制和指数表示形式。
十进制浮点型常量由数字和小数点组成,整数或小数部分为0,可以省略但必须有小数点,如0.888,3345.345,0.0等。
指数浮点型常量表示形式为:[±]数字[.数字]e[±]数字
[]中的内容为可选项,如125e3,7e9,-3.0e-3等。
3. 字符型常量
字符型常量是单引号内的字符,如‘a’,‘d’等。表示不显示的控制字符,可以在该字符前面加一个反斜杠“\”组成专用转义字符,常用转义字符如表3-3所示。
4. 字符串型常量
字符串型常量由双引号内的字符组成,如“test”,“OK”等。当引号内没有字符时,为空字符串。
在C中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上“\0”转义字符以作为该字符串的结束符。字符串常量“A”和字符常量‘A’是不同的,前者在存储时多占用一个字节的空间。
表3-3 常用转义字符表
5. 位标量
位标量是C51编译器的一种扩充数据类型,它的值是一个二进制位,不是0就是1。
下面我们来看一些常量定义的例子: