0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

结构体在单片机中的应用

硬件攻城狮 来源:果果小师弟 作者:果果小师弟 2022-08-29 10:43 次阅读

摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体,才能说明你入门了单片机。

本篇将以最通俗的方式并结合STM32单片机,来给大家讲一讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。

我们都知道,指针和结构体是单片机的难点,所以就去学习C语言,找视频看书......

这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!

但是,等你真正学单片机的时候,你会发现自己不是学过C语言嘛,计算机二级我也过了,怎么这个指针和结构体还是不懂呀?难道我学了一个假的C语言?

其实这不是你的错,也不是单片机的错,而是在C语言和单片机之间需要一个过渡!这个需要过渡的点,在很多单片机视频教程中并没有去讲解。因为教育机构默认你是知道的,所以在讲流水灯时他们并不会讲解GPIO初始化这个结构体,因为默认你是知道如何操作的。

3ee1f838-261c-11ed-ba43-dac502259ad0.png

申明一个GPIO_InitTypeDef的结构体,然后在LED_Init(void)函数中定义一个GPIO_InitStructure的变量GPIO_InitStructure,那么这个变量就可以设置这个GPIO_InitTypeDef的结构体中的成员。这里先做了解,请接着往下看。

1、为什么需要结构体

这里先不说什么是结构体,说说为什么需要结构体?只有知道为什么需要,才能按照你的需要去学习,这样效率才会高。你才知道在什么情况下我们需要写一个结构体,怎么样去用结构体。

这里我们以一个智能家居的项目为例。

首先,我们来看一个实际的问题:话说有一个项目上有4个传感器光照传感器、烟雾传感器、酒精传感器、湿度传感器然后这四个各个传感器还有设置报警的阈值范围。

一般都是这样写:

#include"sys.h"
#include"delay.h"
#include"usart.h"

/*记录传感器的数值*/
floattemperature;//温度
charhumidity;//湿度
charalcohol;//酒精浓度
intillumination;//光照强度

/*记录传感器高低阈值*/
floattemperature_threshold[2];
floathumidity_threshold[2];
floatalcohol_threshold[2];
floatillumination_threshold[2];

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
while(1)
{
}
}
3ef433b8-261c-11ed-ba43-dac502259ad0.png

当然,你做一个项目肯定还定义了很多其他的变量,还需要记录其它变量。

3f012bd6-261c-11ed-ba43-dac502259ad0.png

然后过了几天,又增加了个一氧化碳传感器。

3f0de9b6-261c-11ed-ba43-dac502259ad0.png

然后又过了几天,每个传感器还需要加个是否正常工作的标志位。

3f224f1e-261c-11ed-ba43-dac502259ad0.png

因为项目的需要,然后又增加了4个相同的传感器:温湿度、光照强度、烟雾浓度、酒精浓度。

3f43e35e-261c-11ed-ba43-dac502259ad0.png

然后又增加了4个相同的传感器:温湿度、光照强度、烟雾浓度、酒精浓度。

截图截不开了....

3f502af6-261c-11ed-ba43-dac502259ad0.png

满屏的变量......

满屏的变量......

满屏的变量......

在项目刚开始做的时候如果不能未雨绸缪,接着干下去整个程序代码别说维护了,就是接着写都让人头疼!

满屏的变量...

满屏的变量...

2、结构体闪亮登场

然后搞C语言那帮家伙就造了个功能struct

1、结构体就是可以把变量包含到里面的东西

struct就代表要定义一个结构体,sensors是这个结构体的名字,然后是一个大括号 { }

大括号里面就随意定义变量啦~

3f5cf632-261c-11ed-ba43-dac502259ad0.png

怎么使用里面的变量呢?

注意:结构体是一个数据类型就像是int和char一样的这种类型。

既然是一种数据类型,那么就可以用这个数据类型定义变量。

定义一个该结构体的变量:

3f6b240a-261c-11ed-ba43-dac502259ad0.png

为啥要那样子定义啊?

答:你去问造C语言的那帮家伙去!问问他们为啥要设计成这样子!

然后操作结构体变量里面的成员变量。当我们定义好结构体变量后,在初始化变量里面的成员变量时就会自动出现结构体里面的成员变量,如果这个代码是你一个一个敲出来的话,你就会感叹结构体在单片机中是那么的奇妙!

3f778ea2-261c-11ed-ba43-dac502259ad0.png3f847e5a-261c-11ed-ba43-dac502259ad0.png3f928cd4-261c-11ed-ba43-dac502259ad0.png

有人会问为啥是结构体变量中间加个点?

答:你去问造C语言的那帮家伙去!问问他们为啥要设计成这样子。

2、其实定义结构体变量可以下面这样子

3f9fcb38-261c-11ed-ba43-dac502259ad0.png

也可以定义多个:

3fa9d5c4-261c-11ed-ba43-dac502259ad0.png3fb6379c-261c-11ed-ba43-dac502259ad0.png

发现了没,每个结构体变量都是单独拥有结构体里面的全部成员变量。

就像是最开始说的,如果再增加一套传感器:温湿度、光照强度、烟雾浓度、酒精浓度。

使用结构体的话只需要再定义一个结构体变量即可

但很多时候,我们在单片机中见到的结构体并不是上面那样定义的,而是在前面加了一个typedef 关键字。

这样的例子在库函数的头文件中,我们经常会看到如下结构体:

3fc377c2-261c-11ed-ba43-dac502259ad0.png

3、typedef关键字

先看一下百度百科对typedef的定义:

3fcf9232-261c-11ed-ba43-dac502259ad0.png

总结一句就是:typedef可以把一个数据类型取一个别的名字

typedef {数据类型} {别的名字}

#include"sys.h"
#include"delay.h"
#include"usart.h"

typedefintzhjiguoxin;//zhjiguoxin就是int

zhjiguoxinvalue=0;

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();

printf("value=%d
",value);

while(1)
{
}
}
3fdce4dc-261c-11ed-ba43-dac502259ad0.png3fe86c3a-261c-11ed-ba43-dac502259ad0.png

虽然typedef可以给变量取别名,但是没有谁会像上面那样取名字,我这里只是举一个例子。

4、结构体的精髓

注意:

1、下面的代表了这个结构体数据类型

3ff906da-261c-11ed-ba43-dac502259ad0.png

2、给这个数据类型起一个别名

注意是三部分, typedef {数据类型} {别的名字}。所以sensor就代表了这个结构体了。

建议初学者把下面这张图保存到你的电脑,这样你就永远也不会忘记typedef在结构体中的用法了,也能很快的记住结构体这个东东。

4005f606-261c-11ed-ba43-dac502259ad0.png

3、以后定义结构体变量的时候,就不需要像最开始那样struct sensors sen;这样的定义结构体变量了,只需要sensor sen;即可。

4010e246-261c-11ed-ba43-dac502259ad0.png

4、结构体名字可以省略

注意结构体定义可以不写结构体名,对C语言来说,那个sensors不叫结构体名,而是叫标签(tag)。C语言结构体名是struct关键字 + tag。所以为了简便,我们看到的单片机中的结构体都是写成如下的形式。

401fb3de-261c-11ed-ba43-dac502259ad0.png

5、结构体的变量可以放任何变量

1、结构体变量可以放任何变量(int型指针)

#include"sys.h"
#include"delay.h"
#include"usart.h"
typedefstruct
{
floattemperature;//温度
charhumidity;//湿度
charalcohol;//酒精浓度
intillumination;//光照强度
charCO;//一氧化碳浓度
int*p;//int型的指针变量
}sensor;
sensorsen;
intvalue=0;
intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
sen.p=&value;//把value的地址赋值
//打印p代表的地址里面的值(其实就是打印value的值)
printf("value=%d
",*(sen.p));
while(1)
{
}
}

既然是指针变量,所以给指针变量赋值时当然是赋值的是一个地址。

403054f0-261c-11ed-ba43-dac502259ad0.png403f8b0a-261c-11ed-ba43-dac502259ad0.png

2、结构体变量可以放任何变量(函数指针)

#include"sys.h"
#include"delay.h"
#include"usart.h"
typedefstruct
{
floattemperature;//温度
charhumidity;//湿度
charalcohol;//酒精浓度
intillumination;//光照强度
charCO;//一氧化碳浓度
int*p;//int型的指针变量
void(*fun)();
}sensor;
sensorsen;
voidfunction()
{
printf("zhiguoxin
");
}
intvalue=0;
intmain(void)
{
uart_init(115200);//串口初始化
delay_init();
sen.fun=function;
sen.fun();
while(1)
{
}
}

既然是函数指针变量,所以给函数指针变量赋值时当然是赋值的也是地址,并且还要是一个函数的地址,而一个函数的函数名就是该函数的地址。所以才会有下面的把函数function();的地址function赋值给函数指针fun。

这样大家是不是很清楚了?如果不清楚,建议看个3遍以上!

404c2e82-261c-11ed-ba43-dac502259ad0.png405c1c2a-261c-11ed-ba43-dac502259ad0.png

3、结构体变量可以放任何变量(结构体变量)

这就是结构体嵌套,在一个结构体内包含了另一个结构体作为其成员。当出现结构体嵌套时,必须以级联方式访问结构体成员,即通过成员选择运算符逐级找到最底层的成员时再引用。

#include"sys.h"
#include"delay.h"
#include"usart.h"

typedefstruct
{
inti;
}zhiguoxin;

typedefstruct
{
floattemperature;//温度
charhumidity;//湿度
charalcohol;//酒精浓度
intillumination;//光照强度
charCO;//一氧化碳浓度
int*p;//int型的指针变量
void(*fun)();
zhiguoxinguougo;
}sensor;

sensorsen;

intmain(void)
{
uart_init(115200);//串口初始化
delay_init();

sen.guougo.i=100;
printf("i=%d
",sen.guougo.i);

while(1)
{
}
}
40691a42-261c-11ed-ba43-dac502259ad0.png4078ffca-261c-11ed-ba43-dac502259ad0.png

4、结构体变量可以放任何变量(结构体指针)

结构体是一个数据类型。当然,数据类型也可以定义对应的指针变量啦。

就像是int 类型可以定义 int *p; 一样

4088dbf2-261c-11ed-ba43-dac502259ad0.png

所以,当大家如果发现你的代码中结构体是通过—>访问的话,那么这个结构体变量一定是指针类型的变量。

同理,如果代码中结构体是通过.访问的话,那么这个结构体变量就不是指针变量,而是一般的变量。

4094398e-261c-11ed-ba43-dac502259ad0.png40ab3f9e-261c-11ed-ba43-dac502259ad0.png

总结:至此,有关结构体在单片机中的应用,相信你已经掌握的差不多了。大家可能感觉本文的内容太简单了,但只有把这个简单的基础性知识打牢,你才能进步得更快,否则你总感觉自己的代码差点意思。

审核编辑:汤梓红


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5991

    文章

    43904

    浏览量

    619626
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124166
  • 结构体
    +关注

    关注

    1

    文章

    125

    浏览量

    10746

原文标题:讲的太太太太清晰了~从零开始教你写单片机的结构体

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言的结构单片机的应用有哪些?

    C语言的好处是什么?C语言的结构单片机的应用有哪些?
    发表于 10-14 06:18

    c语言结构单片机的应用是什么

    Struck看到单片机中有很多struck 的应用,但是呢我当初学C语言的时候又没有很认真的去学习,今天复习下,写一篇小小的交流,希望能够给大家带来帮助。1.struck的定义
    发表于 11-30 07:21

    AVR高速嵌入式单片机原理与应用

    AVR高速嵌入式单片机原理与应用详细介绍ATMEL公司开发的AVR高速嵌入式单片机结构;讲述AVR单片机的开发工具,包括AVRStudio调试工具、
    发表于 10-28 16:14 63次下载
    AVR高速嵌入式<b class='flag-5'>单片机</b>原理与应用

    AVR 单片机与GCC 编程

    AVR 单片机与GCC 编程2.1 AVR 单片机存储器组织结构AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EE
    发表于 04-09 14:00 60次下载

    AVR单片机的基本组成

    单片机是构成单片机嵌入式系统的核心器件。本章首先将介绍一般单片机的基本组成和结构,使大家对单片机片内的硬件有基本了解和认识。掌握了
    发表于 07-07 01:08 44次下载

    单片机入门教程第二课-单片机的内部、外部结构(一)

    单片机入门教程第二课-单片机的内部、外部结构(一)  一、单片机的外部结构  拿到一块芯片,想要使用它,首先必须要知道怎样连
    发表于 01-07 16:52 846次阅读
    <b class='flag-5'>单片机</b>入门教程第二课-<b class='flag-5'>单片机</b>的内部、外部<b class='flag-5'>结构</b>(一)

    8098单片机原理与应用

    内容提要: 8098单片机结构综述 8098单片机指令系统 8098单片机的中断系统及其应用 8098单片机实验程序设 计 8098
    发表于 10-26 09:16 55次下载
    8098<b class='flag-5'>单片机</b>原理与应用

    AT89S51单片机硬件结构介绍

    第2章 AT89S51单片机硬件结构可以了解单片机的原理的。可以好好看看
    发表于 12-08 15:55 0次下载

    单片机结构与原理是怎样的和单片机的简单应用概述

    本文档的主要内容详细介绍的是单片机结构与原理是怎样的和单片机的简单应用概述目的是:了解单片机的内部结构与主要型号。掌握
    发表于 10-19 17:18 30次下载
    <b class='flag-5'>单片机</b>的<b class='flag-5'>结构</b>与原理是怎样的和<b class='flag-5'>单片机</b>的简单应用概述

    你真的完全了解了单片机了吗快来快速了解单片机

    本文档的主要内容主要是为了让你完全了解了单片机主要包括了:1 了解单片机的基本结构与应用,2 了解单片机的逻辑语言,3 了解单片机学习的软硬
    发表于 02-20 14:05 1次下载
    你真的完全了解了<b class='flag-5'>单片机</b>了吗快来快速了解<b class='flag-5'>单片机</b>吧

    51单片机的五张经典结构图免费下载

    本文档的主要内容详细介绍的是51单片机的五张经典结构图免费下载包括了:51单片机的主要功能方框图,51单片机储存器结构,51
    发表于 08-16 17:32 8次下载
    51<b class='flag-5'>单片机</b>的五张经典<b class='flag-5'>结构</b>图免费下载

    c语言结构体在单片机中的应用

    Struck看到单片机中有很多struck 的应用,但是呢我当初学C语言的时候又没有很认真的去学习,今天复习下,写一篇小小的交流,希望能够给大家带来帮助。1.struck的定义
    发表于 11-20 19:51 10次下载
    c语言<b class='flag-5'>结构</b>体在<b class='flag-5'>单片机</b>中的应用

    干货|手把手教你写单片机的C语言结构

    摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一
    发表于 11-23 17:51 42次下载
    干货|手把手教你写<b class='flag-5'>单片机</b>的C语言<b class='flag-5'>结构</b>体

    干货|手把手教你写单片机结构

    摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓...
    发表于 01-25 18:11 4次下载
    干货|手把手教你写<b class='flag-5'>单片机</b>的<b class='flag-5'>结构</b>体

    学习单片机C语言,必知的数据存储与程序编写知识!

    Flash相对单片机里的RAM属于外部存取器,虽其结构位置装在单片机中,其实xdata是放在相对RAM的外面,而flash正是相对RAM外面。
    发表于 02-08 16:18 1次下载
    学习<b class='flag-5'>单片机</b>C语言,必知的数据存储与程序编写知识!