234彩票代理

  • <tt class='tlJykMlA'></tt>
  • <thead class='94K7Lauipx'><option class='9cNvbSu7LJ'></option></thead>

    <em class='jepytdnyfeW3'><b class='oR1Ys12nk'><td class='6rzzLTN'></td></b></em>

  • <dl class='Td0EmkF'><b class='qoWhaibfJ9'></b></dl>

  • <span class='lS1G'></span>

    (玩电子) 电子技术学习与研究
    当前位置:单片机教程网 >> 基础教程 >> 浏览文章

    第十七课 C51结构、联合№和枚举的一使用

    作者:佚名   来源:本站原创   点击数:x  更新时间:2007年07月12日   【字体:

    前面的一文章中介绍了 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://www. 或电邮 51hei@163.com,得到本文相关的一更多资讯 。本教程所涉及c51源代码请点此下载

    发表评论】【告诉好友】【收藏此文】【关闭窗口

    文章评论

    相关文章