侵权投诉

结合STM32单片来讲讲结构体的运用

FPGA之家 2021-05-27 17:42 次阅读

摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完成一些低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来讲讲结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。

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

这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不禁在下面评论一句:哇!讲的真的太清楚了吧!但是等你真正的学单片机的时候,你会发现我不是学过C语言吗?计算机二级我也过了啊!怎么这个指针和结构体都不懂啊?难道我学了一个假的C语言?

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

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

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

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

先来看一个实际的问题

话说有一个项目上有4个传感器:光照传感器、烟雾传感器、酒精传感器、湿度传感器。然后这四个各个传感器还有设置报警的阈值范围。

一般都是这样写

#include “sys.h”#include “delay.h”#include “usart.h”/*记录传感器的数值*/float temperature; //温度char humidity; //湿度char alcohol; //酒精浓度int illumination; //光照强度/*记录传感器高低阈值*/float temperature_threshold[2];

float humidity_threshold[2];

float alcohol_threshold[2];

float illumination_threshold[2];

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

while(1)

{

}

}

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

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

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

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

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

截图截不开了。..。

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

2、结构体闪亮登场然后搞C语言那帮家伙就造了个功能struct

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

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

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

怎么使用里面的变量呢?

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

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

定义一个该结构体的变量

为啥要那样子定义啊?

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

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

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

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

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

也可以定义多个

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

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

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

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

3、typedef关键字先看一下百度百科对typedef的定义

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

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

#include “sys.h”#include “delay.h”#include “usart.h”typedef int zhjiguoxin;//zhjiguoxin就是int

zhjiguoxin value = 0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

printf(“value=%d

”,value);

while(1)

{

}

}

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

4、结构体的精髓注意下:

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

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

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

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

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

4、结构体名字可以省略

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

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

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

} sensor;

sensor sen;

int value =0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.p=&value;//把value的地址赋值

//打印p代表的地址里面的值(其实就是打印value的值)

printf(“value=%d

”,*(sen.p));

while(1)

{

}

}

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

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

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

void (*fun)();

} sensor;

sensor sen;

void function()

{

printf(“zhiguoxin

”);

}

int value =0;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.fun=function;

sen.fun();

while(1)

{

}

}

既然是函数指针变量,所以给函数指针变量赋值时当然是赋值的也是地址,并且还要是一个函数的地址,而一个函数的函数名就是该函数的地址。所以才会有下面的把函数function();的地址function赋值给函数指针fun。这样大家是不是很清楚了。如果不清楚建议看个3遍以上!

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

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

#include “sys.h”#include “delay.h”#include “usart.h”typedef struct

{

int i;

}zhiguoxin;

typedef struct

{

float temperature; //温度

char humidity; //湿度

char alcohol; //酒精浓度

int illumination;//光照强度

char CO; //一氧化碳浓度

int *p; //int型的指针变量

void (*fun)();

zhiguoxin guougo;

}sensor;

sensor sen;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

sen.guougo.i=100;

printf(“i=%d

”,sen.guougo.i);

while(1)

{

}

}

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

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

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

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

总结:到这里结构体在单片机中的应用你已经掌握的差不多了,大家可能感觉本期讲的内容太简单了,不过只有你把这个简单的基础性知识打牢,你就会进步的更快。否则你总感觉你的代码差点意思。

原文标题:干货|手把手教你写单片机的结构体

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

原文标题:干货|手把手教你写单片机的结构体

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

单片机监测交流电压报警系统设计

单片机监测交流电压报警系统设计(新型电源技术作业答案)-单片机监测交流电压报警系统设计,该报警系统对....
发表于 09-24 17:29 8次 阅读
单片机监测交流电压报警系统设计

【Altium小课专题 第210篇】封装规则检查报错解析—Miss PAD Designator on PAD?

答:当我们在制作元件封装完毕后,我们可以在封装库里面执行菜单命令“报告→元件规则检查”进行封装规则检查,有时在AD进行封...
发表于 09-24 16:55 175次 阅读
【Altium小课专题 第210篇】封装规则检查报错解析—Miss PAD Designator on PAD?

【Altium小课专题 第209篇】封装创建完成之后如何检查封装的正确性?

答:Altium Designer 提供PCB封装错误的检查功能。创建完封装之后,可以执行菜单命令“报告-元件规则检查”,对所创建的封装...
发表于 09-24 16:52 101次 阅读
【Altium小课专题 第209篇】封装创建完成之后如何检查封装的正确性?

剖析C语言中scanf函数常见问题

在写C代码时难免对一些知识点不熟悉,导致犯错,今天分享几点小知识给大家。 空白符问题        ....
的头像 STM32嵌入式开发 发表于 09-24 16:45 99次 阅读

基于AVR单片机的直流无刷电机智能控制系统设计

基于AVR单片机的直流无刷电机智能控制系统设计(开关电源技术与设计潘永雄.pdf)-该文档为基于AV....
发表于 09-24 16:44 8次 阅读
基于AVR单片机的直流无刷电机智能控制系统设计

基于AVR单片机的直流无刷电机智能控制系统设计讲解

基于AVR单片机的直流无刷电机智能控制系统设计讲解(西工大现代电源技术)-该文档为基于AVR单片机的....
发表于 09-24 16:00 7次 阅读
基于AVR单片机的直流无刷电机智能控制系统设计讲解

基于AVR单片机的直流电机调速的方法

基于AVR单片机的直流电机调速的方法(2020空间电源技术学术研讨会)-该文档为基于AVR单片机的直....
发表于 09-24 15:40 5次 阅读
基于AVR单片机的直流电机调速的方法

基于AVR单片机的直流电动机的PWM调速系统设计

基于AVR单片机的直流电动机的PWM调速系统设计(ups电源技术协议范本)-该文档为基于AVR单片机....
发表于 09-24 15:04 8次 阅读
基于AVR单片机的直流电动机的PWM调速系统设计

AD转换是怎么转换的

什么叫单片机? 单片机的特点有哪些? AD转换是怎么转换的? ...
发表于 09-24 13:56 0次 阅读

基于ATmega单片机的直流电机调速器

基于ATmega单片机的直流电机调速器(开关电源技术与设计心得)-本毕业设计包括为基于ATmega单....
发表于 09-24 12:46 6次 阅读
基于ATmega单片机的直流电机调速器

OpenHarmony HDF平台驱动框架及驱动适配介绍

开源项目 OpenHarmony是每个人的 OpenHarmony OpenHarmony系统平台驱....
的头像 OpenAtom OpenHarmony 发表于 09-24 11:16 84次 阅读
OpenHarmony HDF平台驱动框架及驱动适配介绍

STM32F103系列单片机有几个定时器

STM32F103系列单片机有几个定时器? 如何设置STM32的死区时间? ...
发表于 09-24 09:38 0次 阅读

什么是测试单片机控制单色屏幕的最佳办法

什么是测试单片机控制单色屏幕的最佳办法? 将视频转为图像数据的matlab代码该如何去编写? ...
发表于 09-24 09:13 0次 阅读

STM32单片机有哪些优点以及缺点

51单片机有哪些优点以及缺点? STM32单片机有哪些优点以及缺点? ...
发表于 09-24 08:21 0次 阅读

怎样对基于AVR单片机的电机进行调速

你知道怎样对基于AVR单片机的电机进行调速吗?...
发表于 09-24 08:20 0次 阅读

介绍几款非常实用的单片机小工具

555定时器有何用处? 色环电阻计算器有何用处? ...
发表于 09-24 07:35 0次 阅读

怎样去设计一种基于AVR单片机的两轮自平衡智能车

怎样去设计一种基于AVR单片机的两轮自平衡智能车?如何对其进行测速?...
发表于 09-24 07:12 0次 阅读

怎样去设计一个基于ARM和ZigBee的智能家居系统

怎样去设计一个基于ARM和ZigBee的智能家居系统?有哪些步骤?...
发表于 09-24 07:00 0次 阅读

STM32等单片机程序加密有哪些方法

为了防止大家的程序不被剽窃,本文给大家分享单片机加密的方法。 另外关于解密的方法可以参考这篇文章如何....
的头像 STM32嵌入式开发 发表于 09-23 16:06 111次 阅读

Silicon Labs的Zigbee 3.0解决方案助力控客推出智能家居面板和安防系列产品

Silicon Labs致力于开发无线技术,以支持并实现智能应用中跨生态系统和网络的连接。
发表于 09-23 14:14 594次 阅读
Silicon Labs的Zigbee 3.0解决方案助力控客推出智能家居面板和安防系列产品

一种基于AVR单片机的直流电源监控系统

一种基于AVR单片机的直流电源监控系统(电源技术离线作业答案)-该文档为一种基于AVR单片机的直流电....
发表于 09-23 13:01 9次 阅读
一种基于AVR单片机的直流电源监控系统

80C196KC单片机开关稳压电源的设计

80C196KC单片机开关稳压电源的设计(开关电源技术讲座)-该文档为80C196KC单片机开关稳压....
发表于 09-23 12:27 11次 阅读
80C196KC单片机开关稳压电源的设计

单片机与芯片有什么区别

最近一直有很多小白用户会问我单片机是什么,跟芯片有什么区别。 单片机其实也是芯片的一种,芯片包括各种....
的头像 芯片逆向 发表于 09-23 11:42 256次 阅读

C++中const以及this指针的使用

const 作用 修饰变量,说明该变量不可以被改变; 修饰指针,分为指向常量的指针(pointer ....
的头像 C语言编程学习基地 发表于 09-23 11:39 135次 阅读

简述单片机常见的打印输出方式及区别

作者 |strongerHuang 微信公众号 | 嵌入式专栏 单片机开发中,打印输出比较常见,也比....
的头像 strongerHuang 发表于 09-23 09:58 90次 阅读
简述单片机常见的打印输出方式及区别

mega16单片机PWM方式驱动双直流电机自主巡线程序

mega16单片机PWM方式驱动双直流电机自主巡线程序(现代电源技术pdf下载)- mega16单片....
发表于 09-23 09:37 10次 阅读
mega16单片机PWM方式驱动双直流电机自主巡线程序

avr单片机在直流伺服控制系统中的应用

avr单片机在直流伺服控制系统中的应用(ups电源技术维修)-该文档为avr单片机在直流伺服控制系统....
发表于 09-23 09:26 13次 阅读
avr单片机在直流伺服控制系统中的应用

MSP430单片机F54系列的单片机内部的ADC转换实例

MSP430单片机F54系列的单片机内部的ADC转换实例(深圳核达中远通电源技术开发有限公司招聘)-....
发表于 09-22 18:47 13次 阅读
MSP430单片机F54系列的单片机内部的ADC转换实例

用单片机实现数控开关电源制作电压范围1.28-24V

用单片机实现数控开关电源制作电压范围1.28-24V(电源技术基础pdf)-用单片机实现数控开关电源....
发表于 09-22 18:42 22次 阅读
用单片机实现数控开关电源制作电压范围1.28-24V

AVR单片机论文:三相交流电无线预付费管理系统的设计

AVR单片机论文:三相交流电无线预付费管理系统的设计(中远通电源技术股份有限公司上市)-该文档为AV....
发表于 09-22 18:30 16次 阅读
AVR单片机论文:三相交流电无线预付费管理系统的设计

单片机人门--ADC和DAC

单片机人门--ADC和DAC(核达中远通电源技术有限公司)-该文档为单片机人门--ADC和DAC讲解....
发表于 09-22 18:03 14次 阅读
单片机人门--ADC和DAC

C语言程序实践--ACM入门

C语言程序实践--ACM入门(开关电源技术发展综述)-该文档为C语言程序实践--ACM入门讲解文档,....
发表于 09-22 17:42 10次 阅读
C语言程序实践--ACM入门

基于AVR单片机的逆变电源系统研究

基于AVR单片机的逆变电源系统研究(深圳市村田电源技术有限公司武汉分公司)-该文档为基于AVR单片机....
发表于 09-22 17:37 7次 阅读
基于AVR单片机的逆变电源系统研究

单片机实例--ADC0809 AD转换器基本应用

单片机实例--ADC0809 AD转换器基本应用(西工大现代电源技术考试)-该文档为单片机实例--A....
发表于 09-22 17:34 13次 阅读
单片机实例--ADC0809 AD转换器基本应用

AVR单片机在直流伺服控制系统中的应用讲解

AVR单片机在直流伺服控制系统中的应用讲解(开关电源技术考试论文)-该文档为AVR单片机在直流伺服控....
发表于 09-22 17:29 9次 阅读
AVR单片机在直流伺服控制系统中的应用讲解

基于单片机的数字电压表制作——ADC0832模数转换应用程序

基于单片机的数字电压表制作——ADC0832模数转换应用程序(通讯电源技术2019)-该文档为基于单....
发表于 09-22 16:03 10次 阅读
基于单片机的数字电压表制作——ADC0832模数转换应用程序

单片机入门汇编程序--直流电机的单片机控制

单片机入门汇编程序--直流电机的单片机控制(15kvaups电源技术协议)-该文档为单片机入门汇编程....
发表于 09-22 14:37 15次 阅读
单片机入门汇编程序--直流电机的单片机控制

单片机入门汇编程序--直流电机的控制

单片机入门汇编程序--直流电机的控制(安徽理士电源技术有限公司招聘)-该文档为单片机入门汇编程序--....
发表于 09-22 14:33 17次 阅读
单片机入门汇编程序--直流电机的控制

基于MSP430单片机的交流电压测量设计

基于MSP430单片机的交流电压测量设计(通讯电源技术的组成)-该文档为基于MSP430单片机的交流....
发表于 09-22 13:52 12次 阅读
基于MSP430单片机的交流电压测量设计

基于MSP430单片机的多功能直流电机驱动器

基于MSP430单片机的多功能直流电机驱动器(电源技术应用杂志)-该文档为基于MSP430单片机的多....
发表于 09-22 13:50 12次 阅读
基于MSP430单片机的多功能直流电机驱动器

基于MSP430单片机的直流电动机调速测速控制系统

基于MSP430单片机的直流电动机调速测速控制系统(实用电源技术题库)-该文档为基于MSP430单片....
发表于 09-22 13:08 9次 阅读
基于MSP430单片机的直流电动机调速测速控制系统

中科芯32位ARM开发板 CKS32F103C8T6最小系统开发板分解

由深圳市宏德伟创科技有限公司自主、原创设计的CKS32F103C8T6最小系统开发板,是一款高性价比....
发表于 09-22 11:28 1091次 阅读
中科芯32位ARM开发板 CKS32F103C8T6最小系统开发板分解

利用按键控制8×8LED点阵屏显示图形

利用按键控制8×8LED点阵屏显示图形
发表于 09-22 09:59 23次 阅读

单片机C868实现无传感器BLDC电机控制

单片机C868实现无传感器BLDC电机控制(电源技术作业 电力/水利工程科技 答案)-单片机C868....
发表于 09-18 17:24 18次 阅读
单片机C868实现无传感器BLDC电机控制

基于单片机的开关稳压电源的设计的资料

基于单片机的开关稳压电源的设计的资料(现代电源技术基础 杨飞pdf)-文档为基于单片机的开关稳压电源....
发表于 09-18 16:21 43次 阅读
基于单片机的开关稳压电源的设计的资料

基于单片机的直流数控电压源设计

基于单片机的直流数控电压源设计(电源技术离线作业反激电路分析答案)-文档为基于单片机的直流数控电压源....
发表于 09-18 14:35 23次 阅读
基于单片机的直流数控电压源设计

基于单片机MSP430F449的宽带直流放大器设计---王鹏云

基于单片机MSP430F449的宽带直流放大器设计---王鹏云(电源技术版面费)-摘要:利用单片机M....
发表于 09-18 14:02 22次 阅读
基于单片机MSP430F449的宽带直流放大器设计---王鹏云

C8051F020单片机的直流稳压电源设计

C8051F020单片机的直流稳压电源设计(现代电源技术试卷)-基于C8051F020单片机的直流稳....
发表于 09-18 13:15 27次 阅读
C8051F020单片机的直流稳压电源设计

如何充分利用各种类型的断点

代码断点是最简单的断点。开发人员只需要选择C代码或者反汇编窗口中的ASM指令并设置断点即可。一旦断点....
发表于 09-18 11:03 864次 阅读
如何充分利用各种类型的断点

欧菲光上半年净利润下降93%,依靠新业务再次起步

电子发烧友网报道(文/莫婷婷)8月30日,离开果链的欧菲光发布了今年上半年财报。财报显示,该公司报告....
的头像 电子发烧友网 发表于 09-18 10:41 1226次 阅读

SAM系列MCU中的定时器的可能应用场景

SAM 器件上的各种定时器 简介 定时器是基于单片机的嵌入式应用中的基本模块。很难想象不使用定时器如....
的头像 Microchip微芯 发表于 09-18 10:39 256次 阅读

STC12C4052ADSTC单片机ADC采样C程序

STC12C4052ADSTC单片机ADC采样C程序(罗马仕电源技术偏执狂价格)-STC12C405....
发表于 09-18 10:27 12次 阅读
STC12C4052ADSTC单片机ADC采样C程序

DAC1230与单片机Atmega128的接口技术

DAC1230与单片机Atmega128的接口技术(开关电源技术课程设计报告)-文档为DAC1230....
发表于 09-17 15:45 29次 阅读
DAC1230与单片机Atmega128的接口技术

单片机 C8051F便携直流高压发生器的研制

单片机 C8051F便携直流高压发生器的研制(南方电网通信电源技术规范)-单片机 C8051F便携直....
发表于 09-17 15:02 25次 阅读
单片机 C8051F便携直流高压发生器的研制

基于C805IF单片机进行功率测量时的交直流采样比较

基于C805IF单片机进行功率测量时的交直流采样比较(电源技术总结大全)-基于C805IF单片机进行....
发表于 09-17 14:56 15次 阅读
基于C805IF单片机进行功率测量时的交直流采样比较

80C196MC单片机波形发生器原理及其在逆变电源中的应用

80C196MC单片机波形发生器原理及其在逆变电源中的应用(电源技术作业 2018年发布的答案)-文....
发表于 09-17 14:25 18次 阅读
80C196MC单片机波形发生器原理及其在逆变电源中的应用

基于单片机PID算法的直流电机测控系统

基于单片机PID算法的直流电机测控系统(电子电源技术与应用)-文档为基于单片机PID算法的直流电机测....
发表于 09-17 14:09 28次 阅读
基于单片机PID算法的直流电机测控系统

C语言教程:STL-for-each算法

C语言教程:STL-for-each算法(电源技术版面费5400)-文档为C语言教程:STL-for....
发表于 09-17 12:42 8次 阅读
C语言教程:STL-for-each算法

基于单片机的直流电机调速系统的设计讲解

基于单片机的直流电机调速系统的设计讲解(电源技术好中吗)-文档为基于单片机的直流电机调速系统的设计讲....
发表于 09-17 12:25 18次 阅读
基于单片机的直流电机调速系统的设计讲解