vlambda博客
学习文章列表

Arduino入门教程 第一章|C语言入门

初始Arduino语言


语言简介




Arduino 使用 C/C++编写程序,虽然 C++兼容 C 语言,但这是两种语言,C语言是一种面向过程的编程语言,C++是一种面向对象的编程语言。早期的Arduino 使用 C 语言编写,后来引进了面向对象的思想,目前最新的 Arduino 核心库采用 C 与 C++混合编写而成。

通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称 API)的集合。这些 API 是对更底层的单片机支持库进行二次封装所形成的。例如,使用 AVR 单片机的Arduino 的核心库是对 AVR-Libc(基于 GCC 的 AVR 支持库)的二次封装。传统开发方式中,你需要厘清每个寄存器的意义及之间的关系,然后通过配置多个寄存器来达到目的。而在 Arduino 中,使用了清楚明了的 API 替代繁杂的寄存器配置过程。


C语言基础教程



第 1 节 函数:setup()、 loop()
第 2 节 数据类型:变量、常量
第 3 节 运算符
第 4 节 表达式
第 5 节 数组:数据类型、数组名称
第 6 节 字符串:字符串名称[字符个数]、String 字符串名称
第 7 节 注释
第 8 节 顺序结构
第 9 节 选择结构
第 10 节 If 语句:简单分支结构、双分支结构、多分支结构 
第 11 节 switch...case 语句
第 12 节 循环结构:循环语句、循环控制语句

第1节|函数

Arduino 程序基本结构由 setup() 和 loop() 两个函数组成:

setup()
Arduino 控制器通电或复位后,即会开始执行 setup() 函数中的程序,该部分只会执行一次。
通常我们会在 setup() 函数中完成 Arduino 的初始化设置,如配置 I/O 口状态,初始化串口等操作。

loop()
在 setup() 函数中的程序执行完后,Arduino 会接着执行 loop() 函数中的程序。而 loop()函数是一个死循环,其中的程序会不断的重复运行。
通常我们会在 loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。

第2节|数据类型

在 C\C++语言程序中,对所有的数据都必须指定其数据类型。数据又有常量和变量之分。

变量
在程序中数值可变的量称为变量。其定义方法如下 
类型 变量名;
例如,定义一个整型变量 i:
int i;
我们可以在定义时为其赋值,也可以定义后,对其赋值,例如:
int i;
i=95;
int i=95;
两者是等效的。

常量
在程序运行过程中,其值不能改变的量,称为常量。常量可以是字符,也可以是数字,通常使用语句
 “ const 类型 常量名 = 常量值”定义常量。
还可以用宏定义来达到相同的目的。语句如下:
#define 宏名 值
如在 Arduino 核心库中已定义的常数 PI,即是使用
#define PI 3.1415926535897932384626433832795 定义的。
整型
整型即整数类型。Genuino 101 可使用的整型类型及取值范围如下
Arduino入门教程 第一章|C语言入门
浮点型
浮点数也就是常说的实数。在Arduino中有float 和 double 两种浮点类型,在Genuino 101中,float 类型占用4个字节(32 位)内存空间,double类型占用8 个字节(64 位)内存空间。 

浮点型数据的运算,速度较慢且可能有精度丢失。通常我们会把浮点型转换为整型来处理相关运算。如 9.8cm,我们通常把换算为 98mm 来计算。

字符型
字符型,即 char 类型,也是一种整形,占用一个字节内存空间,常用于存储字符变量。存储字符时,字符需要用单引号引用,如
char col=’C’;
字符都是以整数形式储存在 char 类型变量中的,数值与字符的对应关系,请参照 ASCII 码表。

布尔型
布尔型变量,即 boolean。它的值只有两个:false(假)和 true(真)。boolean会占用 1 个字节的内存空间。
Arduino入门教程 第一章|C语言入门

第3节|运算符

常见 C\C++运算符如下表:
Arduino入门教程 第一章|C语言入门

第4节|表达式

通过运算符将运算对象连接起来的式子,我们称之为表达式。如 5+3、a-b、1<9等。

第5节|数组

数组是由一组相同数据类型的数据构成的集合。数组概念的引入,使得在处理多个相同类型的数据时,程序更加清晰和简洁。其定义方式如下:

数据类型
如,定义一个有 5 个 int 型元素的数组:
int a[5];
如果要访问一个数组中的某一元素,需要使用
数组名称[下标]

数组名称
需要注意的是数组下标是从 0 开始编号的。如,将数组 a 中的第 1 个元素赋值为1:
a[0]=1;
你可以使用以上方法对数组赋值,也可以在数组定义时,对数组进行赋值。如:
int a[5]={1,2,3,4,5};
int a[5];
a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
是等效的。

第6节|字符串

字符串的定义方式有两种,一种是以字符型数组方式定义,另一种是使用 String类型定义。

char 字符串名称[字符个数]
使用字符型数组的方式定义,使用方法和数组一致,有多少个字符便占用多少个字节的存储空间。
大多数情况下,我们使用 String 类型来定义字符串,该类型中提供一些操作字符串的成员函数,使得字符串使用起来更为灵活。

String 字符串名称;
String abc;
即可定义一个名为 abc 的字符串。你可以在定义时为其赋值,或在定义后为其赋值,如
String abc;
abc = “Genuino 101”;
String abc = “Genuino 101”;
是等效的。
相较于数组形式的定义方法,使用 String 类型定义字符串会占用更多的存储空间。

第7节|注释

/*与*/之间的内容,及 // 之后的内容均为程序注释,使用它可以更好的管理代码。注释不会被编译到程序中,不影响程序的运行。为程序添加注释的方法有两种:
单行注释:
// 注释内容
多行注释:
/*注释内容 1
注释内容 2......
*/

第8节|顺序结构

顺序结构是三种基本结构之一,也是最基本、最简单的程序组织结构。在顺序结构中程序按语句先后顺序依次执行。一个程序或者一个函数,整体上是一个顺序结构,它是由一系列的语句或者控制结构组成,这些语句与结构都按先后顺序运行。
如图所示,虚线框内是一个顺序结构,其中 A、B 两个框是顺序执行的。即:在执行完 A 框中的操作后,接着会执行 B 框中的操作。

第9节|选择结构

选择结构又称选取结构或分支结构。在编程中,我们经常需要根据当前数据做出判断,决定下一步的操作。例如,Arduino 可以通过温度传感器检测出环境温度,在程序中对温度做出判断,如果温度过高,就发出警报信号,这时便会用到选择结构。

第10节|if语句

if 语句是最常用的选择结构实现方式,当给定表达式为真时,就会运行其后的语句,其有三种结构:
简单分支结构

if(表达式)
{
    语句; 
}


双分支结构
双分支结构增加了一个 else 语句,当给定表达式结果为假时,便运行 else 后的语句。

if(表达式)
{
    语句 1;
 }
else
{
    语句 2;
 }

多分支结构
使用多个 if 语句,可以形成多分支结构,用以判断多种不同的情况。

if(表达式 1)
 {
    语句 1;
}
else if(表达式 2)
 {
    语句 2;
}
else if(表达式 3) 
{
    语句 3;
}
else if(表达式 4)
 {
    语句 4;
 }
......


第11节|switch...case语句

处理比较复杂的问题,可能会存在有很多选择分支的情况,如果还使用 if...else的结构编写程序,会使程序显得冗长,且可读性差。此时我们可以使用 switch,其一般形式为:

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 结构退出。

第12节|循环结构

循环结构又称重复结构,即反复执行某一部分的操作。有两类循环结构,当(while)循环和直到(until)循环

循环语句
while 循环
while 循环是一种当型循环。当满足一定条件后,才会执行循环体中的语句,其一般形式为:

while(表达式)
{
    语句;
}


在某些 Arduino 应用中,你可能需要建立一个死循环(无限循环)。当 while 后的表达式永远为真或者为 1 时,便是一个死循环。

while(1)
{
    语句;
}


do...while 循环
do...while 与 while 循环不同,是一种直到循环,它会一直循环到给定条件不成立时为止。它会先执行一次 do 语句后的循环体,再判断是否进行下一次循环。

do
{
    语句;
}
while(表达式);


for 循环
for 循环比 while 循环更灵活,且应用广泛,它不仅适用于循环次数确定的情况,也适用于循环次数不确定的情况。while 和 do...while 都可以替换为 for 循环。一般形式为:

for(表达式 1;表达式 2;表达式 3)
{
    语句; 
}


一般情况下,表达式 1 为 for 循环初始化语句,表达式 2 为判断语句,表达式 3为增量语句。如
for (i=0; i<5; i++) { }

表示初始值 i 为 0,当 i 小于 5 时运行循环体中的语句,每循环完一次,i 自加 1,因此这个循环会循环 5 次。

循环控制语句
在循环结构中,都有一个表达式用于判断是否进入循环。通常情况下,当该表达式结果为 false(假)时,会结束循环。有时候,需要提前结束循环,或是已经达到了一定条件,可以跳过本次循环余下的语句,那么可以使用循环控制语句break 和 continue。

break 语句
break 语句只能用于 switch 多分支选择结构和循环结构中,使用它可以终止当前的选择结构或者循环结构,使程序转到后续的语句运行。break 一般会搭配 if 语句使用。一般形式为:

if(表达式)
{
    break;
}


continue 语句
continue 语句用于跳过本次循环中剩下的语句,并判断是否开始下一次循环。同样,continue一般搭配 if 语句使用一般形式为:
   
     
     
   
if(表达式)

     continue
}


931630584