联系方式:单片机开发第九讲:C51的聚合类型1-2北京源智天下科技有限公司联系方式:课程安排•联合类型•枚举类型•类型声明•位域1-3北京源智天下科技有限公司联系方式:联合类型•联合类型也称为共用体,在不同时刻呈现不同的数据类型。•联合类型是将不同类型的变量组织成一个整体的数据类型。•这些不同类型的变量在单片机内存中占用同一段存储单元。•为了不互相影响,其在不同的时间保存不同的数据类型和不同长度的变量。1-4北京源智天下科技有限公司联系方式:联合的定义•联合类型也是用户自定义的数据类型,其定义的方式如下:union联合名{数据类型成员名;数据类型成员名;...};1-5北京源智天下科技有限公司联系方式:联合变量的声明•在定义了联合类型后,还需要使用该联合类型来声明联合变量。•联合变量的声明有3种方法:–先定义联合,再声明联合变量–定义联合时声明联合变量–直接声明联合变量1-6北京源智天下科技有限公司联系方式:先定义联合,再声明联合变量•这种方法的一般形式如下:–union联合名联合变量;•注意:如果联合变量中成员变量的大小不一致,则自动取其中最大的长度为整个联合变量的长度。unionchar_int{charch;inti;};unionchar_inta;1-7北京源智天下科技有限公司联系方式:定义联合时声明联合变量•C51中,允许在定义联合的同时声明联合变量。•这种声明方法的一般形式如下:union联合名{数据类型成员名;数据类型成员名;...}联合变量;1-8北京源智天下科技有限公司联系方式:直接声明联合变量•直接声明联合变量的方法示例如下:union{inta;charb;floatc;}Test;•注意:直接声明联合变量的方法不能再额外声明其他的联合变量。1-9北京源智天下科技有限公司联系方式:联合变量成员的引用•联合体变量成员的引用使用“.”来实现。•例如,对于前面定义的Test,其成员引用为:–Test.a–Test.b–Test.c•对联合体变量成员可以用于赋值和读取操作。•注意:不能同时引用三个成员,既在任意时刻,只能使用其中之一的成员。1-10北京源智天下科技有限公司联系方式:联合变量数组•联合变量数组就是数组中的每一个元素均为联合类型。•当使用联合变量数组时,其成员的引用同样采用“.”。01#includestdio.h//头文件02voidmain()//主函数03{04unionTIO//定义联合05{06inta;07charb;08floatc;09};10unionTIOun[3];//声明联合数组变量11un[0].a=10;//赋值12un[1].b=3.7;13un[2].c='A';14printf(un[0].a=%d\n,un[0].a);//输出成员变量15printf(un[1].b=%c\n,un[1].b);16printf(un[2].c=%f\n,un[2].c);17}1-11北京源智天下科技有限公司联系方式:联合变量指针•同结构变量类似,联合变量也可以定义为指针形式。•当联合变量定义为指针时,要用“-”符号来访问内部的成员:–联合名-成员名01#includestdio.h//头文件02voidmain()//主函数03{04inti=10;//定义并声明变量05floatf=3.7;06charc='A';07unionTIO//定义联合08{09inta;10charb;11floatc;12};13unionTIO*un;//定义联合指针14un=&i;//赋值15printf(un-a=%d\n,un-a);//输出16un=&c;17printf(un-b=%c\n,un-b);18un=&f;19printf(un-c=%f\n,un-c);20}1-12北京源智天下科技有限公司联系方式:联合和结构的嵌套•联合和结构可以灵活自由地嵌套使用。•联合内的成员可以是结构,示例如下:unionThreeInOne{inta;charb;floatc;struct{inta;charb;floatc;}st;}un;•结构体内的成员可以是联合,示例如下:structThreeInOne{inta;charb;floatc;union{inta;charb;floatc;}un;}st;1-13北京源智天下科技有限公司联系方式:结构和联合的区别•联合变量的成员占用同一个内存空间,而结构变量中的成员分别独占自己的内存空间,互相不干扰。•在任何同一时刻,结构的所有成员都存在,即结构变量的不同成员赋值是互不影响的。•而联合变量中只存放了一个被选中的成员。成员1成员2……成员n成员1/2/……/n结构体联合体1-14北京源智天下科技有限公司联系方式:枚举类型•现实生活中的某些事物的取值范围是有限的。•C51语言中提供了枚举类型来表示。•枚举类型主要用于将变量的取值限定在一个有限的范围内的场合。•枚举类型在定义中列举出所有可能的取值,被声明为该类型的变量取值不能超过定义的范围。•采用枚举类型不但可以简洁明了地表示其取值,而且节省存储空间。1-15北京源智天下科技有限公司联系方式:定义枚举类型•在C51语言中,定义枚举类型的一般形式如下:•注意:在枚举类型内部,每个枚举元素后的结束符是“,”,而不是“;”,并且最后一个元素后的结束符可以省略不写。enum枚举名{标识符[=整型常量],标识符[=整型常量],…};1-16北京源智天下科技有限公司联系方式:声明枚举变量•在定义了枚举类型后,还需要使用该枚举类型来声明枚举变量。•程序中通过枚举变量来使用。•枚举变量的声明有3种方法:–先定义枚举,再声明枚举变量–定义枚举时声明枚举变量–直接声明枚举变量1-17北京源智天下科技有限公司联系方式:先定义枚举,再声明枚举变量enumweekday//定义枚举类型{Monday,//枚举元素,0Tuesday,//枚举元素,1Wednesday,//枚举元素,2Thursday,//枚举元素,3Friday,//枚举元素,4Saturday,//枚举元素,5Sunday,//枚举元素,6};enumweekdaya,b,c;//声明枚举变量1-18北京源智天下科技有限公司联系方式:定义枚举类型{Monday,//枚举元素,0Tuesday,//枚举元素,1Wednesday,//枚举元素,2Thursday,//枚举元素,3Friday,//枚举元素,4Saturday,//枚举元素,5Sunday,//枚举元素,6}a,b,c;//声明枚举变量1-19北京源智天下科技有限公司联系方式:{Monday,//枚举元素,0Tuesday,//枚举元素,1Wednesday,//枚举元素,2Thursday,//枚举元素,3Friday,//枚举元素,4Saturday,//枚举元素,5Sunday,//枚举元素,6}a,b,c;//声明枚举变量1-20北京源智天下科技有限公司联系方式:枚举变量的赋值和引用•枚举类型以及枚举变量在程序中使用时,符合如下的规则:–枚举类型在定义时如果没有初始化,枚举元素本身由系统定义了一个表示序号的数值,一般从0开始顺序。–如果枚举中的某个元素被显式地赋值后,其后成员按依次加1的规则来确定其序号值。–只能把枚举元素赋予枚举变量。–以使用强制类型转换来将枚举元素的数值赋值给枚举变量。–枚举元素使用时不要加单、双引号。–枚举类型中的枚举值是常量,不是变量。–在枚举元素赋值时,可以为其赋负数。1-21北京源智天下科技有限公司联系方式:类型声明•类型声明就是为C51中的类型声明符来取一个新的名字。•C51语言中的各个类型声明符都是关键字。•类型声明是指由用户自己定义类型说明符,其一般形式如下:–typedef原类型名新类型名;1-22北京源智天下科技有限公司联系方式:类型声明•类型声明可以增加代码的可读性。•使用typedef可以使程序书写简单。•使用typedef重定义数组时,需要注意书写的格式,示例如下:–typedefcharNM[20];•使用typedef也可以重定义结构。•宏定义的功能与typedef的区别是:–宏定义是由预处理完成的,–而类型声明typedef则是在编译时完成的。在使用中,类型声明typedef更为灵活方便些。1-23北京源智天下科技有限公司联系方式:位域•位域是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。•每个域有一个域名,允许在程序中按域名进行操作。•这样就可以把几个不同的对象用一个字节的二进制位来表示。•采用位域可以节省存储空间,并简化程序处理。1-24北京源智天下科技有限公司联系方式:定义位域•位域也常称为位段,位域的定义采用struct关键字来实现,其一般形式如下:struct位域结构名{类型说明符位段名:位段长度;…};1-25北京源智天下科技有限公司联系方式:位结构•在定义位域的时候,需要注意如下几点:–位域定义时可以省略位段名。–一个位段必须存储在同一个字节中。–一个位段的长度不能超过8位二进制位。–如果一个字节所剩空间不足以存放另一个位段时,应从下一单元起存放该位段。1-26北京源智天下科技有限公司联系方式:声明位域变量•在定义了位域类型后,还需要使用该位域类型来声明位域变量。程序中通过位域变量来使用。•位域变量的声明可以采用如下三种方式:–先定义位域,再声明位域变量–定义位域时声明位域变量–直接声明位域变量1-27北京源智天下科技有限公司联系方式:先定义位域,再声明位域变量structbtest{inta:4;intb:1;intc:3;};btestdata;1-28北京源智天下科技有限公司联系方式:{inta:4;intb:1;intc:3;}data;1-29北京源智天下科技有限公司联系方式:{inta:4;intb:1;intc:3;}data;1-30北京源智天下科技有限公司联系方式:位域变量的引用•位域变量的位段名引用的一般形式如下:–位域变量名.位段名01#includestdio.h//头文件02voidmain()//主函数03{04structbtest//定义位域05{0