C51的特殊数据形式.ppt

上传人:za****8 文档编号:13189228 上传时间:2020-06-06 格式:PPT 页数:22 大小:257.46KB
返回 下载 相关 举报
C51的特殊数据形式.ppt_第1页
第1页 / 共22页
C51的特殊数据形式.ppt_第2页
第2页 / 共22页
C51的特殊数据形式.ppt_第3页
第3页 / 共22页
点击查看更多>>
资源描述
C51的特殊数据形式,3.3.4C51中的特殊数据类型,C51中有几种ANSIC所没有的特殊数据类型,这些数据类型是和存储区域和存储器类型的概念密切相关的。位变量可位寻址的对象特殊功能寄存器,位变量,位变量(BitTypes)是指用一个二进制位表示的变量。位数据类型可以用来说明变量,参数表,函数返回值等。位数据变量声明和基本的数据类型声明一样。所有的位变量都存储在内部数据区的位寻址段中。因为该段只有16个字节长,所以在一个作用域内最多只能声明128个位变量。注意:由于位变量只能存储在内部数据存储区的位变量区内,因此只能使用data和idata两种存储器类型修饰符,其它存储器类型是非法的。,例位变量的使用staticbitdone_flag=0;/*位变量*/bittestfunc(/*位函数返回类型*/bitflag1,/*位类型参数*/bitflag2)return(0);/*位类型返回值*/,位变量定义或声明时必须遵循以下规则:禁止中断的函数(#pragmadisable)和显式定义寄存器组(usingn)的函数不能返回位变量。函数在这种情况下返回位变量时,编译器将产生一个错误信息。不能将指针声明为指向一个位类型。bit*ptr;/*非法语句*/不能声明位类型的数组bitware5;/*非法语句*/,可位寻址的对象,可位寻址的对象(Bit-addressableObjects)是指可以同时用字节(字)寻址和位寻址方式进行访问的对象。只有当数据对象占据8051内部数据区的可位寻址区时,才是一个可位寻址对象。C51使用bdata存储器类型来声明可位寻址对象。例如:intbdataibase;/*可位寻址的整形变量*/charbdatabary4;/*可位寻址的字符形数组*/注意:声明为bdata存储器类型的变量必须为全局变量,不能是局部变量。由于bdata区为16个字节,因此可寻址对象所占存储空间不能大于16个字节。,上例中的ibase和bary是可位寻址对象。因此,这些变量的位可以单独的访问和更改。可使用sbit关键字声明位变量来访问用bdata声明变量的指定位。sbitmybit0=ibase0;/*/sbitmybit15=ibase15;/*/sbitary07=bary07;/*bit7ofbary0*/sbitary37=bary37;/*bit7ofbary3*/表达式中在符号后的表达式定义了位的位置。该表达式必须是一个常量。表达式的取值范围由变量声明中的基变量的数据类型来决定。对char和unsignedchar类型,范围为0-7;对int,unsignedint,short,unsignedshort,为0-15;对long和unsignedlong为0-31。,下面的例子,采用了位寻址,字节寻址,字寻址来改变可位寻址对象的值。ary37=1;/*setbit7inbary3*/bary3=a;/*Byteaddressing*/ibase=-1;/*Wordaddressing*/mybit15=0;/*/可位寻址对象不仅可以是基本变量类型,还可以是结构或联合这样的复杂数据类型。,例3.16以复杂数据类型为基变量的可位寻址对象unionlftfloatmf;longml;bdatastructbadcharm1;unionlftu;tcp;sbittcpf31=tcp.u.ml31;/*/sbittcpm10=tcp.m10;sbittcpm17=tcp.m17;,说明:位变量用基地址加位偏移来获取实际的物理地址。物理地址位地址0指向第一个字节的0位,8指向第2个字节的0位。8051中整型变量存储时是高字节在低地址(第1个字节),低字节在高地址(第2个字节)。即整型的0位在第2个字节的0位上,这个地址用sbit来标识时是位置8。,例3.17位变量与整型变量的对应关系,bdataintiData;/位寻址变量必须为全局变量sbitbTest1=iData8;sbitbTest2=iData0;main()iData=0;bTest1=1;/iData=1;iData=0;bTest2=1;/iData=256;,特殊功能寄存器,8051系列的微控制器提供了一个独立的内存区,用来存放特殊功能寄存器(specialfunctionregister,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位特殊功能寄存器。sfr占用一个字节内存单元,取值范围是0255。SFR的声明和C变量的声明格式是一样的,只不过使用的修饰符不是char或int而是sfr。例如:sfrP0=0 x80;/*Port-0,address80h*/sfrP1=0 x90;/*Port-1,address90h*/sfrP2=0 xA0;/*Port-2,address0A0h*/sfrP3=0 xB0;/*Port-3,address0B0h*/P0,P1,P2,P3是sfr声明的特殊功能寄存器的名称。特殊功能寄存器名称是一个合法的C标识符。等号后的地址必须是数值常量,不允许使用带运算符的表达式。,sfr16:定义16位特殊功能寄存器8051芯片可以将两个8位SFR作为一个16位寄存器来访问。条件是这两个SFR必须处在相邻地址上,并且是低字节在高字节地址的前面。C51提供了sfr16数据类型来进行16位特殊功能寄存器的声明,声明时低字节地址被用来作为sfr16的地址。例如:sfr16T2=0 xCC;/*Timer2:T2L0CCh,T2H0CDh*/sfr16RCAP2=0 xCA;/*RCAP2L0CAh,RCAP2H0CBh*/在这个例子中,T2和RCAP2被声明为16位的特殊功能寄存器。sfr16声明和sfr声明的规则相同。,sbit:定义特殊功能位sbit用来访问SFR中的可寻址位和其它可位寻址对象的可寻址位。在8051应用中,经常需要对SFR中的可寻址位(特殊功能位)进行独立访问。可以用sbit数据类型来将SFR中的可寻址位声明为特殊功能位。sbitEA=0 xAF;上例中将EA定义为地址0XAF,对8051而言这是中断使能寄存器(IE)的中断许可位。,有三种方法来声明位地址:方法一:sfr_nameint_constant,即SFR寄存器名整形常量。这种方法使用已经定义的sfr作为sbit的基地址。该SFR的地址必须能被8整除,符号后的表达式定义了可寻址位的位地址。位地址必须是0-7之间的数。sfrPSW=0 xD0;/声明寄存器名sfrIE=0 xA8;sbitOV=PSW2;/声明特殊功能位sbitCY=PSW7;sbitEA=IE7;,方法二:int_constantint_constant,即整形常量整形常量。这种方法使用整形常数作为基地址。该地址必须可以被8整除,符号后的表达式定义了可寻址位的位地址。位地址必须是0-7之间的数。sbitOV=0 xD02;sbitCY=0 xD07;sbitEA=0 xA87;方法三:int_constant用绝对位地址来声明sbit。sbitOV=0 xD2;sbitCY=0 xD7;sbitEA=0 xAF;,注意:sbit、bit和位域是三种不同的数据类型。使用sbit声明时,基对象必须可位寻址变量或者是可以位寻址的特殊功能寄存器。,绝对变量地址,开发者有时候希望把变量存储在指定的地址单元中。可用_at_关键词来将变量定位在一个绝对的内存地址单元。使用方法如下:数据类型存储器类型变量名_at_变量所在绝对地址;在_at_后面的绝对地址必须符合存储器类型的物理边界限制,即不超过存储区域的最大可寻址范围,该地址必须为常数。,绝对变量定位遵循以下约束:绝对变量不能初始化。类型为bit的函数和变量不能用绝对地址定位。绝对变量必须是全局变量,不能是局部变量。,例3.18structlinkstructlinkidata*next;charcode*test;structlinklistidata_at_0 x40;/*listatidata0 x40*/charxdatatext256_at_0 xE000;/*arrayatxdata0 xE000*/intxdatai1_at_0 x8000;/*i1atxdata0 x8000*/voidmain(void)list.next=(void*)0;i1=0 x1234;text0=a;,有时需要在不同的模块之间调用变量,可使用下列的语句来在另一个源文件中访问上例中用_at_修饰的变量。例3.19structlinkstructlinkidata*next;charcode*test;externstructlinkidatalist;/*listatidata0 x40*/externcharxdatatext256;/*arrayatxdata0 xE000*/externintxdatai1;/*intatxdata0 x8000*/,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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