arduino语法.docx
- 文档编号:26742523
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:97
- 大小:90.79KB
arduino语法.docx
《arduino语法.docx》由会员分享,可在线阅读,更多相关《arduino语法.docx(97页珍藏版)》请在冰豆网上搜索。
arduino语法
基本语法参考
结构部分
setup()
在Arduino中程序运行时将首先调用setup()函数。
用于初始化变量、设置针脚的输出\输入类型、配置串口、引入类库文件等等。
每次Arduino上电或重启后,setup函数只运行一次。
示例
intbuttonPin=3;
voidsetup()
{
Serial.begin(9600);
pinMode(buttonPin,INPUT);
}
voidloop()
{
//...
}
loop()
在 setup() 函数中初始化和定义了变量,然后执行loop()函数。
顾名思义,该函数在程序运行过程中不断的循环,根据一些反馈,相应改变执行情况。
通过该函数动态控制Arduino主控板。
示例
intbuttonPin=3;
//setup中初始化串口和按键针脚.
voidsetup()
{
beginSerial(9600);
pinMode(buttonPin,INPUT);
}
//loop中每次都检查按钮,如果按钮被按下,就发送信息到串口
voidloop()
{
if(digitalRead(buttonPin)==HIGH)
serialWrite('H');
else
serialWrite('L');
delay(1000);
}
控制部分
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 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,这也不是我们所期待的结果。 if的另外一种分支条件控制结构是 if...else 形式。 if/else if/else是比if更为高级的流程控制语句,它可以进行多次条件测试。 比如,检测模拟输入的值,当它小于500时该执行哪些操作,大于或等于500时执行另外的操作。 代码如下: if(pinFiveInput<500) { //执行A操作 } else { //执行B操作 } else可以进行额外的if检测,所以多个互斥的条件可以同时进行检测。 测试将一个一个进行下去,直到某个测试结果为真,此时该测试相关的执行语句块将被运行,然后程序就跳过剩下的检测,直接执行到if/else的下一条语句。 当所有检测都为假时,若存在else语句块,将执行默认的else语句块。 注意elseif语句块可以没有else语句块。 elseif分支语句的数量无限制。 if(pinFiveInput<500) { //执行A操作 } elseif(pinFiveInput>=1000) { //执行B操作 } else { //执行C操作 } 另外一种进行多种条件分支判断的语句是switchcase语句。 for语句 描述 for语句用于重复执行一段在花括号之内的代码。 通常使用一个增量计数器计数并终止循环。 for语句用于重复性的操作非常有效,通常与数组结合起来使用来操作数据、引脚。 for循环开头有3个部分: (初始化;条件;增量计数){ //语句 } “初始化”只在循环开始执行一次。 每次循环,都会检测一次条件;如果条件为真,则执行语句和“增量计数”,之后再检测条件。 当条件为假时,循环终止。 例子 //用PWM引脚将LED变暗 intPWMpin=10;//将一个LED与47Ω电阻串联接在10脚 voidsetup() { //无需设置 } voidloop() { for(inti=0;i<=255;i++){ analogWrite(PWMpin,i); delay(10); } } 编程提示 C语言的for循环语句比BASIC和其他电脑编程语言的for语句更灵活。 除了分号以外,其他3个元素都能省略。 同时,初始化,条件,增量计算可以是任何包括无关变量的有效C语句,任何C数据类型包括float。 这些不寻常的for语句可能会解决一些困难的编程问题。 例如,在增量计数中使用乘法可以得到一个等比数列: for(intx=2;x<100;x=x*1.5){ println(x); } 生成: 2,3,4,6,9,13,19,28,42,63,94 另一个例子,使用for循环使LED产生渐亮渐灭的效果: voidloop() { intx=1; for(inti=0;i>-1;i=i+x){ analogWrite(PWMpin,i); if(i==255)x=-1;//在峰值转变方向 delay(10); } } switch/case语句 和if语句相同,switch…case通过程序员设定的在不同条件下执行的代码控制程序的流程。 特别地,switch语句将变量值和case语句中设定的值进行比较。 当一个case语句中的设定值与变量值相同时,这条case语句将被执行。 关键字break可用于退出switch语句,通常每条case语句都以break结尾。 如果没有break语句,switch语句将会一直执行接下来的语句(一直向下)直到遇见一个break,或者直到switch语句结尾。 例子 switch(var){ case1: //当var等于1时,执行一些语句 break; case2 //当var等于2时,执行一些语句 break; default: //如果没有任何匹配,执行default //default可有可不有 } 语法 switch(var){ caselabel: //声明 break; caselabel: //声明 break; default: //声明 } 参数 var: 用于与下面的case中的标签进行比较的变量值 label: 与变量进行比较的值 while循环 描述 while循环会无限的循环,直到括号内的判断语句变为假。 必须要有能改变判断语句的东西,要不然while循环将永远不会结束。 这在您的代码表现为一个递增的变量,或一个外部条件,如传感器的返回值。 语法 while(表达){ //语句 } 参数 表达: 为真或为假的一个计算结果 例子 var=0; while(var<200){ //重复一件事200遍 var++ } do...while do…while循环与while循环运行的方式是相近的,不过它的条件判断是在每个循环的最后,所以这个语句至少会被运行一次,然后才被结束。 do { //语句 }while(测试条件); 例子 do { delay(50);//等待传感器稳定 X=readSensors();//检查传感器取值 }while(X<100);//当x小于100时,继续运行 break break用于退出do,for,while循环,能绕过一般的判断条件。 它也能够用于退出switch语句。 例子 for(x=0;x<255;x++) { digitalWrite(PWMpin,x); sens=analogRead(sensorPin); if(sens>threshold){//超出探测范围 x=0; break; } delay(50); } continue continue语句跳过当前循环中剩余的迭代部分(do,for或while)。 它通过检查循环条件表达式,并继续进行任何后续迭代。 例子 for(x=0;x<255;x++) { if(x>40&&x<120){//当x在40与120之间时,跳过后面两句,即迭代。 continue; } digitalWrite(PWMpin,x); delay(50); } return 终止一个函数,如有返回值,将从此函数返回给调用函数。 语法: return; returnvalue;//两种形式均可 参数 value: 任何变量或常量的类型 例子: 一个比较传感器输入阈值的函数 intcheckSensor(){ if(analogRead(0)>400){ return1;} else{ return0; } } return关键字可以很方便的测试一段代码,而无需“commentout(注释掉)”大段的可能存在bug的代码。 voidloop(){ //写入漂亮的代码来测试这里。 return; //剩下的功能异常的程序 //return后的代码永远不会被执行 } goto 程序将会从程序中已有的标记点开始运行 语法 label: gotolabel;//从label处开始运行 提示 不要在C语言中使用goto编程,某些C编程作者认为goto语句永远是不必要的,但用得好,它可以简化某些特定的程序。 许多程序员不同意使用goto的原因是,通过毫无节制地使用goto语句,很容易创建一个程序,这种程序拥有不确定的运行流程,因而无法进行调试。 的确在有的实例中goto语句可以派上用场,并简化代码。 例如在一定的条件用if语句来跳出高度嵌入的for循环。 例子 for(byter=0;r<255;r++){ for(byteg=255;g>-1;g--){ for(byteb=0;b<255;b++){ if(analogRead(0)>250){ gotobailout; } //更多的语句... } } } bailout: 扩展语法 ;分号 用于表示一句代码的结束。 例子: inta=13; 提示 在每一行忘记使用分号作为结尾,将导致一个编译错误。 错误提示可能会清晰的指向缺少分号的那行,也可能不会。 如果弹出一个令人费解或看似不合逻辑的编译器错误,第一件事就是在错误附近检查是否缺少分号。 {}大括号 大括号(也称为“括号”或“大括号”)是C编程语言中的一个重要组成部分。 它们被用来区分几个不同的结构,下面列出的,有时可能使初学者混乱。 左大括号“{”必须与一个右大括号“}”形成闭合。 这是一个常常被称为括号平衡的条件。 在ArduinoIDE(集成开发环境)中有一个方便的功能来检查大括号是否平衡。 只需选择一个括号,甚至单击紧接括号的插入点,就能知道这个括号的“伴侣括号”。 目前此功能稍微有些错误,因为IDE会经常会认为在注释中的括号是不正确的。 对于初学者,以及由BASIC语言转向学习C语言的程序员,经常不清楚如何使用括号。 毕竟,大括号还会在“return函数”、“endif条件句”以及“loop函数”中被使用到。 由于大括号被用在不同的地方,这有一种很好的编程习惯以避免错误: 输入一个大括号后,同时也输入另一个大括号以达到平衡。 然后在你的括号之间输入回车,然后再插入语句。 这样一来,你的括号就不会变得不平衡了。 不平衡的括号常可导致许多错误,比如令人费解的编译器错误,有时很难在一个程序找到这个错误。 由于其不同的用法,括号也是一个程序中非常重要的语法,如果括号发生错误,往往会极大地影响了程序的意义。 大括号中的主要用途 功能 voidmyfunction(datatypeargument){ statements(s) } 循环 while(booleanexpression) { statement(s) } do { statement(s) } while(booleanexpression); for(initialisation;terminationcondition;incrementingexpr) { statement(s) } 条件语句 if(booleanexpression) { statement(s) } elseif(booleanexpression) { statement(s) } else { statement(s) } Comments(注释) 注释用于提醒自己或他人程序是如何工作的。 它们会被编译器忽略掉,也不会传送给处理器,所以它们在Atmega芯片上不占用体积。 注释的唯一作用就是使你自己理解或帮你回忆你的程序是怎么工作的或提醒他人你的程序是如何工作的。 编写注释有两种写法: 例子 x=5;//这是一条注释斜杠后面本行内的所有东西是注释 /*这是多行注释-用于注释一段代码 if(gwb==0){//在多行注释内可使用单行注释 x=3;/*但不允许使用新的多行注释-这是无效的 } //别忘了注释的结尾符号-它们是成对出现的! */ 小提示 当测试代码的时候,注释掉一段可能有问题的代码是非常有效的方法。 这能使这段代码成为注释而保留在程序中,而编译器能忽略它们。 这个方法用于寻找问题代码或当编译器提示出错或错误很隐蔽时很有效。 Define #define是一个很有用的C语法,它允许程序员在程序编译之前给常量命名。 在Arduino中,定义的常量不会占用芯片上的任何程序内存空间。 在编译时编译器会用事先定义的值来取代这些常量。 然而这样做会产生一些副作用,例如,一个已被定义的常量名已经包含在了其他常量名或者变量名中。 在这种情况下,文本将被#defined定义的数字或文本所取代。 通常情况下,优先考虑使用const关键字替代#define来定义常量。 Arduino拥有和C相同的语法规范: 语法 #define常量名常量值注意,#是必须的。 例子 #defineledPin3 //在编译时,编译器将使用数值3取代任何用到ledPin的地方。 提示 在#define声明后不能有分号。 如果存在分号,编译器会抛出语义不明的错误,甚至关闭页面。 #defineledPin3;//这是一种错误写法 类似的,在#define声明中包含等号也会产生语义不明的编译错误从而导致关闭页面。 #defineledPin=3//这是一种错误写法 #include #include用于调用程序以外的库。 这使得程序能够访问大量标准C库,也能访问用于arduino的库。 AVRC库(Arduino基于AVR标准语法)语法手册请点击这里。 注意#include和#define一样,不能在结尾加分号,如果你加了分号编译器将会报错。 例子 此例包含了一个库,用于将数据存放在flash空间内而不是ram内。 这为动态内存节约了空间,大型表格查表更容易实现 #include prog_uint16_tmyConstants[]PROGMEM={0,21140,702,9128,0,25764,8456, 0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500}; 算数运算符 =赋值运算符(单等号) 赋值运算符(单等号) 将等号右边的数值赋值给等号左边的变量 在C语言中,单等号被称为赋值运算符,它与数学上的等号含义不同,赋值运算符告诉单片机,将等号的右边的数值或计算表达式的结果,存储在等号左边的变量中。 例子: intsensVal;//声明一个名为sensVal的整型变量 senVal=analogRead(0);//将模拟引脚0的输入电压存储在SensVal变量中 编程技巧: 要确保赋值运算符(=符号)左侧的变量能够储存右边的数值。 如果没有大到足以容纳右边的值,存储在变量中的值将会发生错误。 不要混淆赋值运算符[=](单等号)与比较运算符[==](双等号),认为这两个表达式是相等的。 加,减,乘,除 描述 这些运算符返回两个操作数的和,差,乘积,商.这些运算是根据操作数的数据类型来计算的,比如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) ▪一些数学上的分数处理,要用浮点数,但其缺点是: 占用字节长度大,运算速度慢. ▪使用类型转换符,例如(int)myFloat将一个变量强制转换为int类型.. %(取模) 描述 一个整数除以另一个数,其余数称为模。 它有助于保持一个变量在一个特定的范围(例如数组的大小)。 语法 结果=被除数%除数 参数 被除数: 一个被除的数字 除数: 一个数字用于除以其他数 返回 余数(模) 举例 X=7%5;//X为2 X=9%5;//X为4 X=5%5;//X为0 X=4%5;//X为4 示例代码 /*通过循环计算1到10的模*/ intvalues[10]; inti=0; voidsetup(){ } voidloop() { values[i]=analogRead(0); i=(i+1)%10;//取模运算 } 提示 模运算符对浮点数不起作用。 比较运算符 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 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,这也不是我们所期待的结果。 if的另外一种分支条件控制结构是 if...else 形式。 布尔运算符 这些运算符可以用于if条件句中。 &&(逻辑与) 只有两个运算对象为“真”,才为“真”,如: if(digitalRead (2)==HIGH&&digitalRead(3)==HIGH){//读取两个开关的电平 //... }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arduino 语法