数据类型
在51内核的单片机里,所有变量都有相应的数据类型,C51数据类型见下表
数据类型 | 长度 | 值域 |
---|---|---|
unsigned char | 单字节 | 0~255 |
signed | 单字节 | -128~+128 |
unsigned int | 双字节 | 0~65535 |
signed int | 双字节 | -32768~+32768 |
unsigned long | 4字节 | 0~4294967295 |
signed long | 4字节 | -2147483648~+2147483648 |
float | 4字节 | ±1.175494E-38~±3.402823E+38 |
* | 1~3字节 | 对象地址 |
bit | 位 | 0或1 |
sfr | 单字节 | 0~255 |
sfr16 | 双字节 | 0~65535 |
sbit | 位 | 0或1 |
(1)char 字符类型:
char 类型的长度是 1 字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型 unsignedchar 和有符号字符类型 signed char,默认值为 signed char 类型。unsigned char 类型用字节中所有的位来表示数值,所能表达的数值范围是 0 ~ 255。signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数,负数用补码表示。所能表示的数值范围是 -128 ~ +127。unsigned char 常用于处理 ASCII 字符或用于处理≤ 255 的整型数。
(2)int 整型:
int 整型长度为 2 字节,用于存放 1 个双字节数据。分有符号 int 整型数 signed int 和无符号整型数unsigned int,默认值为 signed int 类型。signed int 表示的数值范围是 -32 768 ~ +32 767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int 表示的数值范围是 0 ~ 65 535。
(2)int 整型:
int 整型长度为 2 字节,用于存放 1 个双字节数据。分有符号 int 整型数 signed int 和无符号整型数unsigned int,默认值为 signed int 类型。signed int 表示的数值范围是 -32 768 ~ +32 767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。unsigned int 表示的数值范围是 0 ~ 65 535。
(4)float 浮点型:
float 浮点型在十进制中具有 7 位有效数字,是符合 IEEE -754 标准的单精度浮点型数据,占用 4字节。
(5)指针型:
指针型是一种特殊的数据类型,其本身就是一个变量,但在其中存放的是另一个数据的地址。在C51 中,指针的长度一般是 3 字节。根据所指向的变量类型的不同指针变量也有不同的类型,指针变量的类型也就表示了该指针指向的地址中的数据的类型
(6)bit 位标量:
bit 位标量是 C51 的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是 0 就是 1,位变量的值可以取 0(假)或 1(真)。对位变量进行定义的语法
bit flag1;
bit send_en=1;
(7)sfr 特殊功能寄存器:
单片机内的各种控制寄存器、状态寄存器以及 I/O 端口锁存器、定时器、串行端口数据缓冲器是内部数据存储器的一部分,离散地分布在 80H ~ FFH 的地址空间范围内,这些寄存器统称特殊功能寄存器(Special Function Registers,SFR)。
sfr 类型的长度为 1 字节,其定义方式为
sfr 特殊功能寄存器名 = 地址常量 ;
说明“地址常量”就是所定义的特殊功能寄存器的地址,举例如下
sfr TMOD=0x89; /* 定义定时器 / 计数器方式控制寄存器 TMOD 的地址为 89H*/
sfr P1=0x90; /* 定义 P1 口的地址为 90H*/
注意,在关键字 sfr 后面必须是一个名字,名字可以任意选取,但应符合一般的习惯。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H ~ 0FFH)。
(8)sfr16 16 位特殊功能寄存器:
在新一代的 8051 单片机中,特殊功能寄存器在功能上经常组合成 16 位来使用。为了有效地访问这种 16 位的特殊功能寄存器,可采用关键字 sfrl6。sfrl6 类型的长度为 2 字节,其定义语法与 8 位 SFR相同,但 16 位 SFR 的低端地址必须作为 sfr16 的定义地址,举例如下。
sfr16 T2=0CCH; // 定义 TIMER2,其地址为 T2L=0CCH,T2H=0CDH。
(9)sbit 可寻址位:
sbit 同样是 C51 中一种扩充数据类型,利用它能访问芯片内部的 RAM 中的可寻址位或特殊功能寄存器中的可寻址位,举例如下。PSW 是可位寻址的 SFR,其中各位可用 sbit 定义。
sbit CY=0Xd7; /* 定义进位标志 CY 的地址为 D7H*/
sbit AC=0xD0^6; /* 定义辅助进位标志 AC 的地址为 D6H*/
sbit RS0=0XD0^3; /* 定义 RS0 的地址为 D3H*/
注意,sfr 和 sbit 只能在函数外使用,一般放在程序的开头。实际上大部分特殊功能寄存器及其可位寻址的位的定义在 reg51.h、reg52.h 等头文件中已经给出,使用时只需在源文件中包含相应的头文件,即可使用 SFR 及其可位寻址的位;而对于未定义的位,使用前必须先定义,举例如下。
#include<reg51.h>
sbit P10=P1^0;
sbit P12=P1^2;
main()
{
P10=1;
P12=0;
PSW=0x08;
......
}