C51的数据结构.ppt

上传人:王** 文档编号:158883 上传时间:2023-02-27 格式:PPT 页数:46 大小:643.50KB
下载 相关 举报
C51的数据结构.ppt_第1页
第1页 / 共46页
C51的数据结构.ppt_第2页
第2页 / 共46页
C51的数据结构.ppt_第3页
第3页 / 共46页
C51的数据结构.ppt_第4页
第4页 / 共46页
C51的数据结构.ppt_第5页
第5页 / 共46页
C51的数据结构.ppt_第6页
第6页 / 共46页
C51的数据结构.ppt_第7页
第7页 / 共46页
C51的数据结构.ppt_第8页
第8页 / 共46页
C51的数据结构.ppt_第9页
第9页 / 共46页
C51的数据结构.ppt_第10页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《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区中的有符号字符型静态变量。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 嵌入式开发

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!