1.数据类型
Keil C51的基本数据类型见表3-1。根据MCS-51系列单片机的硬件特点,C51在标准C语言的基础上,扩展了4种数据类型(见表中最后4行),这4种数据类型不能使用指针对它们进行存取。下面对扩展的4种数据类型进行说明。
表3-1 Keil C51支持的数据类型
(续)
(1)位变量bit
bit用于声明1位变量,这个变量的值被随机地保存在单片机RAM中。bit声明变量的值为逻辑“1”或“0”,对应单片机硬件系统处理中的高电平和低电平。
(2)特殊功能寄存器sfr
单片机特殊功能寄存器为片内RAM区的80H~FFH之间,“sfr”声明的寄存器数据类型占用一个内存单元,利用它可访问单片机内部的所有特殊功能寄存器。例如,sfr P1=0x90这一语句定义了片内的寄存器P1所占用RAM的存储单元地址为0x90。
(3)特殊功能寄存器sfr16
“sfr16”数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占2B的特殊功能寄存器。例如,sfr16 DPTR=0x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H,在后面的语句中可以对DPTR进行操作。
(4)特殊功能位sbit
sbit是指51单片机片内特殊功能寄存器的可寻址位。例如:
sfr PSW=0xd0;/*定义PSW寄存器地址为0xd0*/
sbit PSW^2=0xd2;/*定义OV位为PSW.2*/
符号“^”前面是特殊功能寄存器的名字,“^”后面的数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是0~7。还比如“sbit LED=P0^0;”,定义了LED状态与P0寄存器的P0.0位一致,或者说LED与P0.0接口连接。(www.xing528.com)
注意,不要把bit与sbit混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能寄存器的可寻址位,其值是可进行位寻址的特殊功能寄存器的位绝对地址,例如PSW寄存器OV位的绝对地址0xd2。
2.数据的存储类型
C51完全支持MCS-51系列单片机硬件资源。在单片机内部,程序存储器与数据存储器是完全分开的,且分为片内和片外两个独立的寻址空间。特殊功能寄存器与片内RAM统一编址,数据存储器与I/O接口统一编址。C51编译器将变量、常量通过定义成不同存储类型的方法将它们定义在不同的存储区中。C51存储类型与MCS-51系列单片机的实际存储空间的对应关系见表3-2。
片内RAM可分为3个区域,分别为有data、bdata、idata。data指片内直接寻址区,位于片内RAM的低128B;bdata为片内位寻址区,位于片内RAM位寻址区20H~2FH;idata为片内间接寻址区,片内RAM所有地址单元00H~FFH。变量声明时前面加上data、bdata、idata就能指明变量的存储位置。
pdata指向片外数据存储器页,一页为256B。xdata为片外数据存储器RAM的64KB空间;code指向外部程序存储器的64KB空间。
表3-2 C51存储类型
正确地定义数据类型以及存储类型,是所有设计者在编程前都需要首先考虑的问题。在资源有限的条件下,如何节省存储单元并保证运行效率,也是对设计者的一个考验,只有对C51中的各种数据类型以及存储类型非常熟练地掌握,才能运用自如。如在进行程序设计时,变量的大小和正负,决定了相应存储空间的大小。由于单片机的ROM有限,一般情况下,变量的声明尽量选择8位(即1B)的char型,最好是unsiged char。对于MCS-51系列单片机而言,浮点类型变量将明显增加运算时间和程序长度,如果允许,尽量使用灵活巧妙的算法来避免浮点变量的引入。
定义数据的存储类型通常遵循如下原则:只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata(即内部间接寻址)。对于那些经常使用的变量要使用内部寻址。在内部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。选择外部数据存储器可先选择pdata类型,最后选用xdata类型。
扩展片外存储器,原理上虽然简单,但在实际开发中,很多时候会带来不必要的麻烦,如可能降低系统稳定性、增加成本、增加开发和调试周期等,建议充分利用片内存储空间。另外,通常的单片机应用都是面对小型的控制,程序比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内FLASH ROM很富裕。因此如果实时性要求不高,可考虑使用宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,退出子函数后立即释放该内存空间。
3.数据指针
C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)两种数据类型。
(1)一般指针
一般指针的声明和使用均与标准C语言相同,不过同时还可以说明指针的存储类型,例如,“long*state;”为一个指向long型整数的指针,而state本身则以存储模式存放;“char*xdata ptr;”ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long、char等指针指向的数据可存放于任何存储器中。一般指针本身用3B存放,分别为存储器类型、高位偏移和低位偏移量。
(2)存储器指针
基于存储器的指针说明时即指定了存储类型,例如,“char data*str;”str指向data区中char型数据;“int xdata*pow;”pow指向外部RAM的int型整数。这种指针存放时,只需1B或2B就够了,因为只需存放偏移量。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。