的前一教程包括关于开始时所需的工具和组件的讨论Arduino. 然而,在开始使用Arduino UNO(或任何其他Arduino板)以及在各种传感器、执行器和模块上进行硬件项目试验之前,先了解Arduino草图的基础知识以及Arduino兼容编码的嵌入式C非常重要。
术语“Arduino兼容编码”指所有可使用Arduino IDE编程和上传的Arduino和Arduino兼容微控制器板。
Arduino板是用“C”编程的。C是一种流行的系统编程语言,与其他高级编程语言相比,它在硬件上的执行时间最短。这就是为什么大多数操作系统和几种编程语言都是基于C语言构建的。
与其他微控制器非常相似,Arduino板中的AVR微控制器是用C的一个子集进行编程的。此类子集的通用术语是“嵌入式C”,因为它们适用于嵌入式控制器编程。Arduino所使用的编程语言是C语言的子集,它只包含Arduino IDE支持的标准C语言的特性。
这并不意味着ARDUINO C在任何地方都是滞后的,因为它是C的子集。C的大部分缺失特征可以很容易地被处理。而ARDUINO C是C和C++的混合,这意味着它是功能性的和面向对象的。
草图的结构
基本上,空白Arduino草图有两个功能:
1.设置()
2.循环()
当Arduino草图开始执行时,首先调用setup()函数。它只执行一次,并且必须用于初始化变量、设置pinmode、设置硬件组件、使用库等。
loop()函数位于setup()函数的旁边,它被无限迭代。任何其他用户定义的函数都必须在循环函数内调用。这就是微控制器在保持通电状态下,通过无限次重复代码来执行固件代码的方式。
如果用户有其他微控制器编程(如8051、AVR、图片或RX),有可能比较setup()函数内的代码之外的一个嵌入式C程序的主要()循环——这可能是写来初始化变量,使硬件设置。setup()和loop()函数具有void返回类型。
微控制器程序的结构必须与它的功能相同。一个微控制器必须“意识到”它的硬件环境,并知道如何与它交互。
微控制器只能通过以下五种方式与其他硬件部件或设备进行交互:
1.数字输入。这可以从其他设备以数字低或数字高接收。这些将是TTL逻辑电平或在应用于GPIO之前转换为TTL逻辑电平的电压。
2.数字输出。与其他设备相比,这可能是数字低或高输出。同样,输出将是TTL逻辑电平。
3.模拟输入。它可以“感知”来自其他设备的模拟电压。使用内置的模数转换器将所感知的电压转换为数字值。
4.模拟输出。它可以输出模拟电压到其他设备。这个模拟输出不是模拟电压,而是近似模拟电压水平的PWM信号。
5.串行通信。它可以根据标准的串行数据协议,如UART、USART、I2C、SPI、微线、单线和CAN等,与其他设备串行发送、接收或收发数据。与其他设备的串行通信可以是点对点(UART/USART)、半双工(I2C)或全双工(SPI)。
知道如何执行这五种类型的微控制器交互的用户可以与任何硬件接口。
Arduino程序或任何微控制器程序必须首先有初始化代码。这可能包括:
- 定义变量和常量
- 设置pinModes
- 设置ADC/PWM通道
- 串行通信的初始化设置
微控制器只是截取输入数据,根据编程指令进行处理,并通过其I/O外围设备输出数据。这意味着程序必须组织在可以处理输入数据、处理数据和控制输出的特定部分。
与桌面应用程序不同的是,µc程序不是为终止而设计的。这些程序不断地迭代,直到系统关闭或遇到故障。电源关闭后,Arduino或任何微控制器在“电源恢复”上复位,并从头开始执行其程序。
该程序包括在可能的情况下处理故障的代码。因此,任何Arduino程序都可以可视化为四个步骤的程序,如下所示:
1.初始化
2.输入-这应该包括数据验证和处理不正确或意外传入数据的代码
3.处理-这应该包括用于数据处理时引发的意外失败或异常的代码
4.输出-这可能包括验证预期结果的代码,如果接口设备也能与微控制器通信
评论
Arduino C中的注释与标准C中的注释类似。单行注释以一对斜杠(//)开始,以行尾(EOL)结束。多行注释以斜杠-星号对(/*)开始,以斜杠-星号对(*/)结束。
下面是单行和多行注释的例子:
//这是一个单行注释
/ *这
是
一个
多线
评论* /
Arduino C数据类型
Arduino C支持这些数据类型。
值得注意的是,“字符串”和“字符串对象”是不同的。字符串数据类型定义一个简单的字符数组,而字符串数据类型定义一个字符串对象。
Arduino C支持以下内置函数来操作字符串对象:
标识符
标识符是程序中的变量、函数、常量、类、方法和其他对象的名称。在Arduino C中,标识符应该只包含字母数字字符、破折号(-)或下划线(_)。标识符只能以下划线或字母开头。
关键字
关键字是不能用作标识符的常量、变量或函数名。
Arduino C有以下关键字:
变量
变量是程序中的引用,其值可以在程序执行期间更改。变量的名称必须是标识符。
例如,在Arduino C中,每个变量在代码中使用之前必须用指定的数据类型显式定义。
- 如果在代码语句中,一个变量已由数据类型实例化,但没有赋值给它,则称该变量已定义但未声明。
- 如果它在同一个语句或另一个语句中也被赋值,则称为已声明。
在运行时存储变量值的内存位置称为其“左值”或位置值。存储在变量内存位置的值称为其“右值”或寄存器值。
已定义的变量有左值但没有右值。声明的变量有左值和右值。
这是一个有效的变量定义:
int num1;
这是变量的有效声明:
Int num1 = 0;
还是……
int num1;
num1 = 0;
常数
常量是程序中的引用,其值在程序执行过程中不会改变。整数和浮点常数可以在Arduino C中使用常量关键字或#define指令.T
这是整数常量的有效声明示例:
const int RXPIN = 0;
一些内置常量是HIGH, LOW, INPUT, OUTPUT, INPUT_PULLUP, LED_BUILTIN, true和false。define指令允许在程序编译之前声明常量。
这是使用#define指令对常量的有效声明:
#定义LEDPin 3
运营商
这些操作员在Arduino C中可用:
1.算术-加法(+),乘法(*),减法(-),除法(/),模除法(%)
2.赋值(=)
3.比较- =(==),不等于(!=),小于(<),大于(>),小于等于(<=),大于等于(>=)
4.位–按位and(&)、按位or(|)、按位xor(^)、按位not(~)、左位移位(<<)和右位移位(>>)
5.布尔–和(&&),或(| |)和不(!)
6.复合-自增(++),自减(-),复合加法(+=),复合减法(-=),复合乘法(*=),复合除法(/=),复合位和(&=),复合位或(|=)
7.铸造–这些运算符将变量的当前类型转换为另一种类型。在变量出现之前,可以通过在括号中指示新的数据类型将类型转换应用于变量。
例如:
I = (int) f
8.sizeof—sizeof操作符以字节数返回数组的大小。
9三元(?)
10.指针-解引用操作符(*)和引用操作符(&)
语句和语句块
语句是处理器的一个完整的C指令。所有的C语句都以分号(;)结尾。语句块是用大括号({,})括起来的一组语句。一个语句块也被编译器视为单个语句。
运算符优先级
下表按降序显示了Arduino C中操作符的优先级:
控制结构
Arduino C支持以下控制结构:
- 如果
- 如果其他……
- 为
- 开关情况
- 虽然
- 做……
- 打破
- 继续
- 后藤
- 回来
用户定义函数
函数是可调用的语句块。程序员也可以编写自己的函数。函数是根据程序中语句块的功能组织代码的理想方法。
函数定义的语法如下:
function_type function_name(参数){
功能体
}
函数的类型可以是任何数据类型,包括void。该函数将通过return语句返回相同类型的值。该语句应该是函数体中的最后一个语句(在return语句之后执行的任何语句都将失败)。
函数在return语句之后退出。如果函数的类型是void,它不应该返回任何值。函数名可以是任何标识符,可能需要也可能不需要参数。参数是绑定到函数的变量。
函数体是一组语句。每当调用函数时,都会执行这个语句块。
这是一个有效的用户定义C函数示例:
整数加法输入(整数a、整数b、整数c){
返回a+b+c;
}
调用函数时,先调用函数名,然后再加上括号。任何位置参数必须在括号内传递。
这是调用函数的有效示例:
添加输入(5、2、14)
内置函数
Arduino支持几个内置功能,使Arduino板编程更加容易。常用的Arduino内置功能在此表中列出。
可变范围
变量的作用域是指变量在程序中的可见性和生存期。例如,变量如下:
- 只有在函数内部可见的才有局部作用域。
- 对程序的所有功能可见,并具有全局范围。
具有全局作用域的变量必须在任何函数(包括setup()和loop()函数)之外定义或声明。如果一个局部变量被定义为static(使用static关键字),那么它只对一个函数可见。但是,它不会被销毁,并且会在函数调用之后继续存在,在函数调用之间保留它的数据。
如果一个变量(局部的或全局的)被定义为volatile,那么它将被存储在RAM中而不是存储寄存器中。如果一个变量可能在代码的控制范围之外被更改(例如在服务例程中断的情况下),那么它必须被定义为volatile。
在下一个教程,我们将讨论如何执行数字输出。此外,通过Arduino的数字输出,我们将构建一个LED驱动器。
了下:Arduino,188app彩票