程序执行过程中其值可以改变的量称为变量。在C51程序中使用变量之前必须先进行定义,指出变量的数据类型和存储器类型,以便编译系统为它分配相应的存储单元。变量定义的格式如下:
[存储种类] 数据类型 [存储类型] 变量名表;
从C51变量定义的格式可以看出变量具有4大要素,定义格式中除了数据类型和变量名表是必要的,其它都是可选项。以下按照4大要素的顺序进行介绍。
1.存储种类
存储种类是指变量在程序执行过程中的作用范围。C51变量的存储种类有4种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。
(1)auto 使用auto定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,当定义它的函数体或复合语句执行时,C51才为该变量分配内存空间,当函数调用结束返回或复合语句执行结束时,自动变量所占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时若省略存储种类,该变量则默认为自动(auto)变量。
(2)extern 使用extern定义的变量称为外部变量。在一个函数体内要使用一个已在该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用extern说明。外部变量被定义后分配固定的内存空间,在整个程序执行时间内都有效,直到程序结束才释放。
(3)static 使用static定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量是在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。
(4)register 使用register定义的变量称为寄存器变量。它定义的变量存放在CPU内部的寄存器中,处理速度快,但数量少。C51编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可不必专门声明。
2.数据类型
(1)C51支持的基本数据类型。
数据是单片机操作的对象,是具有一定格式的数字或数值。数据的格式称为数据类型。标准C语言中基本数据类型为int、long、float、double和char。针对51单片机的硬件特点,在标准C语言的基础上扩展了4种数据类型。C51支持的基本数据类型如表4.1所示。C51与标准C语言相同的数据类型这里不再详细介绍,下面只重点介绍C51扩展的特殊数据类型。
表4.1 C51支持的基本数据类型
为了更有效地利用51单片机的多种内部寄存器,C51在标准C的基础上扩展了4种数据类型bit、sbit、sfr和sfr16,通过这4种数据类型就可实现对51单片机的特殊功能寄存器以及位变量进行定义和访问。
①bit位型。
bit位型是C51扩充的一种数据类型,bit位类型符用于定义一般的位变量,语法格式为:
bit 位变量名[=0或1];
上述格式中bit是关键字,位变量名应遵守变量名的命名规则,其用法类似于C语言语句int x中的关键字int和变量名x。例如:
bit a=0; //定义一个名为a的位变量且赋初值为0
②sbit位寻址型
sbit位寻址型用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址,可以是直接位地址,也可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。定义方法如下:
a)sbit位变量名=位地址;
将位的绝对地址赋给位变量名,位地址必须位于0x80~0xFF之间。例如:
sbit CY=0xD7; //将位的绝对地址赋给变量
b)sbit位变量名=SFR名称^位号;
当可寻址位位于特殊功能寄存器中时可采用这种方法。其中SFR名称必须是已定义的SFR的名称,位号是介于0~7之间的常数。例如:
sfr PSW=0xD0;
sbit CY=PSW^7; //定义CY位为psw.7,位地址为0xD7
c)sbit位变量名=字节地址^位位置;
这种方法中字节地址必须在0x80~0xFF之间。位号是介于0~7之间的常数。例如:(www.xing528.com)
sbit CY=0xD0^7;//将位的相对地址赋给变量
sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则用来定义一般的位变量。
③sfr特殊功能寄存器型。
51系列单片机片内RAM区的高128字节内离散的分布了21个特殊功能寄存器(SFR),字节地址为80H~FFH,C51中允许用户对这些特殊功能寄存器进行访问,访问时需通过sfr或sfr16类说明符进行定义,定义时需指明它们所对应的片内RAM单元的地址,定义格式如下:
sfr或sfr16 特殊功能寄存器名=地址常数;
“=”后面必须是常数,且数值范围必须在特殊功能寄存器地址范围内,即位于0x80~0xFF之间。例如:
sfr P0=0x80; //定义P0口地址80H
注:sfr用于对MCS-51单片机中单字节的特殊功能寄存器进行定义,sfr16用于对双字节特殊功能寄存器进行定义(定义的地址必须是16位SFR的低端地址),特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式。
例如:
sfr16 DPTR=0x82; //定义DPTR,其中DPL=82H,DPH=83H
为了用户处理方便,C51编译器把MCS-51单片机常用的特殊功能寄存器和特殊位进行了定义,放在“reg51.h”或“reg52.h”的头文件中。当用户要使用时,只需要用一条预处理命令#include<reg51.h>把这个文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名称了。
(2)自定义简化形式的数据类型。
与标准C语言不同,C51在定义变量unsigned×××时不能省略unsigned。所以在编程时,为了输入方便,我们可以自定义简化形式的数据类型。其方法是在源程序开头使用#define语句自定义简化的数据类型标识符。例如:
#define uchar unsigned char;
#define uint unsigned int;
这样,在编程中就可以用uchar代替unsigned char,用uint代替unsigned int来定义变量了。
3.存储器类型
通过前面的学习我们知道51系列单片机具有3个逻辑存储空间,分别为片内低128B RAM、片外64KB RAM和片内外统一编址的64KB ROM,对于8052型单片机还有片内高128B RAM空间。存储器类型用于指明变量所处的单片机的存储器区域情况。这些存储空间与存储器类型的对应关系及C51编译器能识别的存储器类型如表4.2所示。
表4.2 C51的存储类型与存储空间对应关系
定义变量时也可以省略“存储器类型”,省略时C51编译器将根据存储模式默认存储器类型。C51编译器支持的存储模式有SMALL模式、COMPACT模式LARGE模式,3种编译模式及默认存储类型见表4.3所示。
表4.3 3种编译模式的特点
4.变量名
变量名是C51为区分不同变量而取的名称。C51规定变量名由字母、数字和下划线三种字符组成,且第一个字母必须为字母或下划线,普通变量名和指针变量名的区别是指针变量名前面要带“*”号。
注意:
①大写的变量和小写的变量是不同的变量,如SUM和sum。习惯上变量用小写表示。
②变量名除了要避免使用标准C语言的32个关键字外,还应避免使用C51扩展的新关键字。C51扩展的新关键字共21个,见表4.4所示。
表4.4 C51扩展的21个关键字
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。