打印
[复制链接]
1040|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eefas|  楼主 | 2024-8-12 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
变量是在程序运行过程中其值可以改变的量。一个变量由两部分组成:变量名和变量值。
在 C51 中,变量在使用前必须对变量进行定义,指出变量的数据类型和存储模式。以便编译系统为它分配相应的存储单元。定义的格式如下:
[存储种类] 数据类型说明符 [存储器类型] 变量名 1[=初值],变量名 2[初值]…;

1. 数据类型说明符
在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。可以是基本数据类型说明符,也可以是组合数据类型说明符,还可以是用 typedef 定义的类型别名。
在 C51 中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符用 typedef 起别名,格式如下:
typedef c51 固有的数据类型说明符 别名;
定义别名后,就可以用别名代替数据类型说明符对变量进行定义。别名可以用大写,也可以用小写,为了区别一般用大写字母表示。
【例】 typedef 的使用。

typedef        unsigned        int            u8;
typedef        unsigned        char        u16;
u8 a1=0x12;
u16 a2=0x1234;
1
2
3
4
2. 变量名
变量名是 C51 区分不同变量,为不同变量取的名称。在 C51 中规定变量名可以由字母、数字和下划线三种字符组成,且第一个字母必须为字母或下划线。变量名有两种:普通变量名和指针变量名。它们的区别是指针变量名前面要带“*”号。

3. 存储种类
存储种类是指变量在程序执行过程中的作用范围。C51 变量的存储种类有四种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。

auto:
使用 auto 定义的变量称为自动变量,其作用范围在定义它的函数体或复合语句内部,当定义它的函数体或复合语句执行时,C51 才为该变量分配内存空间,结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量时,如果省略存储种类,则该变量默认为自动(auto)变量。
extern:
使用 extern 定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序中定义过的外部变量时, 该变量在该函数体内要用extern 说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内都有效,直到程序结束才释放。
static:
使用 static 定义的变量称为静态变量。它又分为内部静态变量和外部静态变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效,一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护,还可以实现当离开函数时值不被改变。外部静态变量上在函数外部定义的静态变量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模块处理中,外部静态变量只在文件内部或模块内部有效。
register:
使用 register 定义的变量称为寄存器变量。它定义的变量存放在 CPU 内部的寄存器中,处理速度快,但数目少。C51 编译器编译时能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。
4. 存储器类型
存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储种类完全不同。C51 编译器能识别的存储器类型有以下几种,见表所示。
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](&pos_id=img-5n4Yy3Tt-1713677093829

定义变量时也可以省“存储器类型”,省时 C51 编译器将按编译模式默认存储器类型。

5. 特殊功能寄存器变量
51 系列单片机片内有许多特殊功能寄存器,通过这些特殊功能寄存器可以控制 51 系列单片机的定时器、计数器、串口、I/O 及其它功能部件,每一个特殊功能寄存器在片内 RAM 中都对应于一个字节单元或两个字节单元。
在 C51 中,允许用户对这些特殊功能寄存器进行访问,访问时须通过 sfr 或 sfr16 类型说明符进行定义,定义时须指明它们所对应的片内 RAM 单元的地址。格式如下:
sfr 或 sfr16 特殊功能寄存器名=地址;
sfr 用于对 51 单片机中单字节的特殊功能寄存器进行定义,sfr16 用于对双字节特殊功能寄存器进行定义。特殊功能寄存器名一般用大写字母表示。地址一般用直接地址形式。
【例】特殊功能寄存器的定义。

sfr PSW=0xd0;
sfr        SCON=0x98;
sfr        TMOD=0x89;
sfr        P1=0x90;
sfr16                DPTR=0x82;
sfr16                T1=0X8A;
1
2
3
4
5
6
6. 位变量
在C51 中,允许用户通过位类型符定义位变量。位类型符有两个:bit 和sbit。可以定义两种位变量。

bit 位类型符用于定义一般的可位处理位变量。它的格式如下: bit 位变量名;
在格式中可以加上各种修饰,但注意存储器类型只能是 bdata、data、idata。只能是片内 RAM 的可位寻址区,严格来说只能是 bdata。
sbit 位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。格式如下:
sbit 位变量名=位地址;
如位地址为位直接地址,其取值范围为 0x00~0xff;如位地址是可位寻址变量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义。字节地址与位号之间、特殊功能寄存器与位号之间一般用“^”作间隔。如定义 51 单片机管脚:
sbit LED=P1^0;
在 C51 中,为了用户处理方便,C51 编译器把 51 单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“reg51.h”或“reg52.h”的头文件中,当用户要使用时,只须要在使用之前用一条预处理命令#include <reg52.h>把这个头文件包含到程序中,然后就可使用殊功能寄存器名和特殊位名称。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

2822

帖子

2

粉丝