Arduino 语法手册

上传人:xgs****56 文档编号:8930392 上传时间:2020-04-02 格式:DOC 页数:74 大小:158KB
返回 下载 相关 举报
Arduino 语法手册_第1页
第1页 / 共74页
Arduino 语法手册_第2页
第2页 / 共74页
Arduino 语法手册_第3页
第3页 / 共74页
点击查看更多>>
资源描述
1 Arduino 语法手册 Arduino 的程序可以划分为三个主要部分 结构 变量 变量与常量 函数 结构部分 一 结构 1 1 setup 1 2 loop 二 结构控制 2 1 if 2 2 if else 2 3 for 2 4 switch case 2 5 while 2 6 do while 2 7 break 2 8 continue 2 9 return 2 10 goto 三 扩展语法 3 1 分号 3 2 花括号 3 3 单行注释 3 4 多行注释 3 5 define 3 6 include 四 算数运算符 4 1 赋值运算符 4 2 加 4 3 减 4 4 乘 4 5 除 4 6 模 五 比较运算符 5 1 等于 5 2 不等于 5 3 大于 5 5 大于等于 六 布尔运算符 6 1 void setup Serial begin 9600 pinMode buttonPin INPUT void loop 1 2 loop 在 setup 函数中初始化和定义了变量 然后执行 loop 函数 顾名思义 该函数在程 序运行过程中不断的循环 根据一些反馈 相应改变执行情况 通过该函数动态控制 Arduino 主控板 示例 int buttonPin 3 setup 中初始化串口和按键针脚 void setup beginSerial 9600 pinMode buttonPin INPUT loop 中每次都检查按钮 如果按钮被按下 就发送信息到串口 void loop if digitalRead buttonPin HIGH serialWrite H else serialWrite L delay 1000 2 二 结构控制 2 1 if if 条件判断语句 和 比较运算符 if 语句与比较运算符一起用于检测某个条件是否达成 如某输入值是否在特定值之上 等 if 语句的语法是 if someVariable 50 执行某些语句 本程序测试 someVariable 变量的值是否大于 50 当大于 50 时 执行一些语句 换 句话说 只要 if 后面括号里的结果 称之为测试表达式 为真 则执行大括号中的语句 称之为执行语句块 若为假 则跳过大括号中的语句 if 语句后的大括号可以省略 若省略大括号 则只有一条语句 以分号结尾 成为执行语句 if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin1 HIGH digitalWrite LEDpin2 HIGH 以上所有书写方式都正确 在小括号里求值的表达式 需要以下操作符 比较运算操作符 x y x 等于 y x y x 不等于 y x y x 大于 y x y x 大于等于 y 警告 注意使用赋值运算符的情况 如 if x 10 一个 表示的是赋值运算符 作用是 将 x 的值设为 10 将值 10 放入 x 变量的内存中 两个 表示的是比较运算符 如 if x 10 用于测试 x 和 10 是否相等 后面这个语句只有 x 是 10 时才为真 而前 面赋值的那个语句则永远为真 这是因为 C 语言按以下规则进行运算 if x 10 10 赋值给 x 只要非 0 的数赋值的 语句 其赋值表达式的值永远为真 因此 x 现在值为 10 此时 if 的测试表达式值为 10 该值永远为真 因为非 0 值永远为真 所以 if x 10 将永远为真 这就不是我们 运行 if 所期待的结果 另外 x 被赋值为 10 这也不是我们所期待的结果 3 if 的另外一种分支条件控制结构是 if else 形式 2 2 if else if else 是比 if 更为高级的流程控制语句 它可以进行多次条件测试 比如 检测模拟 输入的值 当它小于 500 时该执行哪些操作 大于或等于 500 时执行另外的操作 代码如 下 if pinFiveInput 500 执行 A 操作 else 执行 B 操作 else 可以进行额外的 if 检测 所以多个互斥的条件可以同时进行检测 测试将一个一个进行下去 直到某个测试结果为真 此时该测试相关的执行语句块将 被运行 然后程序就跳过剩下的检测 直接执行到 if else 的下一条语句 当所有检测都为 假时 若存在 else 语句块 将执行默认的 else 语句块 注意 else if 语句块可以没有 else 语句块 else if 分支语句的数量无限制 if pinFiveInput 1000 执行 B 操作 else 执行 C 操作 另外一种进行多种条件分支判断的语句是 switch case 语句 2 3 for for 语句 描述 for 语句用于重复执行一段在花括号之内的代码 通常使用一个增量计数器计数并终止 循环 for 语句用于重复性的操作非常有效 通常与数组结合起来使用来操作数据 引脚 for 循环开头有 3 个部分 初始化 条件 增量计数 语句 4 初始化 只在循环开始执行一次 每次循环 都会检测一次条件 如果条件为真 则执行语句和 增量计数 之后再检测条件 当条件为假时 循环终止 例子 用 PWM 引脚将 LED 变暗 int PWMpin 10 将一个 LED 与 47 电阻串联接在 10 脚 void setup 无需设置 void loop for int i 0 i 255 i analogWrite PWMpin i delay 10 编程提示 C 语言的 for 循环语句比 BASIC 和其他电脑编程语言的 for 语句更灵活 除了分号以外 其他 3 个元素都能省略 同时 初始化 条件 增量计算可以是任何包括无关变量的有效 C 语句 任何 C 数据类型包括 float 这些不寻常的 for 语句可能会解决一些困难的编程问 题 例如 在增量计数中使用乘法可以得到一个等比数列 for int x 2 x 1 i i x analogWrite PWMpin i if i 255 x 1 在峰值转变方向 delay 10 2 4 switch case switch case 语句 和 if 语句相同 switch case 通过程序员设定的在不同条件下执行的代码控制程序的 流程 特别地 switch 语句将变量值和 case 语句中设定的值进行比较 当一个 case 语句中 的设定值与变量值相同时 这条 case 语句将被执行 关键字 break 可用于退出 switch 语句 通常每条 case 语句都以 break 结尾 如果没有 break 语句 switch 语句将会一直执行接下来的语句 一直向下 直到遇见一个 break 或 者直到 switch 语句结尾 例子 switch var case 1 当 var 等于 1 时 执行一些语句 break case 2 当 var 等于 2 时 执行一些语句 break default 如果没有任何匹配 执行 default default 可有可不有 语法 switch var case label 声明 break case label 声明 break 6 default 声明 参数 var 用于与下面的 case 中的标签进行比较的变量值 label 与变量进行比较的值 2 5 while while 循环 描述 while 循环会无限的循环 直到括号内的判断语句变为假 必须要有能改变判断语句的 东西 要不然 while 循环将永远不会结束 这在您的代码表现为一个递增的变量 或一个 外部条件 如传感器的返回值 语法 while 表达 语句 参数 表达 为真或为假的一个计算结果 例子 var 0 while var 200 重复一件事 200 遍 var 2 6 do while do while 循环与 while 循环运行的方式是相近的 不过它的条件判断是在每个循环的 最后 所以这个语句至少会被运行一次 然后才被结束 do 语句 while 测试条件 例子 do delay 50 等待传感器稳定 X readSensors 检查传感器取值 while X 100 当 x 小于 100 时 继续运行 7 2 7 break break 用于退出 do for while 循环 能绕过一般的判断条件 它也能够用于退出 switch 语句 例子 for x 0 x threshold 超出探测范围 x 0 break delay 50 2 8 continue continue 语句跳过当前循环中剩余的迭代部分 do for 或 while 它通过检查循 环条件表达式 并继续进行任何后续迭代 例子 for x 0 x 40 else return 0 return 关键字可以很方便的测试一段代码 而无需 comment out 注释掉 大段的可 能存在 bug 的代码 void loop 写入漂亮的代码来测试这里 return 剩下的功能异常的程序 return 后的代码永远不会被执行 2 10 goto 程序将会从程序中已有的标记点开始运行 语法 label goto label 从 label 处开始运行 提示 不要在 C 语言中使用 goto 编程 某些 C 编程作者认为 goto 语句永远是不必要的 但 用得好 它可以简化某些特定的程序 许多程序员不同意使用 goto 的原因是 通过毫无 节制地使用 goto 语句 很容易创建一个程序 这种程序拥有不确定的运行流程 因而无法 进行调试 的确在有的实例中 goto 语句可以派上用场 并简化代码 例如在一定的条件用 if 语句 来跳出高度嵌入的 for 循环 例子 for byte r 0 r 1 g for byte b 0 b 250 goto bailout 更多的语句 bailout 9 三 扩展语法 3 1 分号 用于表示一句代码的结束 例子 int a 13 提示 在每一行忘记使用分号作为结尾 将导致一个编译错误 错误提示可能会清晰的指向 缺少分号的那行 也可能不会 如果弹出一个令人费解或看似不合逻辑的编译器错误 第 一件事就是在错误附近检查是否缺少分号 3 2 花括号 大括号 也称为 括号 或 大括号 是 C 编程语言中的一个重要组成部分 它们被 用来区分几个不同的结构 下面列出的 有时可能使初学者混乱 左大括号 必须与一个右大括号 形成闭合 这是一个常常被称为括号平衡的 条件 在 Arduino IDE 集成开发环境 中有一个方便的功能来检查大括号是否平衡 只需 选择一个括号 甚至单击紧接括号的插入点 就能知道这个括号的 伴侣括号 目前此功能稍微有些错误 因为 IDE 会经常会认为在注释中的括号是不正确的 对于初学者 以及由 BASIC 语言转向学习 C 语言的程序员 经常不清楚如何使用括号 毕竟 大括号还会在 return 函数 endif 条件句 以及 loop 函数 中被使用到 由于大括号被用在不同的地方 这有一种很好的编程习惯以避免错误 输入一个大括 号后 同时也输入另一个大括号以达到平衡 然后在你的括号之间输入回车 然后再插入 语句 这样一来 你的括号就不会变得不平衡了 不平衡的括号常可导致许多错误 比如令人费解的编译器错误 有时很难在一个程序 找到这个错误 由于其不同的用法 括号也是一个程序中非常重要的语法 如果括号发生 错误 往往会极大地影响了程序的意义 大括号中的主要用途 功能 void myfunction datatype argument statements s 循环 while boolean expression statement s do statement s while boolean expression 10 for initialisation termination condition incrementing expr statement s 条件语句 if boolean expression statement s else if boolean expression statement s else statement s 3 3 单行注释 Comments 注释 注释用于提醒自己或他人程序是如何工作的 它们会被编译器忽略掉 也不会传送给 处理器 所以它们在 Atmega 芯片上不占用体积 注释的唯一作用就是使你自己理解或帮 你回忆你的程序是怎么工作的或提醒他人你的程序是如何工作的 编写注释有两种写法 例子 x 5 这是一条注释斜杠后面本行内的所有东西是注释 这是多行注释 用于注释一段代码 if gwb 0 在多行注释内可使用单行注释 x 3 但不允许使用新的多行注释 这是无效的 别忘了注释的结尾符号 它们是成对出现的 小提示 当测试代码的时候 注释掉一段可能有问题的代码是非常有效的方法 这能使这段代 码成为注释而保留在程序中 而编译器能忽略它们 这个方法用于寻找问题代码或当编译 器提示出错或错误很隐蔽时很有效 3 4 多行注释 Comments 注释 注释用于提醒自己或他人程序是如何工作的 它们会被编译器忽略掉 也不会传送给 处理器 所以它们在 Atmega 芯片上不占用体积 注释的唯一作用就是使你自己理解或帮 你回忆你的程序是怎么工作的或提醒他人你的程序是如何工作的 编写注释有两种写法 例子 x 5 这是一条注释斜杠后面本行内的所有东西是注释 11 这是多行注释 用于注释一段代码 if gwb 0 在多行注释内可使用单行注释 x 3 但不允许使用新的多行注释 这是无效的 别忘了注释的结尾符号 它们是成对出现的 小提示 当测试代码的时候 注释掉一段可能有问题的代码是非常有效的方法 这能使这段代 码成为注释而保留在程序中 而编译器能忽略它们 这个方法用于寻找问题代码或当编译 器提示出错或错误很隐蔽时很有效 3 5 define define 是一个很有用的 C 语法 它允许程序员在程序编译之前给常量命名 在 Arduino 中 定义的常量不会占用芯片上的任何程序内存空间 在编译时编译器会用事先定 义的值来取代这些常量 然而这样做会产生一些副作用 例如 一个已被定义的常量名已经包含在了其他常量 名或者变量名中 在这种情况下 文本将被 defined 定义的数字或文本所取代 通常情况下 优先考虑使用 const 关键字替代 define 来定义常量 Arduino 拥有和 C 相同的语法规范 语法 define 常量名 常量值 注意 是必须的 例子 define ledPin 3 在编译时 编译器将使用数值 3 取代任何用到 ledPin 的地方 提示 在 define 声明后不能有分号 如果存在分号 编译器会抛出语义不明的错误 甚至 关闭页面 define ledPin 3 这是一种错误写法 类似的 在 define 声明中包含等号也会产生语义不明的编译错误从而导致关闭页面 define ledPin 3 这是一种错误写法 3 6 include include 用于调用程序以外的库 这使得程序能够访问大量标准 C 库 也能访问用于 arduino 的库 AVR C 库 Arduino 基于 AVR 标准语法 语法手册请点击这里 注意 include 和 define 一样 不能在结尾加分号 如果你加了分号编译器将会报错 例子 此例包含了一个库 用于将数据存放在 flash 空间内而不是 ram 内 这为动态内存节 约了空间 大型表格查表更容易实现 include prog uint16 t myConstants PROGMEM 0 21140 702 9128 0 25764 8456 0 0 0 0 0 0 0 0 29810 8968 29762 29762 4500 四 算数运算符 12 4 1 赋值运算符 赋值运算符 单等号 赋值运算符 单等号 将等号右边的数值赋值给等号左边的变量 在 C 语言中 单等号被称为赋值运算符 它与数学上的等号含义不同 赋值运算符告 诉单片机 将等号的右边的数值或计算表达式的结果 存储在等号左边的变量中 例子 int sensVal 声明一个名为 sensVal 的整型变量 senVal analogRead 0 将模拟引脚 0 的输入电压存储在 SensVal 变量中 编程技巧 要确保赋值运算符 符号 左侧的变量能够储存右边的数值 如果没有大到足以容纳 右边的值 存储在变量中的值将会发生错误 不要混淆赋值运算符 单等号 与比较运算符 双等号 认为这两个表达式是 相等的 4 2 加 加 减 乘 除 描述 这些运算符返回两个操作数的和 差 乘积 商 这些运算是根据操作数的数据类型来计 算的 比如 9 和 4 都是 int 类型 所以 9 4 结果是 2 这也就代表如果运算结果比数据类型所 能容纳的范围要大的话 就会出现溢出 例如 1 加上一个整数 int 类型 32 767 结果变成 32 768 如果操作数是不同类型的 结果是 更大 的那种数据类型 如果操作数中的其中 一个是 float 类型或者 double 类型 就变成了浮点数运算 例子 y y 3 x x 7 i j 6 r r 5 Syntax result value1 value2 result value1 value2 result value1 value2 result value1 value2 Parameters value1 任何常量或者变量 value2 任何常量或者变量 编程小提示 整型常量的默认值是 int 类型 所以一些整型常量 定义中 的计算会导致溢出 比如 60 1000 会得到一个负数结果 那么 if 60 1000 0 if 得到的是一个 false 值 在选择变量的数据类型时 一定要保证变量类型的范围要足够大 以至于能容纳下你的运 算结果 要知道你的变量在哪个点会 翻身 两个方向上都得注意 如 0 1 或 0 32768 一些数学上的分数处理 要用浮点数 但其缺点是 占用字节长度大 运算速度慢 13 使用类型转换符 例如 int myFloat 将一个变量强制转换为 int 类型 4 3 减 详见 4 2 加 4 4 乘 详见 4 2 加 4 5 除 详见 4 2 加 4 6 取模 描述 一个整数除以另一个数 其余数称为模 它有助于保持一个变量在一个特定的范围 例 如数组的大小 语法 结果 被除数 除数 参数 被除数 一个被除的数字 除数 一个数字用于除以其他数 返回 余数 模 举例 X 7 5 X 为 2 X 9 5 X 为 4 X 5 5 X 为 0 X 4 5 X 为 4 示例代码 通过循环计算 1 到 10 的模 int values 10 int i 0 void setup void loop values i analogRead 0 i i 1 10 取模运算 提示 模运算符对浮点数不起作用 14 五 比较运算符 5 1 等于 if 条件判断语句 和 比较运算符 if 语句与比较运算符一起用于检测某个条件是否达成 如某输入值是否在特定值之上 等 if 语句的语法是 if someVariable 50 执行某些语句 本程序测试 someVariable 变量的值是否大于 50 当大于 50 时 执行一些语句 换 句话说 只要 if 后面括号里的结果 称之为测试表达式 为真 则执行大括号中的语句 称之为执行语句块 若为假 则跳过大括号中的语句 if 语句后的大括号可以省略 若省略大括号 则只有一条语句 以分号结尾 成为执行语句 if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin HIGH if x 120 digitalWrite LEDpin1 HIGH digitalWrite LEDpin2 HIGH 以上所有书写方式都正确 在小括号里求值的表达式 需要以下操作符 比较运算操作符 x y x 等于 y x y x 不等于 y x y x 大于 y x y x 大于等于 y 警告 注意使用赋值运算符的情况 如 if x 10 一个 表示的是赋值运算符 作用是 将 x 的值设为 10 将值 10 放入 x 变量的内存中 两个 表示的是比较运算符 如 if x 10 用于测试 x 和 10 是否相等 后面这个语句只有 x 是 10 时才为真 而前 面赋值的那个语句则永远为真 这是因为 C 语言按以下规则进行运算 if x 10 10 赋值给 x 只要非 0 的数赋值的 语句 其赋值表达式的值永远为真 因此 x 现在值为 10 此时 if 的测试表达式值为 10 该值永远为真 因为非 0 值永远为真 所以 if x 10 将永远为真 这就不是我们 运行 if 所期待的结果 另外 x 被赋值为 10 这也不是我们所期待的结果 15 if 的另外一种分支条件控制结构是 if else 形式 5 2 不等于 详见 5 1 等于 5 3 大于 详见 5 1 等于 5 5 大于等于 详见 5 1 等于 六 布尔运算符 6 1 二进制 0000000001011100 int b 101 二进制 0000000001100101 int c a 结果 0000000001000100 或 10 进制的 68 a 和 b 的 16 位每位都进行按位与计算 计算结果存在 c 中 二进制结果是 01000100 十进制结果是 68 按位与最常见的作用是从整型变量中选取特定的位 也就是屏蔽 见下方的例子 按位或 按位或操作符在 C 中是 和 二进制 0000000001011100 int b 101 二进制 0000000001100101 int c a b 结果 0000000001111101 或十进制的 125 示例程序 按位与和按位或运算常用于端口的读取 修改 写入 在微控制器中 一个端口是一个 8 位数字 它用于表示引脚状态 对端口进行写入能同时操作所有引脚 PORTD 是一个内置的常数 是指 0 1 2 3 4 5 6 7 数字引脚的输出状态 如果某一位为 1 着对应管脚为 HIGH 此引脚需要先用 pinMode 命令设置为输出 因此如果我们这样 写 PORTD B00110001 则引脚 2 3 7 状态为 HIGH 这里有个小陷阱 我们可能同时更 改了引脚 0 1 的状态 引脚 0 1 是 Arduino 串行通信端口 因此我们可能会干扰通信 我们的算法的程序是 读取 PORT 并用按位与清除我们想要控制的引脚 用按位或对 PORTD 和新的值进行运算 int i 计数器 int j void setup DDRD DDRD B11111100 设置引脚 2 7 的方向 0 1 脚不变 xx 00 xx 效果和 pinMode pin OUTPUT 设置 2 7 脚为输出一样 serial begin 9600 void loop for i 0 i 64 i PORTD PORTD 清除 2 7 位 0 1 保持不变 xx 将变量左移为 2 7 脚 避免 0 1 脚 PORTD PORTD j 将新状态和原端口状态结合以控制 LED 脚 18 Serial println PORTD BIN 输出掩盖以便调试 delay 100 按位异或 C 中有一个不常见的操作符叫按位异或 也叫做 XOR 通常读作 eks or 按位异 或操作符用 表示 此操作符和按位或 很相似 区别是如果两个位都为 1 则结果为 0 0 0 1 1 运算元 1 0 1 0 1 运算元 2 0 1 1 0 运算元 1 运算元 2 返回的结果 按位异或的另一种解释是如果两个位值相同则结果为 0 否则为 1 下面是一个简单的代码示例 int x 12 二进制 1100 int y 10 二进制 1010 int z x y 二进制 0110 或十进制 6 Blink Pin 5 演示 异或 void setup DDRD DDRD B00100000 设置数字脚 5 设置为输出 serial begin 9600 void loop PORTD PORTD B00100000 反转第 5 位 数字脚 5 其他保持不变 delay 100 8 2 按位或 详见 8 1 二进制 0000000001100111 19 int b a 二进制 1111111110011000 104 你可能会惊讶地看到结果为像 104 这样的数字 这是因为整数型变量的最高位 即所 谓的符号位 如果最高位是 1 这个数字将变为负数 这个正数和负数的编码被称为补 想了解更多信息 请参考 Wikipedia 文章 two s complement 顺便说一句 有趣的是 要注意对于任何整数型操作数 X X 和 X 1 是相同的 有时 对带有符号的整数型操作数进行位操作可以造成一些不必要的意外 8 5 左移位运算符 bitshift left 描述 出自 Playground 的 The Bitmath Tutorial 在 C 语言中有两个移位运算符 左移位运算 符 和右移运算符 这些操作符可使左运算元中的某些位移动右运算元中指定的位 数 想了解有关位的更多信息可以点击 这里 语法 variable number of bits variable number of bits 参数 variable byte int long number of bits integer 32 例子 int a 5 二进制数 0000000000000101 int b a 3 二进制数 0000000000000101 或者说回到开始时的 5 当你将 x 左移 y 位时 x y x 中最左边的 y 位会逐个逐个的丢失 int a 5 二进制 0000000000000101 int b a 14 二进制 0100000000000000 101 中最左边的 1 被丢弃 如果你确定位移不会引起数据溢出 你可以简单的把左移运算当做对左运算元进行 2 的右运算元次方的操作 例如 要产生 2 的次方 可使用下面的方式 1 0 1 1 1 2 1 2 4 1 3 8 1 8 256 1 9 512 10 3 二进制 1111111111111110 这种结果 被称为符号扩展 往往不是你想要的行为 你可能希望左边被移入的数是 0 右移操作对无符号整型来说会有不同结果 你可以通过数据强制转换改变从左边移入的 20 数据 X 16 二进制 1111111111110000 int y unsigned int x 3 二进制 0001111111111110 如果你能小心的避免符号扩展问题 你可以将右移操作当做对数据除 2 运算 例如 INT 1000 Y X 3 8 1000 1000 整除 8 使 y 125 8 6 右移位运算符 详见 8 5 左移位运算符 九 复合运算符 9 1 递增 递增 递减 描述 递增或递减一个变量 语法 x x 自增 1 返回 x 的旧值 x x 自增 1 返回 x 的新值 x x 自减 1 返回 x 的旧值 x x 自减 1 返回 x 的新值 参数 x int 或 long 可能是 unsigned 返回 变量进行自增 自减操作后的原值或新值 例子 x 2 y x 现在 x 3 y 3 y x 现在 x 2 y 还是 3 9 2 递减 详见 9 1 递增 9 3 复合加 描述 执行常量或变量与另一个变量的数学运算 等运算符是以下扩展语法的速记 语法 X Y 相当于表达式 X X Y X Y 相当于表达式 X X Y X Y 相当于表达式 X X Y 21 X Y 相当于表达式 X X Y 参数 X 任何变量类型 Y 任何变量类型或常数 例子 x 2 x 4 x 现在等于 6 x 3 x 现在等于 3 x 10 x 现在等于 30 x 2 x 现在等于 15 9 4 复合减 详见 9 3 复合加 9 5 复合乘 详见 9 3 复合加 9 6 复合除 详见 9 3 复合加 9 6 等价于 x x 参数 x char int 或 long 类型变量 Y char int 或 long 类型常量 例如 首先 回顾一下按位与 运算符 0 0 1 1 运算元 1 0 1 0 1 运算元 2 0 0 0 1 运算元 1 因此 任何位与 1 进行 按位与运算 后保持不变 myByte B11111111 myByte 注意 因为我们用位操作符来操作位 所以使用二进制的变量会很方便 如果这些数 值是其他值将会得到同样结果 只是不容易理解 同样 B00000000 是为了标示清楚 0 在任何进制中都是 0 恩 有些哲学的味道 因此 清除 置零 变量的任意位 0 和 1 而保持其余的位不变 可与常量 B11111100 进行复合运算按位与 1 0 1 0 1 0 1 0 变量 22 1 1 1 1 1 1 0 0 mask 1 0 1 0 1 0 0 0 变量不变 位清零 将变量替换为 x 可得到同样结果 X X X X X X X X 变量 1 1 1 1 1 1 0 0 mask X X X X X X 0 0 变量不变 位清零 同理 myByte 10101010 myByte B1111100 B10101000 9 8 复合运算按位或 描述 复合按位或操作符 经常用于变量和常量 设置 设置为 1 尤其是变量中的 某一位 语法 x y 等价于 x x y 参数 x char int 或 long 类型 y 整数 int 或 long 类型 例如 首先 回顾一下 OR 运算符 0 0 1 1 运算元 1 0 1 0 1 运算元 2 0 1 1 1 运算元 1 运算元 2 返回的结果 如果变量 myByte 中某一位与 0 经过按位或运算后不变 myByte B00000000 myByte 与 1 经过或运算的位将变为 1 myByte B11111111 B11111111 因此 设置变量的某些位为 0 和 1 而变量的其他位不变 可与常量 B00000011 进行 按位与运算 1 0 1 0 1 0 1 0 变量 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 变量保持不变 位设置 接下来的操作相同 只是将变量用 x 代替 X X X X X X X X 变量 0 0 0 0 0 0 1 1 mask 23 X X X X X X 1 1 变量保持不变 位设置 同上 myByte B10101010 myByte B00000011 B10101011 变量部分 十 常量 10 1 HIGH LOW 引脚电压定义 引脚电压定义 HIGH 和 LOW 当读取 read 或写入 write 数字引脚时只有两个可能的值 HIGH 和 LOW HIGH HIGH 参考引脚 的含义取决于引脚 pin 的设置 引脚定义为 INPUT 或 OUTPUT 时 含义有所不同 当一个引脚通过 pinMode 被设置为 INPUT 并通过 digitalRead 读取 read 时 如果当前引脚的电压大于等于 3V 微控制器将会返回为 HIGH 引脚也可以 通过 pinMode 被设置为 INPUT 并通过 digitalWrite 设置为 HIGH 输入引脚的值将被一个 内在的 20K 上拉电阻 控制 在 HIGH 上 除非一个外部电路将其拉低到 LOW 当一个引脚 通过 pinMode 被设置为 OUTPUT 并 digitalWrite 设置为 HIGH 时 引脚的电压应在 5V 在 这种状态下 它可以 输出电流 例如 点亮一个通过一串电阻接地或设置为 LOW 的 OUTPUT 属性引脚的 LED LOW LOW 的含义同样取决于引脚设置 引脚定义为 INPUT 或 OUTPUT 时含义有所不同 当 一个引脚通过 pinMode 配置为 INPUT 通过 digitalRead 设置为读取 read 时 如果当前 引脚的电压小于等于 2V 微控制器将返回为 LOW 当一个引脚通过 pinMode 配置为 OUTPUT 并通过 digitalWrite 设置为 LOW 时 引脚为 0V 在这种状态下 它可以 倒灌 电 流 例如 点亮一个通过串联电阻连接到 5V 或到另一个引脚配置为 OUTPUT HIGH 的 的 LED 10 2 INPUT OUTPUT 数字引脚 Digital pins 定义 数字引脚 Digital pins 定义 INPUT 和 OUTPUT 数字引脚当作 INPUT 或 OUTPUT 都可以 用 pinMode 方法使一个数字引脚从 INPUT 到 OUTPUT 变化 引脚 Pins 配置为输入 Inputs Arduino Atmega 引脚通过 pinMode 配置为 输入 INPUT 即是将其配置在一个高 阻抗的状态 配置为 INPUT 的引脚可以理解为引脚取样时对电路有极小的需求 即等效于 在引脚前串联一个 100 兆欧姆 Megohms 的电阻 这使得它们非常利于读取传感器 而不 是为 LED 供电 引脚 Pins 配置为输出 Outputs 引脚通过 pinMode 配置为 输出 OUTPUT 即是将其配置在一个低阻抗的状态 这意味着它们可以为电路提供充足的电流 Atmega 引脚可以向其他设备 电路提供 提供正电流 positive current 或倒灌 提供负电流 negative current 达 40 毫安 mA 的 24 电流 这使得它们利于给 LED 供电 而不是读取传感器 输出 OUTPUT 引脚被短路的接 地或 5V 电路上会受到损坏甚至烧毁 Atmega 引脚在为继电器或电机供电时 由于电流不 足 将需要一些外接电路来实现供电 10 3 true false 逻辑层定义 逻辑层定义 true 与 false 布尔 Boolean 常量 在 Arduino 内有两个常量用来表示真和假 true 和 false false 在这两个常量中 false 更容易被定义 false 被定义为 0 零 true true 通常被定义为 1 这是正确的 但 true 具有更广泛的定义 在布尔含义 Boolean sense 里任何 非零 整数 为 true 所以在布尔含义内 1 2 和 200 都定义为 ture 需要 注意的是 true 和 false 常量 不同于 HIGH LOW INPUT 和 OUTPUT 需要全部小写 10 4 integer constants 整数常量 整数常量是直接在程序中使用的数字 如 123 默认情况下 这些数字被视为 int 但 你可以通过 U 和 L 修饰符进行更多的限制 见下文 通常情况下 整数常量默认为十进 制 但可以加上特殊前缀表示为其他进制 进制 例子 格式 备注 10 十进制 123 无 2 二进制 B1111011 前缀 B 只适用于 8 位的值 0 到 255 字符 0 1 有效 8 八进制 0173 前缀 0 字符 0 7 有效 16 十六进制 0 x7B 前缀 0 x 字符 0 9 A F A F 有效 小数是十进制数 这是数学常识 如果一个数没有特定的前缀 则默认为十进制 二进制以 2 为基底 只有数字 0 和 1 是有效的 示例 101 和十进制 5 等价 1 2 2 0 2 1 1 2 0 二进制格式只能是 8 位的 即只能表示 0 255 之间的数 如果输入二进制数更方便的 话 你可以用以下的方式 myInt B11001100 256 B10101010 B11001100 作为高位 八进制是以 8 为基底 只有 0 7 是有效的字符 前缀 0 数字 0 表示该值为八进 制 0101 等同于十进制数 65 1 8 2 0 8 1 1 警告 八进制数 0 前缀很可能无意产生很难发现的错误 因为你可能不小心在常量前加 了个 0 结果就悲剧了 十六进制以 16 为基底 有效的字符为 0 9 和 A F 十六进制数用前缀 0 x 数字 0 字母爱克斯 表示 请注意 A F 不区分大小写 就是说你也可以用 a f 示例 0 x101 等同于十进制 257 1 16 2 0 16 1 1 U 浮点数可以用科学记数法表示 E 和 e 都可以作为有效的指数标志 浮点数 被转换为 被转换为 10 0 10 2 34E5 2 34 10 5 234000 67E 12 67 0 10 12 0 000000000067 十一 数据类型 11 1 void void 只用在函数声明中 它表示该函数将不会被返回任何数据到它被调用的函数中 例子 功能在 setup 和 loop 被执行 但没有数据被返回到高一级的程序中 void setup void loop 11 2 boolean 布尔 一个布尔变量拥有两个值 true 或 false 每个布尔变量占用一个字节的内存 例子 int LEDpin 5 LED 与引脚 5 相连 int switchPin 13 开关的一个引脚连接引脚 13 另一个引脚接地 boolean running false void setup pinMode LEDpin OUTPUT 26 pinMode switchPin INPUT digitalWrite switchPin HIGH 打开上拉电阻 void loop if digitalRead switchPin LOW 按下开关 使引脚拉向高电势 delay 100 通过延迟 以滤去开关抖动产生的杂波 running running 触发 running 变量 digitalWrite LEDpin running 点亮 LED 11 3 char 字符或字符串 一个数据类型 占用 1 个字节的内存存储一个字符值 字符都写在单引号 如 A 多个字符 字符串 使用双引号 如 ABC 字符以编号的形式存储 你可以在 ASCII 表中看到对应的编码 这意味着字符的 ASCII 值可以用来作数学计算 例如 A 1 因为大写 A 的 ASCII 值是 65 所以结果为 66 如何 将字符转换成数字参考 serial println 命令 char 数据类型是有符号的类型 这意味着它的编码为 128 到 127 对于一个无符号一 个字节 8 位 的数据类型 使用 byte 数据类型 例如 char myChar A char myChar 65 both are equivalent 11 4 unsigned char 无符号数据类型 一个无符号数据类型占用 1 个字节的内存 与 byte 的数据类型相同 无符号的 char 数据类型能编码 0 到 255 的数字 为了保持 Arduino 的编程风格的一致性 byte 数据类型是首选 例子 unsigned char myChar 240 11 5 byte 无符号数 一个字节存储 8 位无符号数 从 0 到 255 例子 byte b B10010 B 是二进制格式 B10010 等于十进制 18 11 6 int 整型 整数是基本数据类型 占用 2 字节 整数的范围为 32 768 到 32 767 2 15 2 15 1 整数类型使用 2 的补码方式存储负数 最高位通常为符号位 表示数的正负 其余位 被 取反加 1 此处请参考补码相关资料 不再赘述 Arduino 为您处理负数计算问题 所以数学计算对您是透明的 术语 实际存在 但不 27 可操作 相当于 黑盒 但是 当处理右移位运算符 时 可能有未预期的编译过程 示例 int ledPin 13 语法 int var val var 变量名 val 赋给变量的值 提示 当变量数值过大而超过整数类型所能表示的范围时 32 768 到 32 767 变量值会 回滚 详情见示例 int x x 32 768 x x 1 x 现在是 32 767 x 32 767 x x 1 x 现在是 32 768 11 7 unsigned int 无符号整型 描述 无符号整型变量扩充了变量容量以存储更大的数据 它能存储 32 位 4 字节 数据 与 标准长整型不同无符号长整型无法存储负数 其范围从 0 到 4 294 967 295 2 32 1 例子 unsigned long time void setup Serial begin 9600 void loop Serial print Time time millis 程序开始后一直打印时间 Serial println time 等待一秒钟 以免发送大量的数据 delay 1000 语法 unsigned long var val var 你所定义的变量名 val 给变量所赋的值 11 8 word 描述 28 一个存储一个 16 字节无符号数的字符 取值范围从 0 到 65535 与 unsigned int 相同 例子 word w 10000 11 9 long 长整数型 描述 长整数型变量是扩展的数字存储变量 它可以存储 32 位 4 字节 大小的变量 从 2 147 483 648 到 2 147 483 647 例子 long speedOfLight 186000L 参见整数常量 L 的说明 语法 long var val var 长整型变量名 var 赋给变量的值 11 10 unsigned long 无符号长整数型 描述 无符号长整型变量扩充了变量容量以存储更大的数据 它能存储 32 位 4 字节 数据 与标准长整型不同无符号长整型无法存储负数 其范围从 0 到 4 294 967 295 2 32 1 例子 unsigned long time void setup Serial begin 9600 void loop Serial print Time time millis 程序开始后一直打印时间 Serial println time 等待一秒钟 以免发送大量的数据 delay 1000 语法 unsigned long var val var 你所定义的变量名 val 给变量所赋的值 11 11 float 浮点型数 描述 float 浮点型数据 就是有一个小数点的数字 浮点数经常被用来近似的模拟连续值 29 因为他们比整数更大的精确度 浮点数的取值范围在 3 4028235 E 38 3 4028235E 38 它被存储为 32 位 4 字节 的信息 float 只有 6 7 位有效数字 这指的是总位数 而不是小数点右边的数字 与其他平台 不同的是 在那里你可以使用 double 型得到更精确的结果 如 15 位 在 Arduino 上 double 型与 float 型的大小相同 浮点数字在有些情况下是不准确的 在数据大小比较时 可能会产生奇怪的结果 例 如 6 0 3 0 可能不等于 2 0 你应该使两个数字之间的差额的绝对值小于一些小的数字 这样就可以近似的得到这两个数字相等这样的结果 浮点运算速度远远慢于执行整数运算 例如 如果这个循环有一个关键的计时功能 并需要以最快的速度运行 就应该避免浮点运算 程序员经常使用较长的程式把浮点运算 转换成整数运算来提高速度 举例 float myfloat float sensorCalbrate 1 117 语法 float var val var 您的 float 型变量名称 val 分配给该变量的值 示例代码 int x int y float z x 1 y x 2 Y 为 0 因为整数不能容纳分数 z float x 2 0 Z 为 0 5 你必须使用 2 0 做除数 而不是 2 11 12 double 双精度浮点数 描述 双精度浮点数 占用 4 个字节 目前的 arduino 上的 double 实现和 float 相同 精度并未提高 提示 如果你从其他地方得到的代码中包含了 double 类变量 最好检查一遍代码以确认其中 的变量的精确度能否在 arduino 上达到 11 13 string char array 字符串 string 字符串 描述 文本字符串可以有两种表现形式 你可以使用字符串数据类型 这是 0019 版本的核心 部分 或者你可以做一个字符串 由 char 类型的数组和空终止字符 0 构成 求助 待 润色 Leo 本节描述了后一种方法 而字符串对象 String object 将让你拥有更多的功能 同时也消耗更多的内存资源 关于它的详细信息 请参阅页面 String object 超链接 举例 以下所有字符串都是有效的声明 char Str1 15 30 char Str2 8 a r d u i n o char Str3 8 a r d u i n o 0 char Str4 arduino char Str5 8 arduino char Str6 15 arduino 声明字符串的解释 在 Str1 中 声明一个没有初始化的字符数组 在 Str2 中 声明一个字符数组 包括一个附加字符 编译器会自动添加所需的空字符 在 Str3 中 明确加入空字符 在 Str4 中 用引号分隔初始化的字符串常数 编译器将调整数组的大小 以适应字符 串常量和终止空字符 在 Str5 中 初始化一个包括明确的尺寸和字符串常量的数组 在 Str6 中 初始化数组 预留额外的空间用于一个较大的字符串 空终止字符 一般来说 字符串的结尾有一个空终止字符 ASCII 代码 0 以此让功能函数 例如 Serial pring 知道一个字符串的结束 否则 他们将从内存继续读取后续字节 而这些并 不属于所需字符串的一部分 这意味着 你的字符串比你想要的文字包含更多的个字符空间 这就是为什么 Str2 和 Str5 需要八个字符 即使 Arduino 只有七个字符 最后一个位置会自动填充空字符 str4 将自动调整为八个字符 包括一个额外的空 在 Str3 的 我们自己已经明确地包含了 空字符 写入 0 需要注意的是 字符串可能没有一个最后的空字符 例如在 Str2 中您已定义字符长度 为 7 而不是 8 这会破坏大部分使用字符串的功能 所以不要故意而为之 如果你注意 到一些奇怪的现象 在字符串中操作字符 基本就是这个原因导致的了 单引号 还是双引号 定义字符串时使用双引号 例如 ABC 而定义一个单独的字符时使用单引号 例 如 A 包装长字符串 你可以像这样打包长字符串 char myString This is the first line this is the second line etcetera 字符串数组 当你的应用包含大量的文字 如带有液晶显示屏的一个项目 建立一个字符串数组是 非常便利的 因为字符串本身就是数组 它实际上是一个两维数组的典型 在下面的代码 char 在字符数据类型 char 后跟了一个星号 表示这是一个 指针 数组 所有的数组名实际上是指针 所以这需要一个数组的数组 指针对于 C 语言初学者 而言是非常深奥的部分之一 但我们没有必要了解详细指针 就可以有效地应用它 样例 char myStrings This is string 1 This is string 2 This is string 3 This is string 4 This is string 5 This is string 6 void setup Serial begin 9600 31 void loop for int i 0 i 6 i Serial println myStrings
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!