C51的特殊数据形式.ppt

上传人:wuy****n92 文档编号:80457572 上传时间:2023-03-23 格式:PPT 页数:22 大小:258.99KB
返回 下载 相关 举报
C51的特殊数据形式.ppt_第1页
第1页 / 共22页
C51的特殊数据形式.ppt_第2页
第2页 / 共22页
点击查看更多>>
资源描述

《C51的特殊数据形式.ppt》由会员分享,可在线阅读,更多相关《C51的特殊数据形式.ppt(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C51的特殊数据形式3.3.4 C51中的特殊数据类型C51中有几种ANSI C所没有的特殊数据类型,这些数据类型是和存储区域和存储器类型的概念密切相关的。位变量可位寻址的对象特殊功能寄存器位变量位变量(Bit Types)是指用一个二进制位表示的变量。位数据类型可以用来说明变量,参数表,函数返回值等。位数据变量声明和基本的数据类型声明一样。所有的位变量都存储在内部数据区的位寻址段中。因为该段只有16个字节长,所以在一个作用域内最多只能声明128个位变量。注意:由于位变量只能存储在内部数据存储区的位变量区内,因此只能使用data 和idata两种存储器类型修饰符,其它存储器类型是非法的。例位变

2、量的使用static bit done_flag=0;/*位变量*/bit testfunc(/*位函数返回类型*/bit flag1,/*位类型参数*/bit flag2 )return(0);/*位类型返回值*/位变量定义或声明时必须遵循以下规则:禁止中断的函数(#pragma disable)和显式定义寄存器组(using n)的函数不能返回位变量。函数在这种情况下返回位变量时,编译器将产生一个错误信息。不能将指针声明为指向一个位类型。bit*ptr;/*非法语句*/不能声明位类型的数组bit ware 5;/*非法语句*/可位寻址的对象可位寻址的对象(Bit-addressable O

3、bjects)是指可以同时用字节(字)寻址和位寻址方式进行访问的对象。只有当数据对象占据8051内部数据区的可位寻址区时,才是一个可位寻址对象。C51使用bdata存储器类型来声明可位寻址对象。例如:int bdata ibase;/*可位寻址的整形变量*/char bdata bary 4;/*可位寻址的字符形数组*/注意:声明为bdata存储器类型的变量必须为全局变量,不能是局部变量。由于bdata区为16个字节,因此可寻址对象所占存储空间不能大于16个字节。上例中的ibase和bary 是可位寻址对象。因此,这些变量的位可以单独的访问和更改。可使用sbit关键字声明位变量来访问用bdat

4、a声明变量的指定位。sbit mybit0=ibase 0;/*/sbit mybit15=ibase 15;/*/sbit ary07=bary0 7;/*bit 7 of bary0*/sbit ary37=bary3 7;/*bit 7 of bary3*/表达式中在符号后的表达式定义了位的位置。该表达式必须是一个常量。表达式的取值范围由变量声明中的基变量的数据类型来决定。对char 和unsigned char 类型,范围为0-7;对int,unsigned int,short,unsigned short,为0-15;对long 和unsigned long 为0-31。下面的例子,

5、采用了位寻址,字节寻址,字寻址来改变可位寻址对象的值。ary37=1;/*set bit 7 in bary3*/bary3=a;/*Byte addressing*/ibase=-1;/*Word addressing*/mybit15=0;/*/可位寻址对象不仅可以是基本变量类型,还可以是结构或联合这样的复杂数据类型。例3.16以复杂数据类型为基变量的可位寻址对象union lftfloat mf;long ml;bdata struct badchar m1;union lft u;tcp;sbit tcpf31=31;/*/sbit tcpm10=tcp.m1 0;sbit tcpm1

6、7=tcp.m1 7;说明:位变量用基地址加位偏移来获取实际的物理地址。物理地址位地址0指向第一个字节的0位,8指向第2个字节的0位。8051中整型变量存储时是高字节在低地址(第1个字节),低字节在高地址(第2个字节)。即整型的0位在第2个字节的0位上,这个地址用sbit 来标识时是位置8。例3.17 位变量与整型变量的对应关系bdata int iData;/位寻址变量必须为全局变量sbit bTest1=iData8;sbit bTest2=iData0;main()iData=0;bTest1=1;/iData=1;iData=0;bTest2=1;/iData=256;特殊功能寄存器8

7、051系列的微控制器提供了一个独立的内存区,用来存放特殊功能寄存器(special function register,SFR)。SFR用来在程序中控制定时器,计数器,串行I/O,端口I/O操作,以及外设的操作。SFR驻留在地址0X80到0XFF空间,可按字节寻址或按字寻址,某些寄存器还可以按位寻址。8051系列微控制器中SFR的个数和类型是变化的。C51没有预先定义SFR的名字,而是提供了许多8051兼容芯片的包含文件,这些文件对芯片的SFR进行了定义。CX51编译器用sfr,sfr16,sbit来进行SFR定义。sfr:定义8位特殊功能寄存器sfr可以用来定义8051单片机的8位特殊功能寄

8、存器。sfr占用一个字节内存单元,取值范围是0 255。SFR的声明和C变量的声明格式是一样的,只不过使用的修饰符不是char 或int 而是sfr。例如:sfr P0=0 x80;/*Port-0,address 80h*/sfr P1=0 x90;/*Port-1,address 90h*/sfr P2=0 xA0;/*Port-2,address 0A0h*/sfr P3=0 xB0;/*Port-3,address 0B0h*/P0,P1,P2,P3是sfr声明的特殊功能寄存器的名称。特殊功能寄存器名称是一个合法的C标识符。等号后的地址必须是数值常量,不允许使用带运算符的表达式。sfr

9、16:定义16位特殊功能寄存器8051芯片可以将两个8位SFR作为一个16位寄存器来访问。条件是这两个SFR必须处在相邻地址上,并且是低字节在高字节地址的前面。C51提供了sfr16数据类型来进行16位特殊功能寄存器的声明,声明时低字节地址被用来作为sfr16的地址。例如:sfr16 T2=0 xCC;/*Timer 2:T2L 0CCh,T2H 0CDh*/sfr16 RCAP2=0 xCA;/*RCAP2L 0CAh,RCAP2H 0CBh*/在这个例子中,T2和RCAP2被声明为16位的特殊功能寄存器。sfr16声明和sfr声明的规则相同。sbit:定义特殊功能位sbit用来访问SFR中

10、的可寻址位和其它可位寻址对象的可寻址位。在8051应用中,经常需要对SFR中的可寻址位(特殊功能位)进行独立访问。可以用sbit数据类型来将SFR中的可寻址位声明为特殊功能位。sbit EA=0 xAF;上例中将EA定义为地址0XAF,对8051而言这是中断使能寄存器(IE)的中断许可位。有三种方法来声明位地址:方法一:sfr_name int_constant,即SFR寄存器名整形常量。这种方法使用已经定义的sfr作为sbit的基地址。该SFR的地址必须能被8整除,符号后的表达式定义了可寻址位的位地址。位地址必须是0-7之间的数。sfr PSW=0 xD0;/声明寄存器名sfr IE=0 x

11、A8;sbit OV=PSW 2;/声明特殊功能位sbit CY=PSW 7;sbit EA=IE 7;方法二:int_constant int_constant,即整形常量整形常量。这种方法使用整形常数作为基地址。该地址必须可以被8整除,符号后的表达式定义了可寻址位的位地址。位地址必须是0-7之间的数。sbit OV=0 xD0 2;sbit CY=0 xD0 7;sbit EA=0 xA8 7;方法三:int_constant用绝对位地址来声明sbit。sbit OV=0 xD2;sbit CY=0 xD7;sbit EA=0 xAF;注意:sbit、bit和位域是三种不同的数据类型。使用

12、sbit声明时,基对象必须可位寻址变量或者是可以位寻址的特殊功能寄存器。类型访问对象sbit可位寻址变量或可位寻址的特殊功能寄存器bit可位寻址区中的位,共128位位域将字节,整型,长整型的某几个位作为一个数据存储单元,进行独立访问。绝对变量地址开发者有时候希望把变量存储在指定的地址单元中。可用 _at_ 关键词来将变量定位在一个绝对的内存地址单元。使用方法如下:数据类型 存储器类型 变量名 _at_ 变量所在绝对地址;在 _at_ 后面的绝对地址必须符合存储器类型的物理边界限制,即不超过存储区域的最大可寻址范围,该地址必须为常数。绝对变量定位遵循以下约束:绝对变量不能初始化。类型为bit的函

13、数和变量不能用绝对地址定位。绝对变量必须是全局变量,不能是局部变量。例3.18struct linkstruct link idata *next;char code *test;struct link list idata _at_ 0 x40;/*list at idata 0 x40*/char xdata text256 _at_ 0 xE000;/*array at xdata 0 xE000*/int xdata i1 _at_ 0 x8000;/*i1 at xdata 0 x8000*/void main(void)list.next=(void*)0;i1=0 x1234;text 0=a;有时需要在不同的模块之间调用变量,可使用下列的语句来在另一个源文件中访问上例中用 _at_修饰的变量。例3.19struct linkstruct link idata *next;char code *test;extern struct link idata list;/*list at idata 0 x40*/extern char xdata text256;/*array at xdata 0 xE000*/extern int xdata i1;/*int at xdata 0 x8000*/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁