C51结构、联合和枚举的使用

发布者:CMOS最新更新时间:2016-11-24 来源: eefocus关键字:C51  结构  联合  枚举 手机看文章 扫描二维码
随时随地手机看文章

前面的文章中介绍了 C  语言的基本数据类型,为了更有效的处理更复杂的数据,C  语 言引入了构造类型的数据类型。构造类型就是将一批各种类型的数据放在一起形成一种特殊 类型的数据。之前讨论过的数组也算是一种构造类型的数据,单片机c语言 中的构造类型还有结构、 枚举和联合。


结构
结构是一种数据的集合体,它能按需要将不一样类型的变量组合在一起,整个集合体用 一个结构变量名表示,组成这个集合体的各个变量称为结构成员。理解结构的概念,能用 班级和学生的关系去理解。班级名称就相当于结构变量名,它代表所有同学的集合,而每个 同学就是这个结构中的成员。使用结构变量时,要先定义结构类型。一般定义格式如下:


struct  结构名  {结构元素表};
例子:struct    FileInfo
{
unsigned char FileName[4]; unsigned long Date; unsigned int Size;
}


上面的例子中定义了一个简单的文件信息结构类型,它可用于定义用于简单的单片机文 件信息,结构中有三个元素,分别用于操作文件名、日期、大小。因为结构中的每个数据成 员能使用不一样的数据类型,所以要对每个数据成员进行数据类型定义。定义好一个结构类 型后,能按下面的格式进行定义结构变量,要注意的是只有结构变量才能参与程序的执 行,结构类型只是用于说明结构变量是属于那一种结构。


struct  结构名  结构变量名 1,结构变量名 2……结构变量 N; 例子:struct FileInfo NewFileInfo, OleFileInfo;


通过上面的定义 NewFileInfo 和 OleFileInfo 都是 FileInfo 结构,都具有一个字符型数组 一个长整型和一个整形数据。定义结构类型只是给出了这个结构的组织形式,它不会占用存 储空间,也就说结构名是不能进行赋值和运算等操作的。结构变量则是结构中的具体成员, 会占用空间,能对每个成员进行操作。


结构是允许嵌套的,也就是说在定义结构类型时,结构的元素能由另一个结构构成。 如:


struct clock
{
unsigned char sec, min, hour;
}
struct date
{
unsigned int year;
unsigned char month, day;
struct clock Time; //这是结构嵌套
}
struct date NowDate; //定义 data 结构变量名为 NowDate


开始学习的朋友看到这可能会发问:“各个数据元素要如何引用、赋值呢?”使用结构变量 时是通过对它的结构元素的引用来实现的。引用的方法是使用存取结构元素成员运算符“.” 来连接结构名和元素名,格式如下:


结构变量名.结构元素


要存取上例结构变量中的月份时,就要写成  NowDate..year。而嵌套的结构,在引用元 素时就要使用多个成员运算符,一级一级连接到最低级的结构元素。要注意的是在  单片机c语言  中 只能对最低级的结构元素进行访问,而不可能对整个结构进行操作。操作例子:


NowDate.year = 2005;
NowDate.month = OleMonth+ 2; //月份数据在旧的基础上加 2
NowDate.Time.min++; //分针加 1,嵌套时只能引用最低一级元素 一个结构变量中元素的名字能和程序中其他地方使用的变量同名,因为元素是属于它所在 的结构中,使用时要用成员运算符指定。
结构类型的定义还能有如下的两种格式。
struct
{
结构元素表
}  结构变量名 1,结构变量名 2……结构变量名 N;
例:struct
{
unsigned char FileName[4]; unsigned long Date; unsigned int Size;
} NewFileInfo, OleFileInfo;
这一种定义方式定义没有使用结构名,称为无名结构。通常会用于程序中只有几个确定 的结构变量的场合,不能在其它结构中嵌套。


另一种定义方式如下:


struct  结构名
{
结构元素表
}  结构变量名 1,结构变量名 2……结构变量名 N;
例:struct FileInfo
{
unsigned char FileName[4]; unsigned long Date; unsigned int Size;
} NewFileInfo, OleFileInfo;


使用结构名能便于阅读程序和便于以后要在定义其它结构中使用。 枚举在程序中经常要用到一些变量去做程序中的判断标志。如经常要用一个字符或整型变量去储存 1 和 0 做判断条件真假的标志,但我们也许会疏忽这个变量只有当等于 0 或 1 才是有效的,而将它赋上别的值,而使程序出错或变的混乱。这个时候能使用枚举数据类型去定义变 量,限制错误赋值。枚举数据类型就是把某些整型常量的集合用一个名字表示,其中的整型 常量就是这种枚举类型变量的可取的合法值。枚举类型的二种定义格式如下:


enum  枚举名  {枚举值列表}  变量列表;
例  enum TFFlag {False, True} TFF;
enum  枚举名  {枚举值列表};
emum  枚举名  变量列表;
例    enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
enum Week OldWeek, NewWeek;


看了上面的例子,你也许有一个地方想不通,那就是为什么枚举值不用贬值就能使 用?那是因为在枚举列表中,每一项名称代表一个整数值,在默认的情况下,编译器会自动 为每一项赋值,第一项赋值为 0,第二项为 1…...如 Week 中的 Sun 为 0,Fri 为 5。C 语言也 允许对各项值做初始化赋值,要注意的是在对某项值初始化后,它的后续的各项值也随之递 增。如:


enum Week {Mon=1, Tue, Wed, Thu, Fri, Sat, Sun};


上例的枚举就使 Week 值从 1 到 7,这样会更符合我们的习惯。使用枚举就如变量一样, 但在程序中不能为其赋值。


联合


联合同样是  C  语言中的构造类型的数据结构。它和结构类型一样能包含不一样类型的 数据元素,所不一样的是联合的数据元素都是从同一个数据地址开始存放。结构变量占用的内 存大小是该结构中数据元素所占内存数的总和,而联合变量所占用内存大小只是该联合中最 长的元素所占用的内存大小。如在结构中定义了一个 int 和一个 char,那么结构变量就会占用 3 个字节的内存,而在联合中同样定义一个 int 和一个 char,联合变量只会占用 2 个字节。 这种能充分利用内存空间的技术叫"内存覆盖技术",它能使不一样的变量分时的使用同一 个内存空间。使用联合变量时要注意它的数据元素只能是分时使用,而不能同时使用。举个 简单的例子,程序先为联合中的 int 赋值 1000,后来又为 char 赋值 10,那么这个时候就不能引用int 了,不然程序会出错,起作用的是最后一次赋值的元素,而上一次赋值的元素就失效了。 使用中还要注意定义联合变量时不能对它的值初始化、能使用指向联合变量的指针对其操 作、联合变量不能作为函数的参数进行传递,数组和结构能出现在联合中。


联合类型变量的定义方法和结构的定义方法差不多,只要把关键字 struct 换用 union 就 能了。联合变量的引用方法除也是使用"."成员运算符。


下面就用一个综合的例子说明三种类型的简单使用。


#include 
#include 
void main(void)
{
enum TF {
False, True} State; //定义一个枚举,使程序更易读
union File { //联合中包含一数组和结构,
unsigned char Str[11]; //整个联合共用 11 个字节内存
struct FN {
unsigned char Name[6],EName[5];} FileName;
} MyFile;
unsigned char Temp;
SCON = 0x50; //串行口方式 1,允许接收
TMOD = 0x20; //定时器 1 定时方式 2
TCON = 0x40; //设定时器 1 开始计数
TH1 = 0xE8;   //11.0592MHz 1200 波特率
TL1 = 0xE8; TI = 1;
TR1 = 1; //启动定时器
State = True; //这里演示 State 只能赋为 False,True 两个值,其它无效
//State = 3;这样是错误的
printf ("Input File Name 5Byte: \n");
scanf("%s", MyFile.FileName.Name); //保存 5 字节字符串要 6 个字节
printf ("Input File ExtendName 4Byte: \n");
scanf("%s", MyFile.FileName.EName);
if (State == True)
{
printf ("File Name : ");
for (Temp=0; Temp<12; Temp++)
printf ("%c", MyFile.Str[Temp]); //这里列出所有的字节
printf ("\n    Name :");
printf ("%s", MyFile.FileName.Name);
printf ("\n    ExtendName :");
printf ("%s", MyFile.FileName.EName);
}
while(1);
}


关键字:C51  结构  联合  枚举 引用地址:C51结构、联合和枚举的使用

上一篇:89C51单片机的P0~P3端口进行输入时为什么要设置为1?
下一篇:C51的串口中断处理子程序

推荐阅读最新更新时间:2024-03-16 15:22

Mentor Graphics与宁波诺丁汉大学(UNNC)建立集成电路联合实验室
2013年4月15日,中国,宁波 —Mentor Graphics Corp. 今天宣布启动与宁波诺丁汉大学的联合实验室。按照双方的协议,Mentor Graphics捐赠了超过1千万美元的EDA软件和技术支持,让UNNC的学生能够对最先进的设计方法有深入的了解。 宁波诺丁汉大学是中国的第一所中外合作大学。在2004年成立之时只有250多人,现在已经有来自全球50多个国家和地区的5000多名学生。宁波诺丁汉把国际化作为核心发展战略,将英国诺丁汉大学的优势学科与中国社会经济发展实际需求相结合,引进一系列具有国际一流水准的学位课程,使中国学生能以较低的成本获得世界优质高等教育,为地方发展提供科技和人才支持。 “诺丁汉大学很高兴能够
[电源管理]
OTN和PTN联合组网模式技术分析及注意事项
伴随All IP进程化的不断加快,以 OTN 、 PTN 为代表的新一代光传输技术正在取代DWDM、MSTP的地位,逐渐成为光传送的主流产品。OTN、PTN作为新技术、新的产品形态,如何在城域、本地网中合理、有效地选用和规划网络,如何有效地进行联合组网,无疑成为当前业界关注的焦点。    1 OTN和PTN技术简析   1.1 OTN技术   OTN是由DWDM技术演进而来,并在其基础之上,遵循G.709协议制定的标准,重新对OTU的线路侧接口进行封装,而且可以按需灵活地引入电交叉和光交叉。这一改变使其在OAM、业务调度能力等方面大幅领先DWDM,因此OTN技术被看作是最有竞争力的下一代骨干网传送技术。   1.2 P
[模拟电子]
OTN和PTN<font color='red'>联合</font>组网模式技术分析及注意事项
风河联合5家公司合作推出Fusion互联车辆数据管理平台
Airbiquity、Cloudera、NXP、Teraki和风河等5家公司近日发布了汽车产业协同计划The Fusion Project,旨在定义一整套高效数据生命周期平台,推进集成化互联车辆发展。这套预集成的硬件和软件解决方案整合了领先企业的创新技术,支持汽车制造商高效地收集、分析和管理互联车辆数据,从而确保功能开发、部署和升级的持续进行。 随着互联车辆技术的不断进步,围绕汽车产生的数据量呈指数级增长。汽车制造商由此能够以数据为中心为消费者提供新功能,同时为自己创造新的营收机会。然而,他们也面临着前所未有的挑战,这就是如何有效地收集、分析和管理车辆数据,因为相关的解决方案目前还支离破碎,机器学习模型偏于僵化,智能边缘计算能
[嵌入式]
风河<font color='red'>联合</font>5家公司合作推出Fusion互联车辆数据管理平台
工程师分享:LED球泡灯电源设计经验与光学结构技术探讨
  进入2011年以后,LED逐渐向室内照明进军,这也意味着开始向民用家庭进军。一方面这是一个大喜事,因为民用的市场是非常之大;另一方面也是一个极为严重的挑战,因为民用市场要求成本特别低,可靠性特别高。现在离开完全满足民用市场的要求还很远,可以说还有很长的路要走。最普通的民用灯就是白炽灯,也就是我们普通用的灯泡。所以如果LED要取代白炽灯泡,就要开发出一种无论在灯头形状还是外型上都和白炽灯泡类似的灯泡,这就是我们通常称为LED球泡灯。可以想象,球泡灯的市场是十分巨大的。   对LED球泡灯的要求   因为要替换白炽灯,所以至少要有以下几方面的要求:   亮度要相当 白炽灯通常只讲瓦数而不讲流明数。LED虽然也可以只讲瓦数,但
[电源管理]
工程师分享:LED球泡灯电源设计经验与光学<font color='red'>结构</font>技术探讨
荣耀X10内部结构图解密:大面积石墨烯散热加持
继此前赵明正式官宣新款荣耀X10后,今日博主 @数码闲聊站 也曝光了一张荣耀X10的内部结构图。 据 @数码闲聊站 介绍称,全新荣耀X10采用了以前Mate系列上的大面积石墨烯散热技术,由此来看此次荣耀X10的散热表现将会有明显改善。   IT之家此前报道,荣耀X10预计将采用升降式前摄,配备矩阵式后置四摄。根据工信部的入网信息,荣耀X10机身厚8.8mm,重203g,将采用6.63英寸2400×1080分辨率LCD屏幕,搭载麒麟820 5G芯片,内置4200mAh电池,支持22.5W快充,采用侧边指纹。从配置来看荣耀X10定位是国民级的5G手机,有助于推动5G全民普及。   荣耀X10将于5月20日正式发
[手机便携]
KEIL C51 printf格式化输出特殊用法
/******************************************* KEIL里扩展出了b,h,l来对输入字节宽的设置: (1)b八位 (2)h十六位(默认) (3)l三十二位 在Keil C51中用printf输出一个单字节变量时要使用%bd,如 unsigned char counter; printf(“Current count: %bd\n”, counter);//输出8位”十进制有符号整数” printf(“Current count: %bx\n”, counter);//输出8位”无符号以十六进制表示的整数” 而在标准C语言中都是使用%d: printf(“Current count: %d\
[单片机]
多家科技公司联合投诉其“专利垄断”
据外媒报道,包括苹果、宝马、戴尔、思科等一个 27 家公司组成的团体近日向欧盟委员会联合提出投诉,呼吁对专利垄断、封锁等滥用行为采取行动,这些滥用专利的行为阻碍了自动驾驶汽车和物联网等其他相关设备的开发。据媒体称,这些科技公司投诉的对象极有可能是芬兰诺基亚公司。 据悉,在这些 27 家公司递交给欧盟的投诉信里写道:“一些(标准必需专利)拥有者只给某些特定的公司提供授权的做法……阻碍了物联网和相关创新科技公司研发部规划的投资。这种做法扼杀了创新,阻止了新的市场准入,破坏了供应商和老客户之间的关系。这种行为导致的是,欧洲企业和消费者也许要在竞争更激烈的市场里花费更高的价钱才能买到所需的东西。” 由于这封投诉信并没有指名道姓地
[嵌入式]
多家科技公司<font color='red'>联合</font>投诉其“专利垄断”
12家机构联合B轮投资,助力半导体划切设备国产化
近日,沈阳和研科技有限公司(以下简称“和研科技”)完成B轮融资,本轮融资由华登国际、超越摩尔基金、元禾璞华、韦豪创芯、金浦投资、士兰创投、银杏谷资本、泰达科投、兴橙资本、苏高新金控和正海资产等联合投资,A轮股东全德学资本继续加投。本轮融资款将主要用于高端全自动系列产品研发、12英寸精密划片机产能释放及苏州子公司新产品项目建设,投资方均深耕半导体产业投资多年,将为和研科技引入丰富的客户资源,提供人才交流和技术合作机遇,助力和研科技实现半导体划切设备国产化替代。 和研科技成立于2011年,是一家专业从事半导体精密划切设备研发、生产、销售及服务的国家高新技术企业,创始团队成员最早自1983年即加入研制半导体精密划片机的国家项目组从
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved