《C51的数据结构.ppt》由会员分享,可在线阅读,更多相关《C51的数据结构.ppt(46页珍藏版)》请在优知文库上搜索。
1、C51的数据结构的数据结构 C51变量定义的四个要素存储种类存储种类 一、 自动变量(auto)在函数内部定义的变量,退出函数后,分配给该变量的存储单元即自行消失(局部变量)。 二、外部变量(extern)在函数外部定义的变量,可始终保持变量的数值(全局变量)。 【强调】一个外部变量只能被定义一次,在定义文件之外的地方使用时需用extern进行声明。 三、 静态变量(static)静态局部变量/静态全局变量 四、 寄存器变量(register)以寄存器为存储空间的变量 * 若省略存储种类选项,则变量默认为自动变量 基本数据类型基本数据类型 38 38 308 30810101010数据类型长度
2、值域字符型(char)unsigned char单字节0255signed char单字节-128+127整形(int)unsigned int双字节065535signed int双字节-32768+32767长整形(long)unsigned long4字节04294967295signed long4字节-2147483648+2147483647浮点型(float)float4字节double8字节指针型普通指针*1-3字节065535C51扩充数据类型扩充数据类型 C51扩充数据类型:bit、sfr或sfr16、sbit sfr或sfr16型 sfr定义特殊功能寄存器SFR的地址,语
3、法规则如下: sfr 或 sfr16 sfr_name = 字节地址常数; 例如,sfr P0 = 0 x80; /定义P0口地址80Hsfr PCON = 0 x87; /定义PCON地址87H sfr16 DPTR=0 x82; /定义DPTR的低端地址82H 有些新型的单片机,有些新增的寄存器在Keil C的包含文件夹“inc”里可能没有,这是就需要在程序的最前面用此方法定义。 如宏晶公司的单片机STC12C5A60S中为一个称作AUXR的寄存器,在内部RAM中的地址为0 x8E,可定义如下: sfr AUXR=0 x8E; 这种定义以后,在程序中就可对AUXR进行操作。sbit型 sb
4、t型是能够按位寻址的特殊功能寄存器中位变量。其定义的一般格式为: sbit位变量名 位地址表达式位地址表达式有三种形式 直接位地址;特殊功能寄存器名带位号;字节地址带位号。1、sbit bit_name = 位地址常数; 将位于SFR字节地址内的绝对位地址定义为位变量名。 例如,sbit CY = 0 xD7; 2、sbit bit_name = sfr_name 位位置; 将已有定义的SFR的07位定义为位变量名。 例如: sfr PSW = 0 xD0; sbit CY = PSW7; 3、sbit bit_name = sfr字节地址 位位置; 将SFR字节地址的相对位地址定义为位变量名
5、。 例如: sbit CY = 0 xD07; 以上三种定义对于CY来讲是一样的,即等效.举例:点亮一个发光二极管 图6.1 复位时的仿真情况解答 #include sbit D1=P10; main() D1=; while(1); 对位变量的定义也可以是: “sbit D=0 x900”,因为P1口的地址为0 x90. C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include 把这个头文件包含到C51程序中,无需重定义即可直接使用它们的名称。 reg51.h中的内容如下: #ifndef _REG51_H_ #define _R
6、EG51_H_ /* BYTE Register */ sfr P0 = 0 x80; sfr P1 = 0 x90; /* BIT Register */ /* PSW */ sbit CY = 0 xD7; sbit AC = 0 xD6; sbit RI = 0 x98; #endif4、几点说明 1)用sbit定义的位变量,必须能够按位操作,而不能够对无位操作功能的位定义位变量。 2)用sbit定义位变量,必须放在函数外面作为全局位变量,而不能在函数内部定义。 3)用sbit每次只能定义一个位变量。 4)对其它模块定义的位变量(bit型或 sbit型)的引用声明,都使用bit。 5)用
7、sbit定义的是一种绝对定位的位变量(因为名字是与确定位地址对应的),具有特定的意义,在应用时不能像bit型位变量那样随便使用。三、bit 型位变量的C51定义 除了通常的C数据类型外, C51编译器还支持“bit”数据类型, 称之为位变量,只有一位,其值只能是0或1, 这对于记录系统状态是十分有用的, 因为它往往需要使用某一位而不是整个数据字节。 例如:bit door = 0 ; /定义一个叫door的变量且初值为0 与标准C的变量定义及初始化用法是一致的。在C51中定义位变量的一般语法形式如下: 位类型标识符(bit) 位变量名; bit my_bit; /* 把my_bit 定义为位变
8、量 */ bit direction_bit; /* 把direction_bit定义为位变量*/函数参数列表中可以包含类型为“bit”的参数, 也可使用bit 类型的返回值。 例如: bit done_flag=0; /* 把done_flag定义为位变量 */ bit testfunc (bit flag1, bit flag2) /* flag1和flag2为bit 类型的参数 */ return (flag); /* flag是 bit 类型的返回值 */ 对位变量定义的限制 (1) 位变量不能定义成一个指针, 原因是不能通过指针访问“bit”类型的数据, 如定义“bit *ptr;
9、”是非法的。 (2) 不存在位数组, 如不能定义bit SHOW_BUF6。 (3) 值得注意的是, 使用中断禁止(#pragma disable)或包含明确的寄存器组切换(using n)的函数不能返回位值, 否则编译器会给出一个错误信息。 在位定义中, 允许定义存储类型, 位变量都被放入一个位段, 此位段总位于51单片机片内的RAM中, 因此存储器类型限制为data、bdata和idata。 如果把位变量的存储类型定义为其他存储类型, 将导致编译出错。数据的存储类型 51系列单片机有三个逻辑存储空间: 片内数据存储器(内部区),片外数据存储器(外部)和程序存储器(CODE区)。数据可任意存
10、储到其中某一存储器中。一、 code 区 用来存放可执行代码的存储区,用16 位寻址空间可达64K 代码段,是只读的。 比较大型的数据一般存放在此区域,如用单片机控制电子屏显示汉字时,汉字字库要占据很大的存储空间,这是就应把它存储在这一区域。 如存储“武汉”两个字的数组定义如下: unsigned char code tab32= 0 xFF,0 xFD,0 xFF,0 xF5,0 x03,0 xED,0 xFF,0 xFD,0 x00,0 x80,0 xFF,0 xFD,0 xDF,0 xFD,0 xDF,0 xFB,0 x1B,0 xFA,0 xDB,0 xFB,0 xDB,0 xFB,0
11、 xDB,0 xF7,0 x1B,0 xB7,0 xE3,0 xAF,0 xF8,0 x9F,0 xFF,0 xBF,/*武*/ 0 xFB,0 xFF,0 xF7,0 xFF,0 x17,0 xC0,0 xBF,0 xEF,0 xBE,0 xEF,0 x6D,0 xF7,0 x6D,0 xF7,0 x77,0 xF7,0 xF7,0 xFA,0 xFB,0 xFA,0 xF8,0 xFD,0 xFB,0 xFA,0 x7B,0 xE7,0 x9B,0 x8F,0 xEB,0 xDF,0 xFF,0 xFF,/*汉*/ 将表格,数组等定义成code型常数,在Keil C编译后,会大大减少程序占
12、用的存储空间,这一情况以后会碰到。二、data 区 是8051 内128 字节的内部RAM 或8052 的前128 字节内部RAM存储区。 这部分主要是作为数据段,称为data 区。 访问data 区比访问xdata 区要快。 通常我们把使用比较频繁的变量或局部变量存储在data 段中, 但是必须节省使用data 段,因为它的空间毕竟有限。 如例子中的变量“a”还可定为“unsigned char data a=0 xfe;” 其实,如果没有说明数据存储类型,默认数据存储在data区。三、bdata 位寻址段bdata, 包括16 个字节,共128 位,每一位都可单独寻址。 位寻址段的这16
13、个字节也可像数据段中其它字节一样进行字节寻址。 unsignedchar bdataoperate;对operate的低4位作位变量定义:sbit flag_key=operate0; /键盘标志位sbit flag_dis=operate1; /显示标志位sbit flag_mus=operate2; /音乐标志位sbit flag_run=operate3; /运行标志位 四、 idata 区 8051 系列的一些单片机,如8052 有附加的128 字节的内部RAM, 位于从80H 开始的地址空间中,被称为idata。 因为idata 区的地址和SFRs 的地址是重叠的,通过区分所访问的存
14、储区,来解决地址重叠问题,因为idata 区只能通过间接寻址来访问。五、 xdata 区 存储空间为64K ,和code 区一样采用16 位地址寻址称作外部数据区,简称xdata 区。 这个区通常包括一些RAM, 如SRAM 或一些需要通过总线接口的外围器件。 如果要将变量“a”置于这一区域,则表示是:“unsigned char xdata a=0 xfe;” 六、pdata区 这一区域只是对xdata区进行了要页处理,每一页称作一个pdata区.数据结构定义举例 unsigned char bdata status_byte; /定义status_byte为无符号字符型自动变量,该变量位于bdata区 unsigned int code unit_id2=0 x1234, 0 x89ab; /定义unit_id2为无符号整型自动量,该量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。 static char m, n; /定义m和n为2个位于data区中的有符号字符型静态变量。