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

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

#单片机##嵌入式#
全部评论

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
头像
11-18 16:08
福州大学 Java
影流之主:干10年不被裁,我就能拿别人一年的钱了,日子有盼头了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务