<meta name="keywords" content="必胜时时彩开户,keywords" /> 第十七课 C51结构、团结和枚举的应用 联系我们

第十七课 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 <AT89X51.H>

#include <stdio.h>

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);

}

图 17-1 所示是运转的效果,A 中所示是诠释例程中联络中的数组和结构占用的是统一段地址的内存空间,而结构中的两数组是各占两段纷歧样内存空间。


图 17-1

在此质朴的单片机C语言教程就阻拦了,限于作者的水平不克不及详实誊录。作者自己也是 一名专业的单片机喜欢者,欲望能和更多类似兴趣的同伙学习交流,读者同伙也能会见网站 http://mamjap.com 或电邮 51hei@163.com,取得本文相关的更多资讯。本教程所触及c51源代码请点此下载