51单片机之C语言-4.3结构体

发布者:Yuexiang最新更新时间:2016-03-29 来源: eefocus关键字:51单片机  C语言  结构体 手机看文章 扫描二维码
随时随地手机看文章
既然既然相同长度单元格能放在一起,比如char1,char2,char3; int1,int2,int3; long1,long2,long3.在实际使用中,有些变量长度是不一样的,但由于它们之间相互关联也需要放在一起,那么要是不同长度的变量,想放在一起有没有办法呢?当然可以,这个就叫做结构体。现在按照数组的学习方法来研究结构体,两个问题,如何定义;如何访问结构体成员。

(1) 如何定义一个结构体

定义一个结构的一般形式为:

struct 结构名

{成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:

类型说明符成员名;

成员名的命名应符合标志符的书写规定。例如:

struct stu

{

    int num;

    char name[20];

    char sex;

    float score;

    

}

由以上可见,通过struct来定义一个结构体名,然后描述这个结构体中各个成员。struct stu类似于int或者char.为什么这么讲呢?我们来看看char是什么,char就是固定化的存储空间,一个字节,int就是固定的两个字节。我们知道变量是多样化的,现在我需要的变量既不是int 也不是char,而是int和char的综合,那怎么办?这个就是结构体了。简单的讲,int,char是固定好的存储空间划分,struct stu是自定义存储空间划分。类似于很多软件中有默认的设置,还有自定义设置。了解这点,我们来看看如何定义结构体变量:

先来深入了解一下前面我们是怎么定义变量的?比如char mystring, int mydata.这个是先划分存储空间然后,再给这个空间命名。比如char先要一个一个字节的单元格,然后给这个字节取个名字叫mystring,同样int就是先要2个字节的单元格,然后给这两个字节取个名字叫mydata. 同样对于结构体变量,我们先要一个存储空间,然后给这个空间取个名字。这个存储空间可以任意由你定义。比如struct stu.然后给这个空间取个名字,比如boy1.因此我们就知道了如何定义一个结构体变量。与其他变量并无区别。

struct stu boy1,boy2;等等。这里小结一下,结构体变量定义一共有三种方法:

1)先定义结构,再说明结构变量

struct stu

{

    int num;

    char name[20];

    char sex;

    float score;

}

struct stu boy1,boy2;

2) 在定义结构类型的同时说明结构变量

struct stu

{

    int num;

    char name[20];

    char sex;

    float score;

}boy1,boy2;

3)直接说明结构变量

struct

{

    int num;

    char name[20];

    char sex;

    float score;

}boy1,boy2;

第3种方法中省去了结构名。

(2)结构变量的初始化

和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。

那么结构体的成员能否为数组?当然可以。我们来看看如何在结构体成员中让某个成员为数组

struct mystruct {

    int age;

    int score;

    char sex;

    char myarry[3];

};

struct mystruct boy1;

void main(void)

{

    boy1.myarry[0]=4;

    boy1.myarry[1]=2;

    boy1.myarry[2]=3;

}

这中方法是通过给数组的成员一个一个赋值

(3) 结构体成员的访问

那么如何访问结构体中的成员呢?我们访问数组的时候,比如数组a[4],我要访问第三个成员,那么直接使用a[2],就可以了。那么访问结构体成员,使用结构体变量加成员名,比如:

boy1.num

boy2.name

boy1.birthday.month

与普通变量完全相同。

 

#include "reg52.h"

typedef unsigned char uchar;

void delayUs(uchar t);

void delayMs(uchar t);

void main (void)

{

        struct MyStruct

        {

                uchar DATA0;

                uchar DATA1;

                uchar DATA2;

                uchar DATA3;

                uchar DATA4;

                uchar DATA5;

                uchar DATA6;

                uchar DATA7;        

        };

        struct MyStruct MyData;

        MyData.DATA0=0xfe;//点亮第1个LED灯

        MyData.DATA1=0xfd;//点亮第2个LED灯

        MyData.DATA2=0xfb;//点亮第3个LED灯

        MyData.DATA3=0xf7;//点亮第4个LED灯

        MyData.DATA4=0xef;//点亮第5个LED灯

        MyData.DATA5=0xdf;//点亮第6个LED灯

        MyData.DATA6=0xbf;//点亮第7个LED灯

        MyData.DATA7=0x7f;//点亮第8个LED灯

        while(1)

        {

                P1=MyData.DATA0;//点亮第1个LED灯

                delayMs(100);

                P1=MyData.DATA1;//点亮第2个LED灯

                delayMs(100);

                P1=MyData.DATA2;//点亮第3个LED灯

                delayMs(100);

                P1=MyData.DATA3;//点亮第4个LED灯

                delayMs(100);

                P1=MyData.DATA4;//点亮第5个LED灯

                delayMs(100);

                P1=MyData.DATA5;//点亮第6个LED灯

                delayMs(100);                

                P1=MyData.DATA6;//点亮第7个LED灯

                delayMs(100);                

                P1=MyData.DATA7;//点亮第8个LED灯        

                delayMs(100);

        }

}

void delayUs(uchar t)

{

        while(--t);

}

void delayMs(uchar t)

{

        while(--t)

        {

                delayUs(245);

                delayUs(245);

                

        }

}

关键字:51单片机  C语言  结构体 引用地址:51单片机之C语言-4.3结构体

上一篇:51单片机之C语言-4.4运算符及表达式
下一篇:51单片机之C语言-4.2数组

推荐阅读最新更新时间:2024-03-16 14:48

AVR C语言开发简介
Avr单片机和其他单片机一样,有自己的指令和寄存器,特定的IO口操作方法,有定时器,AD转换,串行口,PWM输出,EEPROM等。为了缩短大家学习的时间,快速的了解avr编程思路,拟定avr程序设计系列教程。我使用avr也不是很长时间,技术有限,错误再所难免,还请指出,以期改正。 【说明】:本页是针对从来没有碰过单片机或者用过单片机而没有用c语言的朋友,如果你已经用过其他单片机,此页说明可能对你没有很大帮助,且显得有些幼稚,请你跳过。 本站所有程序都是在icc+avrstudio下进行的,如果你没有配置好环境 采用icc的原因之一是它自带一个非常好用的application builder,生成的代码结构清晰,层次清楚
[单片机]
AVR <font color='red'>C语言</font>开发简介
51单片机定时器使用时非常重要的6点经验详细的总结
单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2. 尽量用形像的方法记忆。 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像。 3. TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。其格式为:其中低四位定义定时器/计数器C/T0,高四位定义定时器/
[单片机]
<font color='red'>51单片机</font>定时器使用时非常重要的6点经验详细的总结
【自学51单片机】4---进制转换、C语言变量种类和运算符
不同进制之间转换、C语言变量种类和运算符、keil的Debug用法及应用 和 流水灯的实现 1、二进制、十进制、十六进制转换 1.1 进制介绍 十进制:逢十进位,一个为有十个值:0~~9。 二进制:逢二进位,它的一个位只有两个值:0 和 1,是实现计算机系统的最基本的理论基础,计算机(包括单片机)芯片是基于成万上亿个的开关管组合而成的,他们每一个都只能有开和关两种状态,对应于二进制的 1 和 0 两个值,书写二进制数据时需加前缀 0b,每一位的值只能是 0 或 1。八位二进制称为一个字节。 十六进制:把 4 个二进制位组合为一位来表示,用 0~9 再加上 A~F(或 a~f)表示,逢十六进位,是二进制的一种缩写形式,也是我
[单片机]
【自学<font color='red'>51单片机</font>】4---进制转换、<font color='red'>C语言</font>变量种类和运算符
51单片机与RC500射频
#include reg52.h #include RC500.h #include string.h #include stdio.h #include absacc.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define GetRegPage(addr) (0x80 | (addr 3)) idata struct TranSciveBuffer{uchar MfCommand; uchar MfLength;
[单片机]
基于AT89C51单片机的微型PLC详解
可编程控制器PC(Programmable Controller),为与个人计算机PC(Personal Computer)相区别,可简称为PLC。它是按照成熟而有效的继电控制概念和设计思想,用先进的单片机技术来实现I/O的实时检测和控制,可靠性高,编程简单、易学,因此,得到广泛应用。 将PLC技术引进电工学、电力拖动课程,是课程建设现代化的重要措施。在教学经费相对紧张的情况下,我们自己动手,以AT89C51单片机为核心,设计并研制了LD型微型PLC,应用于继电控制实验,取得了良好的效果。 用单片机构成的PLC,实际上就是一个单片机测控系统。用这样一个程序控制的计算机系统去执行继电控制的梯形图程序,由于继电控制梯形图中各被
[单片机]
基于AT89C<font color='red'>51单片机</font>的微型PLC详解
用Proteus学习51单片机之AD转换
现实中的很多量,都是模拟量,如温度,压力等,单片机要去了解它们,首先就要把这些量进行数字化,AD转换即把模拟量转变为数字量。这次书上介绍的AD芯片为ADC0804,8位并行AD转换芯片。关于AD转换的详细原理,我就不抄了,网上有的是。 ADC0804的使用,比前面用过的锁存器74LS573难用得多,主要是读写数据都要根据时序图,进行电位的变化,而且芯片的接法也相对麻烦一点。下面记录一下引脚定义: VIN(+),VIN(-):待测量的模拟信号输入 DB0~DB7:测量结果输出 AGND:模拟信号地 DGND:数字信号地 CLK:时钟信号输入端 CLKR:内部时钟发生器的外接电阻端,与CLK端配合可由芯片自身产生时钟脉冲,其频率为1/
[单片机]
用Proteus学习<font color='red'>51单片机</font>之AD转换
51单片机的精确延时程序分析
一、C51程序 在晶振为11.0592的情况下,如下程序能实现ms级的比较精确的延时: 1 void Delayms(unsigned int n) 2 { 3 unsigned int i,j; 4 for(j=n;j 0;j--) 5 for(i=112;i 0;i--); 6 } 用keil可以看出这个延时的时间,我们先延时1ms,即Delayms(1)。 进入Delayms前,sec=0.00042209s 延时后,sec=0.00142253s 可以知道Delayms(1)实际延时0.00142253s 0.00042209s=0.00100044s 1ms 同样如果想延时15ms的话,用
[单片机]
<font color='red'>51单片机</font>的精确延时程序分析
增强型51单片机和传统51单片机对比分析
前面的内容,我们从传统的51单片机出发,从硬件的基础上,一步步衍生出了增强型51单片机所增强的地方。现在我们可以清楚地了解,增强型51单片机对比传统的51单片机,增强的地方在于存储器的扩展。而51单片机对于片内内存的寻址方式和片外内存的寻址方式有着很大的不同。因此,我们在使用C语言对增强型51单片机编程的时候,也需要按照寄存器位置的不同,采用不同的操作方式。 1寄存器位于内部的特殊功能寄存器区 我们之前介绍传统8051单片机的时候,曾经列出了传统8051单片机已经使用的21个特殊功能寄存器,因此扩展外设寄存器的一个办法就是利于剩余的特殊功能存储器空间。 由于51单片机的特殊功能寄存器寻址方式只能是直接寻址,不可间接寻址,因此在
[单片机]
增强型<font color='red'>51单片机</font>和传统<font color='red'>51单片机</font>对比分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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