C51 常见数据类型详解
背景知识
Keil C51是美国Keil Software公司开发的51系列兼容单片机的C语言软件开发系统。
(1)编译器C51:美国标准优化C交叉编译器C51可以把C源代码转换成可重定位的目标文件。
(2)汇编器A51 :汇编器A51把MCS-51汇编源代码转换成可重定位的目标文件。
(3)连接/重定位器BL51:BL51组合由C51和A51产生的可重定位的目标文件生成绝对目标文件。
(4)库管理器LIB51:LIB51组合目标文件生成可以被连接器使用的库文件。
(5)转换器OH51:OH51将绝对目标文件转换成Intel HEX 格式的可执行文件。
(6)监控程序Monitor-51:用Monitor-51进行目标板调试时,此监控程序驻留在目标板的存储器里。
(7)实时操作系统RTX-51:实时操作系统RTX-51简化了复杂和对时间要求敏感的软件项目的开发。
数据类型总结
KEIL C51 编译器所支持的数据类型如下表所示:
1、位变量——bit
bit 位变量是C51 编译器的一种扩充数据类型,它的值是一个二进制位,不是0 就是1。
(1) 位变量的C51定义
位变量的C51定义的一般语法格式如下:
位类型标识符(bit) 位变量名;
例如:
bit direction; /* 把direction定义为位变量 */
bit allright ; /* 把allright定义为位变量 */
(2) 函数可包含类型为"bit"的参数,也可以将其作为返回值。
例如:
bit func(bit b0, bit b1) /*变量b0,b1作为函数的参数*/
{
return (b1); /* 变量b1作为函数的返回值 */
}
(3) 对位变量定义的限制。
位变量不能定义成一个指针,如不能定义:
bit * bit_point。
不存在位数组,如不能定义:
bit b_array[ ]
2、特殊功能寄存器——sfr
sfr 也是一种扩充数据类型,值域为0~255。用于访问51单片机内部的所有特殊功能寄存器。特殊功能寄存器C51定义的一般语法格式如下:
sfr sfr-name = int constant
其中“sfr”是定义语句的关键字,其后必须跟一个MSC-51单片机真实存在的特殊功能寄存器名,“=”后面必须是一个整型常数,不允许是带有运算符的表达式,是特殊功能寄存器“sfr-name”的字节地址,这个常数值的范围必须在SFR地址范围内,位于0x80-0xFF。
如用:sfr P1 = 0x90 定义P1为P1端口在片内的寄存器,在程序中我们用P1 = 255(对P1 端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。
C51对常用的特殊功能寄存器都在reg51.h或reg52.h中作了定义。
3、16位特殊功能寄存器——sfr16
同sfr一样,sfr16为C51的扩充数据类型,只不过是用来定义单片机的内部16位特殊功能寄存器,并且占用两个内存单元。例如:DPTR、定时器T0 和T1。
sfr16定义语句的语法格式与8位SFR相同,只是"="后面的地址必须用16位SFR的低字节地址,即低字节地址作为"sfr16"的定义地址。
例如:
sfr16 T2 = 0xCC /*定时器/计数器2:T2低8位地址为0CCH,T2高8位地址为0CDH*/
4、可寻址位——sbit
sbit 也是C51 中的一种扩充数据类型,利用它可以访问芯片内部的RAM 中的可寻址位或特殊功能寄存器中的可寻址位。它有三种定义格式:
第一种格式:
sbit bit-name = sfr-name^int constant;
寻址位符号名bit-name(必须是MCS-51单片机中规定的位名称),“=”后的“sfr-name”必须是已定义过的SFR的名字,“^”后的int constant(整常数)是寻址位在特殊功能寄存器“sfr-name”中的位号,必须是0~7范围中的数。
例如:
sfr PSW=0xD0 ; /* 定义PSW寄存器地址为D0H */
sbit OV=PSW^2 ; /* 定义OV位为PSW.2,地址为D2H */
sbit CY=PSW^7 ;/* 定义CY位为PSW.7,地址为D7H */
第二种格式:
sbit bit-name = int constant^int constant;
“=”后的int constant为寻址地址位所在的特殊功能寄存器的字节地址,“^”符号后的int constant为寻址位在特殊功能寄存器中的位号。例如:
sbit OV=0XD0^2 ;/* 定义OV位地址是D0H字节中的第2位 */
sbit CY=0XD0^7 ;/* 定义CY位地址是D0H字节中的第7位 */
第三种格式:
sbit bit-name = int constant;
“=”后的int constant为寻址位的绝对位地址。例如:
sbit OV=0XD2 ; /* 定义OV位地址为D2H */
sbit CY=0XD7 ; /* 定义CY位地址为D7H */
注意sbit和bit区别:bit和其他普通变量类型(如int)类似,只不过是定义的是一个位普通变量,而sbit定义的位必需是特殊功能寄存器或内部RAM区中的可寻址位。
5、指针类型
指针型数据本身就是一个变量,存放的是指向另一个数据的地址。对于指针的定义和标准C语言相似,例:char * pt;定义一个指向字符型变量的指针。指针变量同样要占据一定的内存单元,在C51 中它的长度一般为1-3个字节。3个字节的指针包括:1个字节存储类型和2个字节偏移地址,如下表所示:
关于C51的变量,这里补充两点:
(1)除了使用上述数据类型外,程序员还可以根据自己的习惯或爱好对数据类型进行重新定义,定义格式如下:
typedef 已有的数据类型 新的数据类型;
例如:
typedef unsigned char uchar ;将数据类型unsigned
;char用uchar代替。
uchar c ;定义一个unsigned char数据变量c
注意:这里并没有增加新的数据类型,只是对已有的某种数据类型用另一种符号表示而已。
(2)C语言是一种强类型语言。在进行表达式求值或运算时,必须使各个变量的数据类型一致。
类型转换
一、用强制类型转换符“()”对数据类型进行显式转换
二、隐式转换顺序如下:
bit→char → int → long → float
signed → unsigned
如果有几个不同数据类型的数据同时参与运算,先将低级别的数据类型隐式转换为高级别类型后再做运算,并且运算结果为高级别数据类型。
#单片机##嵌入式#