单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.6 变量、存储类型与存储模式

全局变量定义在函数外面,生命期从所定义的地方开始,其后面的所有函数都可以读/写该全局变量,本书案例在使用定时器时,为得到更大的延时值,程序中定义了全局变量tCount,在定时器中断内对该变量累加,从而得到更大的延时间隔,如果程序中其他地方不需要使用tCount,该变量可以不必放在程序最前面,而是放在定时器中断函数的上一行。

局部变量定义在函数内部,对于循环及其他的临时计算,应尽可能使用局部变量,作为优化处理的一部分,编译程序会试图将局部变量维持在寄存器中,寄存器访问是最快的内存访问类型,特别是unsigned char和unsigned int类型的变量。

对于刚才讨论的tCount变量,在C语言程序设计时,还可以定义在中断函数内部实现计时累加,但要注意在定义前面加上static,因静态变量仅在函数首次调用时被初始化一次,此后不再被初始化。

8051系列单片机中,程序存储器与数据存储器严格分开,特殊功能寄存器与片内数据存储器统一编址,这与一般微型计算机的存储结构是不同的。

Keil C51编译器完全支持8051单片机硬件结构,可完全访问8051硬件系统的所有部分,编译器通过将变量、常量定义成不同的存储类型(data、bdata、idata、pdata、xdata、code),从而将它们定位在不同的存储区中。表1-4列出了Keil C51存储类型与8051存储空间的对应关系。

表1-4 Keil C51存储类型与8051存储空间的对应关系

读者在阅读表1-4时可参考图1-1所示的8051单片机存储器结构。

上述存储类型指示符data、bdata、idata将数据定位在内部数据存储器中,访问内部数据速度很快,它们只需要8位地址。

Keil C51编译器提供了两种外部存储类型:xdata和pdata,指定为xdata存储器类型的数据保存在最大空间为64KB的外部数据存储器空间中,通过P0与P2端口给出的16位地址可访问外部空间中的任意位置,但是,并非64KB地址空间总是用于存储器,单片机的外围设备也可以映射到存储器空间,在这种情况下,程序将会以与访问外部数据内存同样的方法编程控制外围设备,这种技术被称为内存映射的I/O技术,本书有关8255和部分液晶显示案例使用的就是这种技术。第二种存储类型pdata可访问外部数据内存一页中的256B,页地址则由P2提供。

本书有关案例在扩展外部存储器或外部设备时,程序中包含了绝对内存访问(Absolute Memory Access)头文件absacc.h,该文件中有宏定义:

        #define XBYTE ((unsigned char volatile xdata *) 0)

由其中的XBYTE定义可知,表达式XBYTE[16位字地址]可用来读/写外部RAM空间的字节数据,本书6264扩展内存案例就使用了XBYTE访问外部数据存储器,它相当于汇编语言中的MOVX @DPTR语句。

在8255接口扩展实验中,C语言程序内有:

        #define PA   XBYTE[0x0000]
        #define PB   XBYTE[0x0001]
        #define PC   XBYTE[0x0002]
        #define COM  XBYTE[0x0003]

这里PA、PB、PC、COM分别用于访问8255的4个不同端口。

上述定义还可以写成:

        #define PA   *(XBYTE + 0x0000)
        #define PB   *(XBYTE + 0x0001)
        #define PC   *(XBYTE + 0x0002)
        #define COM  *(XBYTE + 0x0003)

本书涉及数码管显示和图像与文字显示的案例中,由于数码管段码固定,待显示的图像或文字点阵数据也是固定的,将这些数据全部保存在RAM中会占用太多宝贵的空间,而且数据RAM空间本来就很有限,因此,在用C语言开发单片机程序时,可以将这些运行过程中不会发生变化的数据定义为code存储类型,将这些数据保存在程序内存而不是数据内存。

在定义变量时,如果省略存储类型,编译程序会自动选择默认存储类型,默认存储类型有小模式(Small)、紧缩模式(Compact)和巨模式(Large)限制,存储模式决定了变量的默认存储类型、参数传递区和未指明存储类型变量的存储类型。表1-5列出了这3种存储模式及相关说明。

表1-5 3种存储模式及相关说明

在固定的存储器地址上进行变量传递是Keil C51的特征之一,在Small模式下,参数传递在片内数据存储区完成,Compact和Large模式允许参数在外部存储区中传递。模式选择可在Keil C51项目选项窗口中的Target选项卡下完成,默认选择的是Small模式。