C51编译器-语言扩展(2)-数据类型

发布者:SparklingMelody最新更新时间:2016-11-14 来源: eefocus关键字:C51  编译器  语言扩展  数据类型 手机看文章 扫描二维码
随时随地手机看文章
Data Types数据类型

 

数据类型

 

位数

 

字节数

 

值域

 

bit

 

1

 

 

 

0-1

 

Signed char

 

8

 

1

 

-128-+127

 

Unsigned char

 

8

 

1

 

0-255

 

enum

 

8/16

 

1or 2

 

-128-+127 or -32768-+32767

 

Signed short

 

16

 

2

 

-32768-+32767

 

Unsigned short

 

16

 

2

 

0-65535

 

Signed int

 

16

 

2

 

-32768-+32767

 

Signed long

 

32

 

4

 

-2147483648 to 2147483647

 

unsigned long

 

32

 

4

 

0 to 4294967295

 

float

 

32

 

4

 

±1.175494E-38 to ±3.402823E+38

 

Sbit

 

1

 

 

 

0 to 1

 

sfr

 

8

 

1

 

0 to 255

 

sfr16

 

16

 

2

 

0 to 65535

 

Bit Types位类型

描述(略)

位变量和位声时存在以下限缺制:

l         禁止中断的函数(用#pragma disable),和使用usigng声明寄存器组(usigng n)的函数不能返回一个位变量。如果这样使用时,Cx51编译器就会报错。

l         位变量不能声明为指针:bit *ptr    /*错误的声明*/

l         不能使位变量数组:bit ware [5];   /*错误的声明*/

 

Bit-addressable Objects可位寻址的对象

可位寻址的对象就是可以位寻址也可以字节寻址的对象。只有占有位寻址空间的数据可以归为这一类。Cx51把用idata声明的变量放在可位寻址区域。

int bdata ibase; /* Bit-addressable int */

char bdata bary [4]; /* Bit-addressable array */

上面两个变量都是可位寻址的变量。所以这单独地访问这两个变量的每一位。使用关键字sbit可以定义新的位变量来访问用badata定义的变量,如:

sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */

sbit mybit15 = ibase ^ 15; /* bit 15 of ibase */

sbit Ary07 = bary[0] ^ 7; /* bit 7 of bary[0] */

sbit Ary37 = bary[3] ^ 7; /* bit 7 of bary[3] */

注意:不可以声明float变量的某一位为位变量。但是可以通过共同体来访问一个float变量的某一位。

位变量的地址是物理地址。位地址0指第一个可位寻址的字节的最低位。整型在内存中的存放是高位字节在前的,所以,整型的第最低位是就是第二个可位寻址字节的最低位,也就是位址的第8位。

Special Function Registers特殊功能寄存器

8051系列微处理器为特殊功能寄存器的存取提供了一个独立的内存区域。它位于地址0x80—0xFF,可以按位,字节,字的方式存取。

在8051系列微处理器中,,SFR的个数和类型是不同的,所以Cx51编译器并没有预定义这些SFR的名字。预定义这些特殊功能寄存器名字的声时文件在包含文件中。每个含文件包括可用的特殊功能寄存器的声明。

Cx51为存取SFR提供了sfr, sfr16,和sbit数据类型。下面解释这几种数据类型。

sfr

SFR的声明方法与其他C语言变量的声明方法相同。如:

sfr P0 = 0x80; /* Port-0, address 80h */

sfr P1 = 0x90; /* Port-1, address 90h */

sfr P2 = 0xA0; /* Port-2, address 0A0h */

sfr P3 = 0xB0; /* Port-3, address 0B0h */

sfr16

许多新型的8051变种使用两个连续的SFR字节来声明一个16bit的值。例如,8052使用地址0XCC和0XCD来做为定时器2的低字节和高字节。Cx51使用sfr16把2个字节的SFR做为一个16bit的SFR来访问。

一个SFR16的两个字节必须连在一起,并且低字节在前,在使用的时候把低字节的地址做为整个SFR16的地址使用。

sbit

在8051的经典应用中,经常会用到特殊功能寄存器的某一个单独的位。Cx51编译器使用不着sbit来声明这种变量。

注意:并不是所有的SFR都是可以位寻址的,只有那些地址可以被8整除的地址是可以位寻址的,也就是说它的地址的最低位必须是0或者是8。计算SFR位地址的方法是把位在特殊功能寄存器字节中的位置加上这一字节的地址。也就是说,访问在SFR地址0XC8第6位的时候,这一位的地址应该是0XCE(0XC8+6)

声时位变量的方法有以下三种:

1:sfr_name ^ int_constant

sfr PSW = 0xD0;

sbit OV = PSW ^ 2;

2。:int_constant ^ int_constant

sbit OV = 0xD0 ^ 2;

3:int_constant

sbit OV = 0xD2;

注意:特殊功能位是一个独立的类声明,不能和其他的位声时相互交换。

用sbit声明的变量不能访问用bdata数据类型定义的变量。

Absolute Variable Location变量的绝对地址

使用并键词_at_可以使变量定位于内存中的一个绝对地址。使用方法:

[memory_space] type variable_name _at_ constant;

这里:

memory_space  变量的内存的空间。如果不声明这一项,使用缺省的内存空间。参见:内存模式。

Type 变量类型

variable_name 变量名

constant 变量所要存储的地址

在关键词_at_后的地址必须在内存的特理边界以内。Cx51会检测变量地址声明的正确性

绝对地址变量声时须遵守以下规则:

1.  绝对地址变量不能初始化(在声明时)

2.  Bit类型的变量和函数不能放在绝对地址中

关键字:C51  编译器  语言扩展  数据类型 引用地址:C51编译器-语言扩展(2)-数据类型

上一篇:C51编译器-语言扩展(3)-指针
下一篇:C51编译器-语言扩展(1)-存储器模型和存储类型

推荐阅读最新更新时间:2024-03-16 15:20

PID算法调节C51程序(3)
#include stdio.h   #include math.h      struct _pid {    int pv;    int sp;    float integral;    float pgain;    float igain;    float dgain;    int deadband;    int last_error;   };      struct _pid warm,*pid;   int process_point, set_point,dead_band;   float p_gain, i_gain, d_gain, integral_val,new_integ;;        
[单片机]
使用命令行编译C51源码并生成HEX文件的示例
参考Keil\C51\HLP\C51.pdf以及A51.pdf文档,示例及说明如下: set PATH=%PATH%;G:\develop\keil\C51\BIN;G:\develop\keil\C51\INC;G:\develop\keil\C51\LIB set C51_LIB=G:\develop\keil\C51\LIB\ (注:其中的G:\develop\keil目录要改成本机安装keil的位置) set DST_NAME=obj\output (注:指定输出文件名) set DIR=D:\source (注:指定源文件所在目录) echo 转向工作目录 d: (注:源文件所在区) cd %DIR% echo 编译文件
[单片机]
C51单片机 的定时器学习笔记
/*-------------------------------------------------------*/ /* -------------author: robinson_911 -------------------------*/ /* -------------date:2014年2月 -------------------------*/ /* -------------content:关于串口 定时器程序 -----------*/ // 在22.1184MHZ下,通过定时器0,每1s通过串口发送数据 /*---------------------------------------------------
[单片机]
C51单片机 通过定时器模拟输出多路PWM
前言 本博文基于STC89C52RC和keil5 C51开发; 如有不做之处还请多多指教; 需要用到的东西 利用定时器0完成(定时器1也一样); 利用P1.0~P1.3完成4路PWM的输出(不同的占空比); 代码如下: #include STC89C5xRC.H #define ENABLE 1 #define DISENABLE 0 typedef unsigned int uint16; typedef unsigned char uchar8; sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; /* 占空比的时间
[单片机]
C51指针小结
  一. 指针变量的定义   指针变量定义与一般变量的定义类似,其形式如下:   数据类型 * 标识符;    表示被定义为基于存储器的指针。无此选项时,被定义为一般指针。这两种指针的区别在于它们的存储字节不同。一般指针在内存中占用三个字节,第一个字节存放该指针存储器类型的编码(由编译时由编译模式的默认值确定),第二和第三字节分别存放该指针的高位和低位地址偏移量。存储器类型的编码值如下: 存储类型I Idata/data/bdata xdata pdata Code 编码值 0x00 0x01 0xFE 0xFF    用于指定指针本身的存储器空间。 1、   char * c_ptr;   int
[单片机]
<font color='red'>C51</font>指针小结
C51---12 AT24C02 (I2C总线)
存储器介绍 存储器简化模型 AT24C02 引脚以及电路 内部结构框图 I2C总线❗ I2C总线介绍 I2C电路规范 I2C时序❗ I2C数据帧❗ AT24C02数据帧❗ AT24C02数据存储 功能 按键1 使数字+1 按键2 使数字-1 按键3 将数字写入AT24C02 按键4 读出AT24C02刚刚写入的数据 代码 main.c #include REGX52.H #include LCD1602.h #include Key.h #include AT24C02.h #include Delay.h unsigned char KeyNum; unsign
[单片机]
C51---12 AT24C02 (I2C总线)
Keil C51里关于堆栈指针的处理
Keil C是非常优秀的C51编译器,可能是最好的C51编译器,提供各种优化模式,对变量的优化和地址安排做得非常好。这是用C语言写代码的好处之一,如果用汇编写,得费一大番功夫给各个变量安排内存物理地址,还得时刻记住哪些地址的内存单元是已经分配了,新增加的变量就不能占用那些已经分配了的单元,以免产生内存交叠冲突和溢出。我一直非常信赖Keil C51的编译结果,在我的印象里,它对内存的分配是完美的,只要代码用它编译时没有报告任何warning和error,代码运行时不可能内存冲突或溢出的现象。 但,今天发生的事情证明我错了。 手头上有个产品的代码,代码量很大。程序跑起来的效果不大好,因此打算把代码优化一下。代码量越大,通常可优化的地方也
[单片机]
汇编语言C51语言实现跑马灯实验的比较
  当前开发 单片机 应用系统程序主要应用汇编语言和C51语言,采用汇编语言编写可直接操纵系统的硬件资源,能编写出高效运行的程序代码,程序运行速度快。而采用C51语言编写可改善程序的可读性和可移植性,利于产品的更新换代,大大加快了单片机应用程序的开发速度。下面通过一个简单的实验--跑马灯实验来分析一下这两种语言的差别。用AT89C5l实现的跑马灯实验的原理图如xia 图所示。   跑马灯实验的原理图用汇编语言编写程序来实现,程序如下: ORG 0 000H LJP START//转入主程序 ORG 0040H START:MOV SP,#60H//设置 堆栈指针 OV A,# 0 F
[单片机]
汇编<font color='red'>语言</font>与<font color='red'>C51</font><font color='red'>语言</font>实现跑马灯实验的比较
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved