锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

C51 常见数据类型详解

时间:2022-12-03 07:30:00 压差传感器dpt0100u1

目录

背景知识

总结数据类型

1、位变量——bit

2.特殊功能寄存器——sfr

3.16个特殊功能寄存器——sfr16

4、可寻址位——sbit

5、指针类型

类型转换


背景知识

Keil C51是美国Keil Software公司开发的51系列C语言软件开发系统与单片机兼容。

(1)编译器C51:美国标准优化C交叉编译器C51可以把C源代码转换为可重定位目标文件

(2)汇编器A51 :汇编器A51把MCS-51汇编源代码转换可重定位目标文件

(3)连接/重定位器BL51:BL51组合由C51和A51生成的可重定位目标文件生成绝对目标文件。

(4)库管理器LIB51:LIB组合目标文件生成可用于连接器的库文件。

(5)转换器OH51:OH51将绝对目标文件转换为绝对目标文件Intel HEX 可执行文件的格式。

(6)监控程序Monitor-51:用Monitor-目标板调试时,监控程序停留在目标板的存储器中。

(7)实时操作系统RTX-51:实时操作系统RTX-51简化了对时间要求敏感的复杂软件项目的开发。

总结数据类型

KEIL C51 如下表所示:

1、位变量——bit

bit 位变量是C51 一种扩展数据类型的编译器,它的值是二进制位,而不是0 就是1。

(1) 位变量的C51定义

位变量的C一般语法格式的定义如下:

类型标识符(bit) 位变量名;

例如:

bit direction; /* 把direction定义为位变量 */

bit allright ; /* 把allright定义为位变量 */

(2) 函数可以包含类型为"bit"该参数也可作为返回值。

例如:

bit func(bit b0, bit b1) /*变量b0,b作为函数的参数*/

{

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

        如果有几个不同数据类型的数据同时参与运算,先将低级别的数据类型隐式转换为高级别类型后再做运算,并且运算结果为高级别数据类型。

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章