当前位置:首页 > 单片机 > 单片机
[导读]C51 中的变量定义 C51可支持图5-1所列的数据类型,但80C51单片机的CPU是一个8位微控制器。用8位字节(如:char和unsigned char)的操作比用整数或长整数类型的操作更有效。对于C这样的高级语言,不管使用什么样的数据

C51 中的变量定义

C51可支持图5-1所列的数据类型,但80C51单片机的CPU是一个8位微控制器。用8位字节(如:char和unsigned char)的操作比用整数或长整数类型的操作更有效。对于C这样的高级语言,不管使用什么样的数据类型,表面上看起来很简单,然而,实际上C51编译器要用一系列机器指令对其进行复杂的数据类型处理。特别是使用浮点变量时,将明显地增加程序长度和运算时间。除非程序必须保证运行精度,在编写C程序时,尽量避免使用大量的不必要的变量类型。否则会增加所调用的函数的数量,使程序过于庞大,运行速度降低,甚至在代码区中无法安装。

下面仅对C51在变量定义中注意的问题以及与80C51存储资源有关的问题作说明,其余遵循C语言的规定。

1.变量声明

在变量的声明中,可以包括存储类型和signed或unsigned等属性。如:

(1)char data var1;

定义字符型变量var1,被分配在内部RAM低128B,编译后,通过直接寻址方式访问。

(2)char code text[ ] = “ENTER PARAMETER”;

定义字符数组text[ ],将其分配到程序存储区,并赋初始值“ENTER PARAMETER”。编译后,通过MOVC A, @A+DPTR访问。

(3)unsigned long xdata array[100];

定义无符号长整型数组array[100],将其分配到外RAM中,编译后,通过MOVX A, @DPTR访问。

(4)float idata x,y,z;

定义浮点类型变量x,y,z,将其分配到内RAM中,编译后,通过间接寻址方式访问。

(5)unsigned int pdata dimension;

定义无符号整型变量dimension,将其分配到外RAM中,编译后,通过MOVX A, @Ri指令采用分页的形式访问。

(6)unsigned char xdata vector[10][4][4];

定义无符号字符型数组vector[10][4][4],将其分配到外RAM中,编译后,通过MOVX A,@DPTR访问。

(7)char bdata flags;

定义字符型变量flags,将其分配到可位寻址的内部数据存储器中,可以以字节方式访问,也可以以位方式访问。

如果在变量的定义中,没有包括存储器类型,编译器将自动选用默认或暗示的存储器类型。暗示的存储器类型适用于所有的全局变量和静态变量,还有不能分配在寄存器中的函数参数和局部变量。默认的存储器类型由编译器的参数SMALL、COMPACT及LARGE决定,这些参数定义了编译时使用的存储模式。

2.位变量(bit)

与80C51硬件特性操作有关的可以定义成位变量。位变量定位在80C51单片机的片内RAM的位寻址空间。

3.整型变量(int)

整形变量的长度为16位,占2个字节,在存储器中的存放格式为高位在低地址字节,低位在高地址字节。

4.浮点变量(float)

浮点变量的长度为32位,占4个字节,在存储器中的存放格式如下:


地址

+0

+1

+2

+3

内容

MMMMMMMM

MMMMMMMM

EMMMMMMM

SEEEEEEE


其中: S表示符号位,1表示“正”,0表示“负”。

M表示23尾数,省略了最高位1。

E表示8位指数位。

5.特殊功能寄存器(sfr、sfr16、sbit)

80C51单片机提供128B的SFR寻址区,这个区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其他部件,分别由以下几种关键字说明:

(1)sfr:字节寻址。比如sfr P0=0x80;表示P0口地址为80H,“=”后为80H~FFH之间的常数。

(2)sfr16:字寻址。如sfr16 T2=0xCCCD;指定Timer2口地址T2L=CCH,T2H=CDH。

(3)sbit:位寻址。如sbit EA=0xAF位为EA,即中断允许。还可以有如下的定义方法:

例如:sbit OV=PSW^2; /*定义OV为PSW的第2位,当然需要先有PSW定义*/

sbit OV=0XD0^2; /*同上*/

在实际应用中,建议将这些定义放入一个头文件中,以便使用。KeilC51中的reg51.h便是这样一个文件,所以,在C程序中会看到“#include”语句。

6.C51中的指针

C51编译器支持用星号(*)进行指针声明。可以用指针完成在标准C语言中所有操作。另外,由于80C51单片机及其派生系列所具有的独特结构,C51编译器支持两种不同类型的指针:存储器指针和通用指针。

(1)通用指针。通用或未定型的指针的声明和标准C语言中一样。如:

char * s; /*字符指针*/

int * numptr; /*整型指针*/

long * state; /*长整型指针*/

通用指针总是需要三个字节来存储:第一个字节表示存储器类型,第二个字节是指针的高字节,第三个字节是指针的低字节。

通用指针可以用来访问所有类型的变量,而不管变量存储在哪个存储空间中。因而,许多库函数都使用通用指针。通过使用通用指针,一个函数可以访问数据,而不用考虑它存储在什么存储器中。

通用指针很方便,但是也很慢。在所指向目标的存储空间不明确的情况下,它们用得最多。

(2)存储器指针。存储器指针或类型确定的指针在定义时包括一个存储器类型说明,并且总是指向此说明的特定存储器空间。例如:

char data * str; /*指向内RAM低128B的字符指针*/

int xdata * numtab; /*指向程序存储区的长整形指针*/

正是由于存储器类型在编译时已经确定,通用指针中用来表示存储器类型的字节就不再需要了。

指向idata、data、bdata和pdata的存储器指针用一个字节保存,指向code和xdata的存储器指针用两个字节保存。使用存储器指针比通用指针效率要高,速度要快。当然,存储器指针的使用不是很方便。在所指向目标的存储空间明确并不会变化的情况下,它们用得最多。

7.C51中的函数

C51中函数的定义和使用与标准C基本相同,但对递归调用有所不同,C51编译器采用一个扩展关键字reentrant作为定义函数的选项,需要将一个函数定义为再入函数时,只要在函数名的后面加上关键字reentrant即可,其格式如下:

函数类型 函数名(形式参数)[reentrant]

再入函数可被递归调用,无论合适,包括中断服务函数在内的任何函数都可调用再入函数。与非再入函数的参数传递和局部变量的存储分配方法不同,C51编译器为再入函数生成一个模拟栈,通过这个模拟栈来完成参数传递和存放局部变量。模拟栈所在的存储空间根据再入函数存储器模式的不同,可以是data、pdata或xdata存储空间。当程序中包含有多种存储器模式的再入函数时,C51编译器为每种模式单独建立一个模拟栈并独立管理各自的指针。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的...

关键字: C51 数据类型 扩充定义

数据元(Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

Perl是一种弱类型语言,所以变量不需要指定类型,Perl解释器会根据上下文自动选择匹配类型。Perl有三个基本的数据类型:标量、数组、哈希。以下是这三种数据类型的说明:序号类型和描述1标量标量是Perl语言中最简单的一...

关键字: 数据类型

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

▼点击下方名片,关注公众号▼大家好,很高兴和各位一起分享我的第16篇原创文章,喜欢和支持我的工程师,一定记得给我点赞、收藏、分享。加微信[xyzn3333]与作者沟通交流,免费获取更多单片机与嵌入式的海量电子资料。很多初...

关键字: 51单片机 C51

常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。

关键字: C51 单片机 误区 注意事项

简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。

关键字: C51 编程规范 文件配置
关闭
关闭