第3章〓Arduino使用的语言 3.1Arduino 使用的语言 Arduino使用C/C++编写程序。虽然C++兼容C语言,但却是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。 通常所说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。 3.2Arduino程序结构 如图31所示,Arduino程序的基本结构由setup()和loop()两个函数组成。 图31Arduino程序结构 1. setup() Arduino控制器通电或复位后,即会开始执行setup()函数中的程序,该程序只会执行一次。通常是在setup()函数中完成Arduino的初始化设置。 2. loop() setup()函数中的程序执行完毕后,Arduino会接着执行loop()函数中的程序。而loop()函数是一个死循环,其中的程序会不断地重复运行。通常是在loop()函数中完成程序的主要功能,如采集数据和驱动模块等。 3.3数字I/O口的操作函数 数字操作即为高低电平操作(0/1)。 pinMode(pin,mode) 设置引脚模式,mode有OUTPUT(输出),INPUT(输入)。 digitalWrite(pin,value) 设置引脚的输出电平(高低),value为高低电平(HIGH/LOW或1/0)。其中,低电平的电压为0V,高电平的电压为5V。 digitalRead(pin) 读取输入引脚的电平情况。当Arduino以5V供电时,会将范围为-0.5~1.5V的输入电压作为低电平识别,而将范围在3~55V的输入电压作为高电平识别。 在Arduino核心库中: OUTPUT被定义为1; INPUT被定义为0; HIGH被定义为1; LOW被定义为0。 3.4模拟I/O口的操作函数 在Arduino控制器中,编号前带有“A”的引脚是模拟输入引脚。 模拟I/O口可以将0~5V的电压转换为0~1023的整数形式表示。 analogRead(pin) 读取指定引脚的模拟值。pin必须是模拟输入引脚。 analogWrite(pin,value) 其中,pin是要输出PWM波(脉冲宽度调节)的引脚,value是PWM的脉冲宽度,范围为0~255。 3.5延时函数 使用延时函数delay()可以暂停程序,并通过参数来设定延时时间,用法如下: delay(); 此函数是毫秒级延时,参数的数据类型为unsigned long。 3.6常用的数据类型 1. char 字符型 字符型,即char类型,占用1字节的内存空间,主要用于存储字符变量。在存储字符时,字符需要用单引号引用,例如: Char col ='c' 字符都是以数字形式存储在char类型变量中的,数字与字符的对应关系可参照ASCII码表。 2. int 整型 整型即整数类型,取值范围为-32768~32767(-215~215-1)。 3. float 单精度浮点型 float即浮点型数据类型,浮点数其实就是通常所说的实数。 浮点型数据运算较慢且有一定误差,因此,通常会把浮点型转换为整型来处理。 3.7常用的控制语句 1. if 语句 if语句是最常用的选择结构实现方式,当给定的表达式为真时,就会运行其后的语句。 (1) 简单分支结构。 if (表达式) { 语句; } (2) 双分支结构。 if...else,当给定的表达式为假时,则运行else后的语句。 if(表达式) { 语句1; } else { 语句2; } (3) 多分支结构。 将if语句嵌套使用,即形成多分支结构,以判断多种不同的情况。 if(表达式1) { 语句1; } else if(表达式2) { 语句2; } else if(表达式3) { 语句3; } ...... 2. switch...case语句 当处理比较复杂的问题时,可能会存在有很多选择分支的情况,如果还使用if...else的结构编写程序,会使程序显得冗长,且可读性差。 此时可以使用switch...case语句,其一般形式为: switch(表达式) { case 常量表达式1; 语句1 break; case 常量表达式2; 语句2 break; case 常量表达式3; 语句3 break; ...... default : 语句 n break; } 需要注意的是,switch后的表达式的结果只能是整型或字符型,如果使用其他类型,则必须使用if语句。 switch结构会将switch语句后的表达式与case后的常量表达式进行比较,如果相符就运行常量表达式所对应的语句; 如果不符则会运行default后的语句; 如果不存在default部分,程序将直接退出switch结构。 在进入case判断并执行完相应程序后,一般要使用break语句退出switch结构。如果没有使用break语句,则程序会一直执行到有break的位置,才会退出或运行完switch结构再退出。 3. 循环语句 (1) while 循环。 while循环是一种“当”型循环。当满足一定条件后,才会执行循环体中的语句,其一般形式为: while(表达式) { 语句; } do...while 循环 do...while循环与while循环不同,是一种“直到”循环,它会一直循环到给定条件不成立为止。do...while会先执行一次do语句后的循环体,再判断是否进行下一次循环,即 do { 语句; } while(表达式); (2) for循环。 for循环比while循环更灵活,而且应用广泛。它不仅适用于循环次数确定的情况,也适用于循环次数不确定的情况。while和do...while都可以替换为for循环。其一般形式为: for(表达式1; 表达式2; 表达式3; ) { 语句; } 在一般情况下,表达式1为for循环初始化语句,表达式2为判断语句,表达式3为增量语句。 4. 循环控制语句 (1) break。 break语句只能用于switch多分支选择结构和循环结构中,使用它可以终止当前的选择结构或者循环结构,使程序转到后续的语句运行。break一般会搭配if语句使用,其一般形式为: if(表达式) { break; } (2) continue。 continue语句用于跳过本次循环中剩下的语句,并且判断是否开始下一次循环。同样,continue一般搭配if语句使用,其一般形式为: if(表达式) { continue; } 3.8相关语法 1. 注释 “/*”与“*/”之间的内容以及“//”之后的内容均为程序注释,使用它们可以更好地管理代码。注释不会被编译到程序中,因此不影响程序的运行。 为程序添加注释的方法有以下两种。 (1) 单行注释,语句为: //注释内容 (2) 多行注释,语句为: /* 注释内容1 注释内容2 ...... */ 2. define define即宏定义,即使用一个特定的标识符来代表一个字符串。宏定义的一般形式为: #define 标识符字符串 3. include “include”意为“包含”。若程序中使用#include语句包含了一个文件,例如#include,那么在预处理时,系统会将该语句替换成EEPROM.h文件中的实际内容,然后再对替换后的代码进行编译。 文件包含命令的一般形式为: #include<文件名> 或 #include "文件名" 两种形式的效果是一样的,只是当使用<文件名>形式时,系统会优先在Arduino库文件中寻找目标文件,若没有找到,再到当前Arduino项目的项目文件夹中查找。而使用"文件名"形式时,系统会优先在Arduino项目的项目文件夹中查找目标文件,若没有找到,再查找Arduino库文件。