一起玩儿物联网人工智能小车(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); } |

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

相关推荐
wangjing_05224 小时前
C语言练习.if.else语句.strstr
c语言·开发语言
drinow6 小时前
【纸飞机串口调试工具】预设曲线名称
arm开发·驱动开发·单片机·mcu·dsp开发·fpga·iot
时光の尘7 小时前
C语言菜鸟入门·关键字·int的用法
c语言·开发语言·数据结构·c++·单片机·链表·c
Edward-tan7 小时前
c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除
c语言·开发语言·链表
武昌库里写JAVA7 小时前
一文读懂Redis6的--bigkeys选项源码以及redis-bigkey-online项目介绍
c语言·开发语言·数据结构·算法·二维数组
程序员与背包客_CoderZ8 小时前
C++设计模式——Abstract Factory Pattern抽象工厂模式
c语言·开发语言·c++·设计模式·抽象工厂模式
深圳市青牛科技实业有限公司 小芋圆8 小时前
【青牛科技】 GC2803:白色家电与安防领域的卓越驱动芯片可替代ULN2803
科技·单片机·嵌入式硬件·电脑·白色家电·电动卷帘门·工业设备
Mcworld8579 小时前
C语言:strcpy
c语言·开发语言
Arciab10 小时前
51单片机入门:LED灯控制(01)
单片机·led·51
人才程序员10 小时前
详解Qt QStorageInfo 存储信息类
c语言·开发语言·c++·后端·qt·界面