一起玩儿物联网人工智能小车(ESP32)——24. 变量与函数(二)

摘要:本文介绍变量和函数的基本知识

在前面一篇中了解了变量,接着就来了解一下函数。函数是程序中的一个关键概念,它可以简化程序的编写,使代码更加模块化、可复用,提高程序的可读性。其实在之前已经多次遇到函数了,引脚设置、输出高低电平等等功能,都是通过函数调用来实现的。只不过,之前是使用别人写好的函数,接下来是要尝试自己写函数了。

每一个函数也有一个名字,也就是标识符。其命名的规则与变量名基本相同。函数一般由参数、函数体和返回值组成。参数是用来让函数进行不同的计算和操作,函数体是函数的主体语句,定义函数的执行流程及操作的语句,返回值则定义函数的执行结果,用来返回执行结果给调用者。函数包含一个或多个函数体,这些函数可以多次被调用,以提高程序的可重用性。一个最简单的函数如下图所示:

|---------------------------------------|
| int add(int a, int b) { return a+b; } |

第一行表明了函数的返回值是一个int类型的数据。函数的名字是add,函数有两个参数:a和b,这两个参数都是整数。

后边大括号中的内容就是函数体,在函数体中包含了实现预期功能的代码。

在Mixly中也支持函数,下面就在Mixly中创建一个add函数,然后将图形化的功能序列和它所生成的源代码对应起来,这样就应该可以理解是怎么开发一个函数了。

创建函数的功能在左侧的"函数"功能模块区,在这里选择一个有返回值的函数功能。然后,单击函数功能左上角的蓝色图标,在弹出的对话框中,增加两个整数参数,分别为a和b。然后再创建一个局部变量c,用来保存求和后的结果,然后将c做为该函数的返回值。开发完成后的add函数如下所示:

这个函数就实现了简单的将2个数据相加的功能。Mixly生成的源代码如下所示:

|-----------------------------------------------------------|
| int add(int a, int b) { int c = 0; c = a + b; return c; } |

这个和我之前的实现代码的区别就是定义了一个c来保存相加之后的结果,然后再将c作为返回值,返回给了函数的调用者。如果直接将a+b返回,那么生成的函数就和我之前的代码一模一样了。如下所示:

函数的调用方法很简单,有返回值的可以把返回值赋值给一个变量,或者作为参数传递给其他的函数。方法如下所示:

这就实现了计算5+10的功能,a和b的参数也可以是其他函数的返回值。对应的代码为:

|----------------------------|
| int c = 0; c = add(5, 10); |

没有返回值的函数,是不能将结果赋值给其他的变量或者作为另一个函数的参数的。接下来就来实现一个控制小车车轮的函数,在前面的学习中,已经知道了,控制小车车轮需要控制两个GPIO的状态来实现小车车轮的正转、反转和停止。接下来就定义一个wheel()函数,这个函数有3个参数,两个控制的GPIO引脚,一个表示运动的状态,对于运动状态,可以用0表示停止,1表示前进,2表示后退。接下来先生成一个有三个整数参数的wheel()函数,in1和in2是控制车轮转动的2个GPIO管脚。status表示车轮的运动状态。如下所示:

然后,用一个swtich功能来实现依据不同的status,对应不同的操作。swith后的变量与case后的值相等时,该case后的功能将被执行。所有case的值均不相等的时候,default后的语句将被执行。完成实现的函数如下所示:

通过上图可以看出,当status是1时,in1输出高电平,in2输出低电平。当status是2时,in1输出低电平,in2输出高电平。status不是1也不是2的时候,in1和in2都输出低电平。

这个wheel()函数对应的C语言源码如下:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| void wheel(int in1, int in2, int status) { switch (status) { case 1: pinMode(in1, OUTPUT); digitalWrite(in1,HIGH); pinMode(in2, OUTPUT); digitalWrite(in2,LOW); break; case 2: pinMode(in1, OUTPUT); digitalWrite(in1,LOW); pinMode(in2, OUTPUT); digitalWrite(in2,HIGH); break; default: pinMode(in1, OUTPUT); digitalWrite(in1,LOW); pinMode(in2, OUTPUT); digitalWrite(in2,LOW); break; } } |

这个代码可以很容易的和Mixly中的图形对应起来。在这里就不过多的解释了。接下来再来实现一个前进的函数,函数的名字叫forward()。在实现这个函数之前,先把控制车轮的8个GPIO都定义成全局变量,这样将来万一需要修改使用的GPIO管脚,我们只要修改全局变量的初值就可以了,整个运动的控制,只和这8个变量有关。这些变量的定义如下:

接下来就来实现小车的向前运动函数forward()。如下所示:

这个时候向前运动的函数,就比之前的简单多了,而且再实现其他方向的运动也很简单了,在这个函数的基础上,修改一下轮子的转动方向就可以了。Forward()函数的源代码如下所示:

|------------------------------------------------------------------------------------------------------------|
| void forward() { wheel(PIN1, PIN2, 1); wheel(PIN3, PIN4, 1); wheel(PIN4, PIN6, 1); wheel(PIN7, PIN8, 1); } |

只有短短的四行了,比之前实现一个方向的运动,要简单多了吧?

相关推荐
玩转以太网18 分钟前
基于 W55MH32Q-EVB 实现 FatFs 文件系统+FTP 服务器
服务器·单片机·物联网
wiyoo01 小时前
GD32VW553-IOT开发板测评 搭建环境到电灯(Q&A分享)
物联网·gd32
猫猫的小茶馆2 小时前
【STM32】CubeMX(十三):RT-THREAD
stm32·单片机·嵌入式硬件·mcu·mongodb·51单片机·智能硬件
工藤新一¹3 小时前
C/C++ 数据结构 —— 树(2)
c语言·数据结构·c++·二叉树··c/c++
源远流长jerry3 小时前
STM32之DMA详解
linux·网络·c++·stm32·单片机·嵌入式硬件
小小少年1236 小时前
基于51单片机的DS18B20大棚温度监控系统
stm32·单片机·嵌入式硬件
北极有牛6 小时前
keil添加文件夹
单片机
创思通信8 小时前
4G模块 EC200通过MQTT协议连接到阿里云
数据库·物联网·mqtt·阿里云·at·ec200a
kyle~8 小时前
C/C++---浮点数与整形的转换,为什么使用sqrt函数时,要给参数加上一个极小的小数(如1e-6)
c语言·开发语言·c++
逼子格9 小时前
【Protues仿真】定时器
单片机·嵌入式硬件·51单片机·定时器·硬件工程师·硬件工程师真题·at89c52