当前位置:首页 > 单片机 > 单片机
[导读]前面的文章中介绍了 C 语言的基本数据类型,为了更有效的处理更复杂的数据,C 语 言引入了构造类型的数据类型。构造类型就是将一批各种类型的数据放在一起形成一种特殊 类型的数据。之前讨论过的数组也算是一种构造类

前面的文章中介绍了 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);
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

与微油配风器相比 ,微气配风器具有预燃时间短 、火焰温度高 、燃烧效率高 、操作方便等优点 ,但是 ,微气配风器也有其自身的缺点 , 即天然气着火稳定性差。现从微气配风器本身结构优化和运行参数等多个方面进行试验研究 ,结...

关键字: 微气配风器 点火 天然气 结构 运行参数

电解电容和普通电容是两种不同类型的电容器,它们在结构、工作原理和使用场合等方面存在明显的差异。本文将详细介绍电解电容和普通电容的区别,帮助读者更好地了解这两种电容器。

关键字: 电解电容 普通电容 结构

整流变压器整流变压器是整流设备的电源变压器。整流设备的特点是原方输入电流,而副方通过整流原件后输出直流。整流变压器和普通变压器的原理相同。变压器是根据电磁感应原理制成的一种变换交流电压的设备。变压器一般有初线和次级两个互...

关键字: 整流变压器 电流 结构

变压器是一种能量转换装置,是一种相对可靠的电气设备,但其一旦发生故障影响十分巨大,它牵涉到用户停电和花费较大的修理费用且修理时间也较长。了解变压器的结构,对于分析变压器的故障有很大的帮助作用。电力变压器是根据电磁感应原理...

关键字: 变压器 结构 电能

变配电运行中,变压器必不可少,熟悉和掌握变压器的基本常识是非常有必要的,变压器的基本知识储备是每一个电力人必备的技能!在交流电路中,将电压升高或降低的设备叫变压器,变压器能把任一数值的电压转变成频率相同的我们所需的电压值...

关键字: 变压器 交流电压 结构

直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。

关键字: 直流 电机 结构

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的...

关键字: C51 数据类型 扩充定义

数据元(Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

摘要:由于智能制造行业的发展需求,无人机的用途在无限扩大,同时也对无人机自主导航提出了极高的要求,以减少人为操作的干预。实现无人机姿态追踪功能是无人机自主导航的重要途径,而实现良好的无人机姿态追踪,不仅仅需要建立出色的姿...

关键字: 无人机 姿态追踪 结构

摘要:介绍了160km/h快运货车转向架的主要技术参数、主要结构、主要零部件试验情况及技术特点,为其他形式的快运货车转向架研究提供了借鉴。

关键字: 结构 试验 技术参数
关闭