首页 Arduino 语法手册精编版

Arduino 语法手册精编版

举报
开通vip

Arduino 语法手册精编版Arduino语法手册Arduino的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。……………………………………………………………最新资料推荐……&hell...

Arduino 语法手册精编版
Arduino语法手册Arduino的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。……………………………………………………………最新资料推荐………………………………………………………………………………………………………………最新资料推荐…………………………………………………21结构部分一、结构1.1setup()1.2loop()二、结构控制2.1if2.2if...else2.3for2.4switchcase2.5while2.6do...while2.7break2.8continue2.9return2.10goto三、扩展语法3.1;(分号)3.2{}(花括号)3.3//(单行注释)3.4/**/(多行注释)3.5#define3.6#include四、算数运算符4.1=(赋值运算符)4.2+(加)4.3-(减)4.4*(乘)4.5/(除)4.6%(模)五、比较运算符5.1==(等于)5.2!=(不等于)5.3<(小于)5.4>(大于)5.5<=(小于等于)5.6>=(大于等于)六、布尔运算符6.1&&(与)6.2||(或)6.3!(非)七、指针运算符7.1*取消引用运算符7.2&引用运算符八、位运算符8.1&(bitwiseand)8.2|(bitwiseor)8.3^(bitwisexor)8.4~(bitwisenot)8.5<<(bitshiftleft)8.6>>(bitshiftright)九、复合运算符9.1++(increment)9.2--(decrement)9.3+=(compoundaddition)9.4-=(compoundsubtraction)9.5*=(compoundmultiplication)9.6/=(compounddivision)9.6&=(compoundbitwiseand)9.8|=(compoundbitwiseor)变量部分十、常量10.1HIGH|LOW(引脚电压定义)10.2INPUT|OUTPUT(数字引脚(Digitalpins)定义)10.3true|false(逻辑层定义)10.4integerconstants(整数常量)10.5floatingpointconstants(浮点常量)十一、数据类型11.1void11.2boolean(布尔)11.3char(有号数据类型)11.4unsignedchar(无符号数据类型)11.5byte(无符号数)11.6int(整型)11.7unsignedint(无符号整型)11.8word11.9long(长整数型)11.10unsignedlong(无符号长整数型)11.11float(浮点型数)11.12double(双精度浮点数)11.13string(chararray/字符串)11.14Stringobject(String类)11.15array(数组)十二、数据类型转换12.1char()12.2byte()12.3int()12.4word()12.5long()12.6float()十三、变量作用域&修饰符13.1variablescope(变量的作用域)13.2static(静态变量)13.3volatile13.4const十四、辅助工具14.1sizeof()函数部分十五、数字I/O15.1pinMode()15.2digitalWrite()15.3digitalRead()十六、模拟I/O16.1analogReference()16.2analogRead()16.3analogWrite()PWM十七、高级I/O17.1tone()17.2noTone()17.3shiftOut()17.4shiftIn()17.5pulseIn()十八、时间18.1millis()18.2micros()18.3delay()18.4delayMicroseconds()十九、数学运算19.1min()19.2max()19.3abs()19.4constrain()19.5map()19.6pow()19.7sqrt()19.8ceil()19.9exp()19.10fabs()19.11floor()19.12fma()19.13fmax()19.14fmin()19.15fmod()19.16ldexp()19.17log()19.18log10()19.19round()19.20signbit()19.21sq()19.22square()19.23trunc()二十、三角函数20.1sin()20.2cos()20.3tan()20.4acos()20.5asin()20.6atan()20.7atan2()20.8cosh()20.9degrees()20.10hypot()20.11radians()20.12sinh()20.13tanh()二十一、随机数21.1randomSeed()21.2random()二十二、位操作22.1lowByte()22.2highByte()22.3bitRead()22.4bitWrite()22.5bitSet()22.6bitClear()22.7bit()二十三、设置中断函数23.1attachInterrupt()23.2detachInterrupt()二十四、开关中断24.1interrupts()(中断)24.2noInterrupts()(禁止中断)二十五、通讯25.1Serial25.1.1if(Serial)25.1.2Serial.available()25.1.3Serial.begin()25.1.4Serial.end()25.1.5Serial.find()25.1.6Serial.findUntil()25.1.7Serial.flush()25.1.8Serial.parseFloat()25.1.9Serial.parseInt()25.1.10Serial.peek()25.1.11Serial.print()25.1.12Serial.println()25.1.13Serial.read()25.1.14Serial.readBytes()25.1.15Serial.readBytesUntil()25.1.16Serial.setTimeout()25.1.17Serial.write()25.1.18Serial.SerialEvent()25.2Stream二十六、USB(仅适用于Leonardo和Due)26.1Mouse(键盘)26.2Keyboard(鼠标)结构部分一、结构1.1setup()在Arduino中程序运行时将首先调用setup()函数。用于初始化变量、设置针脚的输出\输入类型、配置串口、引入类库文件等等。每次Arduino上电或重启后,setup函数只运行一次。示例intbuttonPin=3;voidsetup(){Serial.begin(9600);pinMode(buttonPin,INPUT);}voidloop(){//...}1.2loop()在setup()函数中初始化和定义了变量,然后执行loop()函数。顾名思义,该函数在程序运行过程中不断的循环,根据一些反馈,相应改变执行情况。通过该函数动态控制Arduino主控板。示例intbuttonPin=3;//setup中初始化串口和按键针脚.voidsetup(){beginSerial(9600);pinMode(buttonPin,INPUT);}//loop中每次都检查按钮,如果按钮被按下,就发送信息到串口voidloop(){if(digitalRead(buttonPin)==HIGH)serialWrite('H');elseserialWrite('L');delay(1000);}二、结构控制2.1ifif(条件判断语句)和==、!=、<、>(比较运算符)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)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形式。2.2if...elseif/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语句。2.3forfor语句描述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);}}2.4switchcaseswitch/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:与变量进行比较的值2.5whilewhile循环描述while循环会无限的循环,直到括号内的判断语句变为假。必须要有能改变判断语句的东西,要不然while循环将永远不会结束。这在您的代码表现为一个递增的变量,或一个外部条件,如传感器的返回值。语法while(表达){//语句}参数表达:为真或为假的一个计算结果例子var=0;while(var<200){//重复一件事200遍var++}2.6do...whiledo…while循环与while循环运行的方式是相近的,不过它的条件判断是在每个循环的最后,所以这个语句至少会被运行一次,然后才被结束。do{//语句}while(测试条件);例子do{delay(50);//等待传感器稳定X=readSensors();//检查传感器取值}while(X<100);//当x小于100时,继续运行2.7breakbreak用于退出do,for,while循环,能绕过一般的判断条件。它也能够用于退出switch语句。例子for(x=0;x<255;x++){digitalWrite(PWMpin,x);sens=analogRead(sensorPin);if(sens>threshold){//超出探测范围x=0;break;}delay(50);}2.8continuecontinue语句跳过当前循环中剩余的迭代部分(do,for或while)。它通过检查循环条件表达式,并继续进行任何后续迭代。例子for(x=0;x<255;x++){if(x>40&&x<120){//当x在40与120之间时,跳过后面两句,即迭代。continue;}digitalWrite(PWMpin,x);delay(50);}2.9return终止一个函数,如有返回值,将从此函数返回给调用函数。语法return;returnvalue;//两种形式均可参数value:任何变量或常量的类型例子一个比较传感器输入阈值的函数intcheckSensor(){if(analogRead(0)>400){return1;}else{return0;}}return关键字可以很方便的测试一段代码,而无需“commentout(注释掉)”大段的可能存在bug的代码。voidloop(){//写入漂亮的代码来测试这里。return;//剩下的功能异常的程序//return后的代码永远不会被执行}2.10goto程序将会从程序中已有的标记点开始运行语法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:三、扩展语法3.1;(分号)用于表示一句代码的结束。例子inta=13;提示在每一行忘记使用分号作为结尾,将导致一个编译错误。错误提示可能会清晰的指向缺少分号的那行,也可能不会。如果弹出一个令人费解或看似不合逻辑的编译器错误,第一件事就是在错误附近检查是否缺少分号。3.2{}(花括号)大括号(也称为“括号”或“大括号”)是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)}3.3//(单行注释)Comments(注释)注释用于提醒自己或他人程序是如何工作的。它们会被编译器忽略掉,也不会传送给处理器,所以它们在Atmega芯片上不占用体积。注释的唯一作用就是使你自己理解或帮你回忆你的程序是怎么工作的或提醒他人你的程序是如何工作的。编写注释有两种写法:例子x=5;//这是一条注释斜杠后面本行内的所有东西是注释/*这是多行注释-用于注释一段代码if(gwb==0){//在多行注释内可使用单行注释x=3;/*但不允许使用新的多行注释-这是无效的}//别忘了注释的结尾符号-它们是成对出现的!*/小提示当测试代码的时候,注释掉一段可能有问题的代码是非常有效的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。这能使这段代码成为注释而保留在程序中,而编译器能忽略它们。这个方法用于寻找问题代码或当编译器提示出错或错误很隐蔽时很有效。3.4/**/(多行注释)Comments(注释)注释用于提醒自己或他人程序是如何工作的。它们会被编译器忽略掉,也不会传送给处理器,所以它们在Atmega芯片上不占用体积。注释的唯一作用就是使你自己理解或帮你回忆你的程序是怎么工作的或提醒他人你的程序是如何工作的。编写注释有两种写法:例子x=5;//这是一条注释斜杠后面本行内的所有东西是注释/*这是多行注释-用于注释一段代码if(gwb==0){//在多行注释内可使用单行注释x=3;/*但不允许使用新的多行注释-这是无效的}//别忘了注释的结尾符号-它们是成对出现的!*/小提示当测试代码的时候,注释掉一段可能有问题的代码是非常有效的方法。这能使这段代码成为注释而保留在程序中,而编译器能忽略它们。这个方法用于寻找问题代码或当编译器提示出错或错误很隐蔽时很有效。3.5#define#define是一个很有用的C语法,它允许程序员在程序编译之前给常量命名。在Arduino中,定义的常量不会占用芯片上的任何程序内存空间。在编译时编译器会用事先定义的值来取代这些常量。然而这样做会产生一些副作用,例如,一个已被定义的常量名已经包含在了其他常量名或者变量名中。在这种情况下,文本将被#defined定义的数字或文本所取代。通常情况下,优先考虑使用const关键字替代#define来定义常量。Arduino拥有和C相同的语法 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 。语法#define常量名常量值注意,#是必须的。例子#defineledPin3//在编译时,编译器将使用数值3取代任何用到ledPin的地方。提示在#define声明后不能有分号。如果存在分号,编译器会抛出语义不明的错误,甚至关闭页面。#defineledPin3;//这是一种错误写法类似的,在#define声明中包含等号也会产生语义不明的编译错误从而导致关闭页面。#defineledPin=3//这是一种错误写法3.6#include#include用于调用程序以外的库。这使得程序能够访问大量标准C库,也能访问用于arduino的库。AVRC库(Arduino基于AVR标准语法)语法手册请点击这里。注意#include和#define一样,不能在结尾加分号,如果你加了分号编译器将会报错。例子此例包含了一个库,用于将数据存放在flash空间内而不是ram内。这为动态内存节约了空间,大型表格查表更容易实现。#include<avr/pgmspace.h>prog_uint16_tmyConstants[]PROGMEM={0,21140,702,9128,0,25764,8456,0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500};四、算数运算符4.1=(赋值运算符)=赋值运算符(单等号)赋值运算符(单等号)将等号右边的数值赋值给等号左边的变量在C语言中,单等号被称为赋值运算符,它与数学上的等号含义不同,赋值运算符告诉单片机,将等号的右边的数值或计算表达式的结果,存储在等号左边的变量中。例子intsensVal;//声明一个名为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;Syntaxresult=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类型。4.3-(减)详见4.2+(加)4.4*(乘)详见4.2+(加)4.5/(除)详见4.2+(加)4.6%(取模)描述一个整数除以另一个数,其余数称为模。它有助于保持一个变量在一个特定的范围(例如数组的大小)。语法结果=被除数%除数参数被除数:一个被除的数字除数:一个数字用于除以其他数返回余数(模)举例X=7%5;//X为2X=9%5;//X为4X=5%5;//X为0X=4%5;//X为4示例代码/*通过循环计算1到10的模*/intvalues[10];inti=0;voidsetup(){}voidloop(){values[i]=analogRead(0);i=(i+1)%10;//取模运算}提示模运算符对浮点数不起作用。五、比较运算符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)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形式。5.2!=(不等于)详见5.1==(等于)5.3<(小于)详见5.1==(等于)5.4>(大于)详见5.1==(等于)5.5<=(小于等于)详见5.1==(等于)5.6>=(大于等于)详见5.1==(等于)六、布尔运算符6.1&&(与)布尔运算符这些运算符可以用于if条件句中。&&(逻辑与)只有两个运算对象为“真”,才为“真”,如:if(digitalRead(2)==HIGH&&digitalRead(3)==HIGH){//读取两个开关的电平//...}如果当两个输入都为高电平,则为“真”。||(逻辑或)只要一个运算对象为“真”,就为“真”,如:if(x>0||y>0){//...}如果x或y是大于0,则为“真”。!(逻辑非)如果运算对象为“假”,则为“真”,例如if(!x){//...}如果x为“假”,则为真(即如果x等于0)。警告千万不要误以为,符号为&(单符号)的位运算符”与”就是布尔运算符的“与”符号为&&(双符号)。他们是完全不同的符号。同样,不要混淆布尔运算符||(双竖)与位运算符“或”符号为|(单竖)。位运算符〜(波浪号)看起来与布尔运算符not有很大的差别!(正如程序员说:“惊叹号”或“bang”),但你还是要确定哪一个运算符是你想要的。举例if(a>=10&&a<=20){}//如果a的值在10至20之间,则为“真”6.2||(或)详见6.1&&(与)6.3!(非)详见6.1&&(与)七、指针运算符7.1*取消引用运算符指针运算符&(取地址)和*(取地址所指的值)指针对C语言初学者来说是一个比较复杂的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 ,但是编写大部分arduino代码时可以不用涉及到指针。然而,操作某些数据结构时,使用指针能够简化代码,但是指针的操作知识很难在工具书中找到,可以参考C语言相关工具书。7.2&引用运算符详见7.1*取消引用运算符八、位运算符8.1&(按位与)按位与(&)按位操作符对变量进行位级别的计算。它们能解决很多常见的编程问题。下面的材料大多来自这个非常棒的按位运算指导。说明和语法下面是所有的运算符的说明和语法。进一步的详细资料,可参考教程。按位与(&)位操作符与在C++中是一个&符,用在两个整型变量之间。按位与运算符对两侧的变量的每一位都进行运算,规则是:如果两个运算元都是1,则结果为1,否则输出0.另一种表达方式:0011运算元10101运算元2----------0001(运算元1&运算元2)-返回结果在Arduino中,int类型为16位,所以在两个int表达式之间使用&会进行16个并行按位与计算。代码片段就像这样:inta=92;//二进制:0000000001011100intb=101;//二进制:0000000001100101intc=a&b;//结果:0000000001000100,或10进制的68a和b的16位每位都进行按位与计算,计算结果存在c中,二进制结果是01000100,十进制结果是68.按位与最常见的作用是从整型变量中选取特定的位,也就是屏蔽。见下方的例子。按位或(|)按位或操作符在C++中是|。和&操作符类似,|操作符对两个变量的为一位都进行运算,只是运算规则不同。按位或规则:只要两个位有一个为1则结果为1,否则为0。换句话说:0011运算元10101运算元2----------0111(运算元1|运算元2)-返回的结果这里是一个按位或运算在C++代码片段:inta=92;//二进制:0000000001011100intb=101;//二进制:0000000001100101intc=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和新的值进行运算inti;//计数器intj;voidsetup()DDRD=DDRD|B11111100;//设置引脚2~7的方向,0、1脚不变(xx|00==xx)//效果和pinMode(pin,OUTPUT)设置2~7脚为输出一样serial.begin(9600);}voidloop(){for(i=0;i<64;i++){PORTD=PORTD&B00000011;//清除2~7位,0、1保持不变(xx&11==xx)j=(i<<2);//将变量左移为·2~7脚,避免0、1脚PORTD=PORTD|j;//将新状态和原端口状态结合以控制LED脚Serial.println(PORTD,BIN);//输出掩盖以便调试delay(100);}}按位异或(^)C++中有一个不常见的操作符叫按位异或,也叫做XOR(通常读作”eks-or“)。按位异或操作符用‘^'表示。此操作符和按位或(|)很相似,区别是如果两个位都为1则结果为0:0011运算元10101运算元2----------0110(运算元1^运算元2)-返回的结果按位异或的另一种解释是如果两个位值相同则结果为0,否则为1。下面是一个简单的代码示例:intx=12;//二进制:1100inty=10;//二进制:1010intz=x^y;//二进制:0110,或十进制6//Blink_Pin_5//演示“异或”voidsetup(){DDRD=DDRD|B00100000;//设置数字脚5设置为输出serial.begin(9600);}voidloop(){PORTD=PORTD^B00100000;//反转第5位(数字脚5),其他保持不变delay(100);}8.2|(按位或)详见8.1&(按位与)8.3^(按位异或)详见8.1&(按位与)8.4~(按位非)按位取反(~)按位取反在C++语言中是波浪号~。与&(按位与)和|(按位或)不同,按位取反使用在一个操作数的右侧。按位取反将操作数改变为它的“反面”:0变为1,1变成0。例如:01operand1----------10~operand1inta=103;//二进制:0000000001100111intb=~a;//二进制:1111111110011000=-104你可能会惊讶地看到结果为像-104这样的数字。这是因为整数型变量的最高位,即所谓的符号位。如果最高位是1,这个数字将变为负数。这个正数和负数的编码被称为补。想了解更多信息,请参考Wikipedia文章two'scomplement.顺便说一句,有趣的是,要注意对于任何整数型操作数X,〜X和-X-1是相同的。有时,对带有符号的整数型操作数进行位操作可以造成一些不必要的意外。8.5<<(左移位运算符)bitshiftleft(<<),bitshiftright(>>)描述出自Playground的TheBitmathTutorial在C++语言中有两个移位运算符:左移位运算符(«)和右移运算符(»)。这些操作符可使左运算元中的某些位移动右运算元中指定的位数。想了解有关位的更多信息可以点击这里。语法variable«number_of_bitsvariable»number_of_bits参数variable-(byte,int,long)number_of_bitsinteger⇐32例子inta=5;//二进制数:0000000000000101intb=a<<3;//二进制数:0000000000101000,或十进制数:40intc=b>>3;//二进制数:0000000000000101,或者说回到开始时的5//当你将x左移y位时(x«y),x中最左边的y位会逐个逐个的丢失:inta=5;//二进制:0000000000000101intb=a<<14;//二进制:0100000000000000-101中最左边的1被丢弃如果你确定位移不会引起数据溢出,你可以简单的把左移运算当做对左运算元进行2的右运算元次方的操作。例如,要产生2的次方,可使用下面的方式:1<<0==11<<1==21<<2==41<<3==8...1<<8==2561<<9==51210<<1==1024...当你将x右移y位(x»y),如果x最高位是1,位移结果将取决于x的数据类型。如果x是int类型,最高位为符号位,确定是否x是负数或不是,正如我们上面的讨论。如果x类型为int,则最高位是符号位,正如我们以前讨论过,符号位表示x是正还是负。在这种情况下,由于深奥的历史原因,符号位被复制到较低位:X=-16;//二进制:1111111111110000Y=X>>3//二进制:1111111111111110这种结果,被称为符号扩展,往往不是你想要的行为。你可能希望左边被移入的数是0。右移操作对无符号整型来说会有不同结果,你可以通过数据强制转换改变从左边移入的数据:X=-16;//二进制:1111111111110000inty=(unsignedint)x>>3;//二进制:0001111111111110如果你能小心的避免符号扩展问题,你可以将右移操作当做对数据除2运算。例如:INT=1000;Y=X>>3;81000//1000整除8,使y=1258.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=3y=x--;//现在x=2,y还是39.2--(递减)详见9.1++(递增)9.3+=(复合加)+=,-=,*=,/=描述执行常量或变量与另一个变量的数学运算。+=等运算符是以下扩展语法的速记。语法X+=Y;//相当于表达式X=X+Y;X-=Y;//相当于表达式X=X-Y;X*=Y;//相当于表达式X=X*Y;X/=Y;//相当于表达式X=X/Y;参数X:任何变量类型Y:任何变量类型或常数例子x=2;x+=4;//x现在等于6x-=3;//x现在等于3x*=10;//x现在等于30x/=2;//x现在等于159.4-=(复合减)详见9.3+=(复合加)9.5*=(复合乘)详见9.3+=(复合加)9.6/=(复合除)详见9.3+=(复合加)9.6&=(复合运算按位与)描述复合运算按位与运算符(&=)经常被用来将一个变量和常量进行运算使变量某些位变为0。这通常被称为“清算”或“复位”位编程 指南 验证指南下载验证指南下载验证指南下载星度指南下载审查指南PDF 。语法x&=y;//等价于x=x&y;参数x:char,int或long类型变量Y:char,int或long类型常量例如首先,回顾一下按位与(&)运算符0011运算元10101运算元2----------0001(运算元1&运算元2)-返回的结果任何位与0进行按位与操作后被清零,如果myBite是变量myByte&B00000000=0;因此,任何位与1进行“按位与运算”后保持不变myByteB11111111=myByte;注意:因为我们用位操作符来操作位,所以使用二进制的变量会很方便。如果这些数值是其他值将会得到同样结果,只是不容易理解。同样,B00000000是为了标示清楚,0在任何进制中都是0(恩。。有些哲学的味道)因此-清除(置零)变量的任意位0和1,而保持其余的位不变,可与常量B11111100进行复合运算按位与(&=)10101010变量11111100mask----------------------10101000变量不变位清零将变量替换为x可得到同样结果XXXXXXXX变量11111100mask----------------------XXXXXX00变量不变位清零同理myByte=10101010;myByte&=B1111100==B10101000;9.8|=(复合运算按位或)描述复合按位或操作符(|=)经常用于变量和常量“设置”(设置为1),尤其是变量中的某一位。语法x|=y;//等价于x=x|y;参数x:char,int或long类型y:整数,int或long类型例如首先,回顾一下OR(|)运算符0011运算元10101运算元2----------0111(运算元1|运算元2)-返回的结果如果变量myByte中某一位与0经过按位或运算后不变。myByte|B00000000=myByte;与1经过或运算的位将变为1.myByte|B11111111B11111111;因此-设置变量的某些位为0和1,而变量的其他位不变,可与常量B00000011进行按位与运算(|=)10101010变量00000011----------------------10101011变量保持不变位设置接下来的操作相同,只是将变量用x代替XXXXXXXX变量00000011mask----------------------XXXXXX11变量保持不变位设置同上:myByte=B10101010;myByte|=B00000011==B10101011;变量部分十、常量10.1HIGH|LOW(引脚电压定义)引脚电压定义,HIGH和LOW当读取(read)或写入(write)数字引脚时只有两个可能的值:HIGH和LOW。HIGHHIGH(参考引脚)的含义取决于引脚(pin)的设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode被设置为INPUT,并通过digitalRead读取(read)时。如果当前引脚的电压大于等于3V,微控制器将会返回为HIGH。引脚也可以通过pinMode被设置为INPUT,并通过digitalWrite设置为HIGH。输入引脚的值将被一个内在的20K上拉电阻控制在HIGH上,除非一个外部电路将其拉低到LOW。当一个引脚通过pinMode被设置为OUTPUT,并digitalWrite设置为HIGH时,引脚的电压应在5V。在这种状态下,它可以输出电流。例如,点亮一个通过一串电阻接地或设置为LOW的OUTPUT属性引脚的LED。LOWLOW的含义同样取决于引脚设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode配置为INPUT,通过digitalRead设置为读取(read)时,如果当前引脚的电压小于等于2V,微控制器将返回为LOW。当一个引脚通过pinMode配置为OUTPUT,并通过digitalWrite设置为LOW时,引脚为0V。在这种状态下,它可以倒灌电流。例如,点亮一个通过串联电阻连接到+5V,或到另一个引脚配置为OUTPUT、HIGH的的LED。10.2INPUT|OUTPUT(数字引脚(Digitalpins)定义)数字引脚(Digitalpins)定义,INPUT和OUTPUT数字引脚当作INPUT或OUTPUT都可以。用pinMode()方法使一个数字引脚从INPUT到OUTPUT变化。引脚(Pins)配置为输入(Inputs)Arduino(Atmega)引脚通过pinMode()配置为输入(INPUT)即是将其配置在一个高阻抗的状态。配置为INPUT的引脚可以理解为引脚取样时对电路有极小的需求,即等效于在引脚前串联一个100兆欧姆(Megohms)的电阻。这使得它们非常利于读取传感器,而不是为LED供电。引脚(Pins)配置为输出(Outputs)引脚通过pinMode()配置为输出(OUTPUT)即是将其配置在一个低阻抗的状态。这意味着它们可以
本文档为【Arduino 语法手册精编版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
Miss杨
暂无简介~
格式:doc
大小:142KB
软件:Word
页数:0
分类:互联网
上传时间:2019-06-30
浏览量:6