最后20天后,突然懒惰,从今天开始重新开始20天
Arduino使用的语言是c语言。 以下内容是在学习一定的c语言的基础上,我们从Arduino的函数与C语言的不同之处,还有和89C51不同的地方
1、程序结构Arduino程序最基本的结构所需的代码是:
可以认为该程序由两个void函数“3358www.Sina.com/”和“3358www.Sina.com/”构成。 在Arduino中运行程序时,首先执行初始化部分,然后执行循环体部分,之后一直在循环体上重复执行。
初始化
示例: LED闪烁示例
void setup () pinmode ) 13、OUTPUT; //将数字输出端口13设为电平输出模式,执行一次就完成设定) }void loop () digital write (13,HIGH ); //将数字输出端口13设为高电平后,LED点亮(1000 ); 等待//digitalwrite(13,LOW )一段时间//将数字输出端口13置于低电平时,LED熄灭delay(1000 ); //稍等}注意:循环体
2、在变量定义上的示例中,多次操作了输出端口13。 在编程中,一般用变量定义需要多次重复使用的内容。 使用时,在必要的地方用变量名表示。 正确使用变量会使程序更简单、更灵活。
改变上面的例子,将13放入名为" n "的变量中
int n=13; //定义变量,将数字输出端口值“13”放入变量void setup () pinmode(n,OUTPUT )中。 //将数字输出端口13设为电平输出模式,执行一次即可完成设定(}void loop ) )数字写入(n,HIGH ); //将数字输出端口13设为高电平后,LED点亮(1000 ); //digitalwrite(n,LOW )等待一段时间//将数字输出端口13置于低电平时,LED熄灭delay(1000 ); //请稍等}这个地方和c语言一模一样,所以省略说明
3、函数和类库的pinMode ()给定数字输出端口设置电平模式;
digitalWrite (:设定某个数字输出端口的等级;
设置1个digitalWrite (参数pin、参数value )、pin )针脚; value :电平,常数为HIGH或LOW;
delay () :使程序停止一定时间。 单位为ms;
Serial类库函数begin (:设置串行通信的波特率;
Serial类库函数println (:通过串行端口发送一行字符
例如
voidsetup((serial.begin ) ) 9600; //通信波特率设置(}void loop ) ) serial.println ) ' Hello,PC!' ); //“你好,电脑! ”delay(1000; } 也就是说,我们在编程过程中,可以把需要运行一次的程序放入初始化部分,把需要循环运行的代码放入循环体部分Serial对象由Serial类库创建,默认情况下由Arduino包含并在编译期间自动添加。 因此,不需要在语句中向程序指定要添加的类库。
4、自定义函数函数与变量相同,程序编制人员可以自定义所需的函数。 Arduino语言已经具有几乎可以解决大多数所需函数的功能,但特殊实例可能需要函数来实现特定功能。
例如,如图4-5所示,有6个LED从左到右连接到7-2号引脚的装置。 该程序在开始执行时,得到3个变量LED1、LED2、LED3,为1~6之间的数字。 现在,需要编写程序的主要部分,点亮与给定变量值对应的编号的LED。
虽然只能通过switch语句或数组来解决,但Arduino没有合适的函数,所以只能进行定制。
定义此函数的代码如下所示。
voidled(intone,int two,int thr ) int LEDs [ ]={ 0,7,6,5,4,3,2 } /数组下标1~6分别对应于7~2,表示序号值对应引脚值pin mode () pinmode(5,OUTPUT ); pinmode(4,OUTPUT; pinmode(3,OUT
PUT); pinMode(2,OUTPUT); //以上代码设置2~7号因及哦啊为电平输出模式 digitalWrite(leds[one],HIGH); digitalWrite(leds[two],HIGH); digitalWrite(leds[two],HIGH);//设置各个要亮的LED对应引脚为高电平}将这段函数的代码放入程序后,在程序初始化或循环体部分使用这个函数
LED (LED1,LED2,LED3);便可以实现点亮对应小灯的效果
自定义函数的代码要注意以下两点:
不能放在初始化或循环体部分内。只能与初始化或循环体部分并列放置,一般是后面。大致如下
void setup(){}void loop(){}void LED(int one,int two,int thr){}自定义函数在程序中可以按需要定义,没有定义数量限制,其定义语法如下:
数值类型 函数名(参数类型 参数名,参数类型 参数名······){函数内部代码} 数值类型可以设置函数输出值类型,void表示没有输出值。函数名命名规则同变量名命名一致。参数可以按需要设置,可以设置多个或者不设置,设置参数规则同变量设置语法,但参数之间不能用分号分隔,要用逗号分隔。学了自定义函数后,我们可以发现,初始化和循环体两部分的语法和自定义函数的语法是一致的。其实,初始化部分和循环体部分就是定义两个类型为void的并且没有参数的函数,也可以分别称二者为:
setup()函数;loop()函数;Arduino运行时其实就是运行一遍setup函数和其他的自定义函数,然后循环运行loop函数,编写Arduino程序的过程就是把一系列语句整合入setup函数和loop函数中。
前面的函数都是没有输出值,也就是C语言中所谓的返回值,这里的输出值使用方法和C语言中一样
return 输出的数据;
这个语句可以在函数中的任意位置使用,但使用后意味着这个函数运行结束了。
例如下面的自定义函数的输出数据会在串口监视器中显示
void setup(){ Serial.begin(9600); //设置通行波特率}void loop(){ int value=myfuction(); Serial.println(value); delay(1000);} int myfuction(){ int val=9; return val;} 5、 自定义类库类库是由一系列变量和函数构成的集合,用于将复杂的功能封装成能简单调用的对象。类库初始化后叫做实例,编程中操作的各种实例称为对象。为了方便区分类库内的变量和函数与类库外的,我们把类库中的变量叫做属性,函数称为方法。
类库封装了一系列方法或者一些底层编程,所以使用起来非常简便且容易移植。IDE自带类库不需要安装即可调用,如果要用第三方的类库,则需要导入才可以使用。
导入流程:
获得类库大包文件在IDE界面Sketch(草图)菜单下展开“导入库”子菜单单机“添加库”选项,然后在弹出的窗口中选择类库安装。以下为一个简单的sldgb电码程序
int pin=13;void setup (){ pinMode(pin,OUTPUT);}void loop(){ dot();dot();dot(); dash();dash();dash(); dot();dot();dot(); delay(3000);}void dot(){ digitalWrite(pin,HIGH); delay(250); digitalWrite(pin,LOW); delay(250);}void dash(){ digitalWrite(pin,HIGH); delay(100); digitalWrite(pin,LOW); delay(250);}该代码中的以下部分可以整理到类库:
用于闪烁的dot()和dash()两个功能函数;用于指定使用哪个管脚的灯的pin变量;初始化管脚的pinMode()函数调用。一个类库至少包含两个文件:头文件(扩展名为“.h”)和源代码文件(扩展名为“.cpp”)。头文件包含类库的声明,即类库的功能说明列表,源代码文件包含类库的实际实现。
我们不妨给上面的类库起一个类库名Morse,那么需要在代码库目录里(项目文件下的libraries目录),创建一个名为“Morse”的子目录用于放置类库文件。新建头文件命名为“Morse.h”。
1.头文件头文件核心内筒,是一个封装了成员函数与相关变量的类声明:
class Morse //声明类和类名{ public; //表明以下为类库内、外部方可调用的公共成分 Morse(int pin); //构造函数 void dot(); void dash(); private; //表明以下为类库内部方可调用的私有成分 int _pin;}; //注意分好“:”不能忽略类里的函数与变量,其访问权限可以使public,也可以是private。类有个特殊的函数——构造函数,用于类实例化时执行一些工作,如不需要可以省略。构造函数的数据类型与类相同,且没有返回值。
头文件里还有些其他杂项。
如,为了使用标准类型和Arduino语言的常量,编写库时需要include导入这些类库(IDE会在编译时自动为ino格式程序文件加上这些#include语句,类库等文件则需要手动编写#include语句)例如
#include "Arduino.h"
这里和89c52那边有点不一样,那边是#include<reg.h>,注意一下就好。
最后,为了防止多次引用头文件造成的各种问题,还需要封装整个头文件结构:
#ifndef Morse_h#define Morse_h //类库声明主题#endif最终完成的头文件内容如下:
#ifndef Morse_h#define Morse_h#include "Arduino.h"class Morse { public; Morse(int pin); void dot(); void dash(); private; int _pin;}; #endif 2. 源代码文件Mrose.cpp开头仍是一些#include语句。这些语句让下面的程序能够使用Arduino的标准函数和刚才在Morse.h中声明的类。
#include "Arduino.h"#include "Morse.h"接下来是构造函数
明天再说啦