1、rdun编程参考手册首页程序结构变量基本函数setup()loop()控制结构ifif、elseforswitch casewhiledo、whilebreakcontinuereturngoto相关语法; 分号 大括号/ 单行注释/*/ 多行注释#define 宏定义#include 文件包含算术运算符= 赋值+ (加)- (减)* (乘)/ (除)% (取模)比较运算符= 等于!= (不等于) (大于)= (大于等于)布尔运算符& (逻辑与)| (逻辑或)! (逻辑非)指针运算符* 指针运算符& 地址运算符位运算& (位与)| (位或) (位异或) (位非) (右移)复合运算符+ (自加)
2、- (自减)+= (复合加)-= (复合减)*= (复合乘)/= (复合除)&= (复合与)|= (复合或)范围HIGH | LOWINPUT | OUTPUTtrue | false整型常量浮点数常量数据类型voidbooleancharunsigned charbyteintunsigned intwordlongunsigned longfloatdoublestringString(c+)array数据类型转换char()byte()int()word()long()float()变量作用域变量作用域static (静态变量)volatile (易变变量)const (不可改变变量)辅
3、助工具sizeof() (sizeof运算符)ASCII码表数字I/OpinMode()digitalWrite()digitalRead()模拟I/OanalogReference()analogRead()analogWrite()指高级I/OshiftOut()pulseIn()时间millis()delay(ms)delayMicroseconds(us)数学库min()max()abs()constrain()map()pow()sqrt()三角函数sin(rad)cos(rad)tan(rad)随机数randomSeed()random()random()位操作lowByte()h
4、ighByte()bitRead()bitWrite()bitSet()bitClear()bit()设置中断函数attachInterrupt()detachInterrupt()interrupts()noInterrupts()串口通讯begin()available()read()flushprint()println()write()peak()serialEvent()程序结构(本节直译自Arun官网最新Referece)在Arduino中, 标准得程序入口man函数在内部被定义, 用户只需要关心以下两个函数:su()当Arduo板起动时et()函数会被调用。用它来初始化变量,引脚
5、模式,开始使用某个库,等等。该函数在Aduno板得每次上电与复位时只运行一次。loop()在创建st函数,该函数初始化与设置初始值,loop()函数所做事得正如其名,连续循环,允许您得程序改变状态与响应事件。可以用它来实时控制ruio板。示例:it buoPin = 3;void setu() Serial、bei(9600); /初始化串口 pinde(buttonPin, INPUT); /设置3号引脚为输入模式vidoop() if (diialead(buttoPn) = HIG) srilWri(H); else erialWte(L); deay(1000);控制语句iff,用于与
6、比较运算符结合使用,测试就是否已达到某些条件,例如一个输入数据在某个范围之外。使用格式如下:i(alu 0) / 这里加入您得代码该程序测试alu就是否大于0。如果就是,程序将执行特定得动作。换句话说,如果圆括号中得语句为真,大括号中得语句就会执行。如果不就是,程序将跳过这段代码。大括号可以被省略,如果这么做,下一行(以分号结尾)将成为唯一得条件语句。 (x 120) diitalWrite(LEDpi, HG); ( 12)dgialWrite(LEp, HIG); i (x 10) digiaWrie(LEpin,GH); if () digtalrite(Lpin,HIGH); digi
7、talWrite(LEDpin2, HI); / 都就是正确得圆括号中要被计算得语句需要一个或多个操作符。、ese与基本得if语句相比,由于允许多个测试组合在一起,if/ee可以使用更多得控制流。例如,可以测试一个模拟量输入,如果输入值小于00,则采取一个动作,而如果输入值大于或等于500,则采取另一个动作。代码瞧起来像就是这样:f (piFiveInu 0) / 动作else/ 动作else中可以进行另一个if测试,这样多个相互独立得测试就可以同时进行。每一个测试一个接一个地执行直到遇到一个测试为真为止。当发现一个测试条件为真时,与其关联得代码块就会执行,然后程序将跳到完整得iflse结构得
8、下一行。如果没有一个测试被验证为真。缺省得else语句块,如果存在得话,将被设为默认行为,并执行。注意:一个els i语句块可能有或者没有终止else语句块,同理。每个else f分支允许有无限多个。if (FiveInut 50) 执行动作Aels if (piFiveInpt=10) / 执行动作Belse / 执行动作C另外一种表达互斥分支测试得方式,就是使用stchcase语句。frfor语句描述fo语句用于重复执行被花括号包围得语句块。一个增量计数器通常被用来递增与终止循环。for语句对于任何需要重复得操作就是非常有用得。常常用于与数组联合使用以收集数据/引脚。for循环得头部有三个
9、部分:for (初始化部分; 条件判断部分; 数据递增部分)/语句块。初始化部分被第一个执行,且只执行一次。每次通过这个循环,条件判断部分将被测试;如果为真,语句块与数据递增部分就会被执行,然后条件判断部分就会被再次测试,当条件测试为假时,结束循环。示例:/使用一个PW引脚使ED灯闪烁in PWin= ; / LED在10号引脚串联一个470欧姆得电阻vi etu()/这里无需设置voidoo()for (nti;i -1; i = i + x) naloWrite(Ppi, i); if ( = 25) x = ; /在峰值切换方向 delay(10); swithcaseswitchcae
10、 语句就像i语句,wtc、cae通过允许程序员根据不同得条件指定不同得应被执行得代码来控制程序流。特别地,一个sich语句对一个变量得值与cas语句中指定得值进行比较。当一个cas语句被发现其值等于该变量得值。就会运行这个cs语句下得代码。bea关键字将中止并跳出sitch语句段,常常用于每个case语句得最后面。如果没有break语句,swtc语句将继续执行下面得表达式(“持续下降”)直到遇到break,或者就是到达itc语句得末尾。示例: swich (var) cas : /当var等于1执行这里 rek; case2: /当v等于2执行这里 bra; elt: /如果没有匹配项,将执行
11、此缺省段 / deaut段就是可选得 语法 switc (ar) case labl: / statment re;case label: / statements bre; faut: / statme参数var:与不同得case中得值进行比较得变量label:相应得case得值hlewhile循环描述:while循环将会连续地无限地循环,直到圆括号()中得表达式变为假。被测试得变量必须被改变,否则while循环将永远不会中止。这可以就是您得代码,比如一个递增得变量,或者就是一个外部条件,比如测试一个传感器。语法: hile(expresin) / satemet(s)参数:expssio-
12、一个(布尔型)C语句,被求值为真或假示例:var= ; le(ar 00) /做两百次重复得事情 va+;o、wildo循环o循环与il循环使用相同方式工作,不同得就是条件就是在循环得末尾被测试得,所以o循环总就是至少会运行一次。d / 语句块 whil(测试条件);示例:d dlay(50); /等待传感器稳定 rdSenss(); / 检查传感器得值 while ( 10);eakbreak用于中止do,for,或whle循环,绕过正常得循环条件。它也用于中止swich语句。示例: for (x 0; 255; +) igialrte(PMpn, ); sens= analogad(ens
13、orPi); if (ens hreold) / bail o senetect x = 0; break; ela(5);conuecontinue语句跳过一个循环得当前迭代得余下部分。(o,fo,或wil)。通过检查循环测试条件它将继续进行随后得迭代。示例:for ( = 0;x 55; x +) if (x 40 & x 120) / reate umin value cotinue; digitalre(PWpin, x); delay(50);retun终止一个函数,并向被调用函数并返回一个值,如果您想得话。语法:reurn; rturn vaue;/ bohos are vl 参数
14、:valu: 任何类型得变量或常量示例:/一个函数,用于对一个传感器输入与一个阈值进行比较 int chekor() (naoRed(0) 400) etun1; ele etun 0; etrn关键字对测试一段代码很方便,不需“注释掉”大段得可能就是错误得代码。vid lp()/在此测试代码就是个好想法reurn; 这里就是功能不正常得代码/ 这里得代码永远也不会执行oto在程序中转移程序流到一个标记点语法:bel:otolabel; /endrogm flow thael 提示:在程序中不建议使用gto,而且一些C编程书得作者主张永远不要使用ot语句,但就是明智地使用它可以 简化某些代码。
15、许多程序员不赞成使用goto得原因就是,无节制地使用gto语句很容易产生执行流混乱得很难被调试程序。 尽管如就是说,仍然有很多使用gto语句而大大简化编码得实例。其中之一就就是从一个很深得循环嵌套中跳出去,或者就是f逻辑块,在某人些条件下。示例:for(byte r =0;r -1;g-) for(byteb = ;b 255; b+) f (anaRead(0) 20) goto bilot; /其它语句。 biout:相关语法分号用于一个语句得结束示例int a = 13;提示忘记在一行得末尾加一个分号将产生一个编译器错误。该错误信息可能就是明显得,且会提及丢失分号,但也许不会。如果出现一
16、个不可理喻得或瞧起来不合逻辑得错误,其中一个首先要做得事就就是检查分号丢失。编译器会在前一行得附近发出抱怨。大括号大括号(又称括弧或花括号)就是C语言得主要组成部分。它们用在几个不同得结构中,大致如下,这可能会令初学者感到困惑。一个左大括号必须有一个右大括号跟在后面。这就是一个常被称为平衡括号得条件。ruinoIE(集成开发环境)包含一个方便得特性以检验平衡大括号。只需选择一个大括号,甚至直接在一个大括号后面点击插入点,然后它得逻辑上得同伴就会高亮显示。目前此功能有些许错误,因为IDE经常在文本中(错误地)发现一个已经被注释掉得大括号。初级程序员,与从BASC转到得程序员常常发现使用大括号令人
17、困惑或畏缩。毕竟,用同样得大括号在子例程(函数)中替换ETURN语句,在条件语句中替换NDIF语句与在FOR循环中替换NEXT语句。由于大括号得使用就是如此得多样,当插入一个需要大括号得结构时,直接在打出开括号之后打出闭括号就是个不错得编程实践。然后在大括号之间插入一些回车符,接着开始插入语句。您得大括号,还有您得态度,将永远不会变得不平衡。不平衡得大括号常常导致古怪得,难以理解得编译器错误,有时在大型程序中很难查出。因为它们得多样得使用,大括号对于程序得语法也就是极其重要得,对一个大括号移动一行或两行常常显著地影响程序得意义。大括号得主要用法/函数 voi myfunction(datatp
18、rum) statments(s) /循环whil (bolen xpresson) satemet(s) do statemet(s) hil (boea xpreson);or (initialisatin; teminatin cniton; creeting p) saemen(s) /条件语句 if (bolnexpressio) stament(s) elsef (boolean xpression) satement(s) els statemet(s) 注释注释就是程序中得一些行,用于让自己或她人了解程序得工作方式。她们会被编译器忽略,而不会输出到控制器,所以它们不会占用ta芯
19、片上得任何空间。注释唯一得目得就是帮助您理解(或记忆)您得程序就是怎样工作得,或者就是告知其她人您得程序就是怎样工作得。标记一行为注释只有两种方式:示例 x 5; /这就是一个单行注释。此斜线后得任何内容都就是注释 /直到该行得结尾/*这就是多行注释 - 用它来注释掉整个代码块if (g= 0) /在多行注释中使用单行注释就是没有问题得x = 3; / 但就是其中不可以使用另一个多行注释 这就是不合法得 */别忘了加上“关闭”注释符 它们必须就是平衡得*/提示当实验代码时,“注释掉”您得程序得一部分来移除可能就是错误得行就是一种方便得方法。这不就是把这些行从程序中移除,而就是把它们放到注释中,
20、所以编译器就会忽略它们。这在定位问题时,或者当程序无法编译通过且编译错误信息很古怪或没有帮助时特别有用。fine#ine 宏定义宏定义就是一个有用得C组件,它允许程序员在程序编译前给常量取一个名字。在adui中定义得常量不会在芯片中占用任何程序空间。编译器在编译时会将这些常量引用替换为定义得值。这虽然可能有些有害得副作用,举例来说,一个已被定义得常量名被包含在一些其它得常量或变量名中。那样得话该文本将被替换成被定义得数字(或文本)。通常,用const关键字定义常量就是更受欢迎得且用来代替efine会很有用。Arduin宏定义与C宏定义有同样得语法语法#efineconantNm u 注意就是必
21、须得示例:define ldPin 3/ 编译器在编译时会将任何提及n得地方替换成数值3。提示#defne语句得后面分号。如果您加了一个,编译器将会在进一步得页面引发奇怪得错误。#efie lePi3; iss an err 类似地,包含一个等号通常也会在进一步得页面引发奇怪得编译错误。#deineledPin =3 / this s ao an rorincude#iclude 包含#incld用于在您得sketh中包含外部得库。这使程序员可以访问一个巨大得标准C库(预定义函数集合)得集合。AR C库(AVR就是Atmel芯片得一个基准,rdin正就是基于它)得主参考手册页在这里。注意nle
22、与#dfine相似,没有分号终止符,且如果您加了,编译器会产生奇怪得错误信息。示例该示例包含一个用于输出数据到程序空间闪存得库,而不就是内存。这会为动态内存需求节省存储空间且使需要创建巨大得查找表变得更实际。#incudpoguint1t yons PRGMM 0, 2110,702 , 9, 0,57, 4,0,0,,0,0,0,0,9810,968,29762,2962,400;算术运算符赋值=赋值运算符(单个等号)把等号右边得值存储到等号左边得变量中。在C语言中单个等号被称为赋值运算符。它与在代数课中得意义不同,后者象征等式或相等。赋值运算符告诉微控制器求值等号右边得变量或表达式,然后把
23、结果存入等号左边得变量中。示例 intensVal; /声明一个名为enVal得整型变量 senVal anoRead(0); /存储(数字得)0号模拟引脚得输入电压值到sVal编程技巧赋值运算符(=号)左边得变量需要能够保存存储在其中得值。如果它不足以大到容纳一个值,那个存储在该变量中得值将就是错误得。不要混淆赋值运算符 = (单个等号)与比较运算符 = (双等号),后者求值两个表达式就是否相等。加,减,乘,除描述这些运算符(分别)返回两人运算对象得与,差,积,商。这些操作受运算对象得数据类型得影响。所以,例如, / 结果就是2,如果与2就是整型数。这也意味着运算会溢出,如果结果超出其在相应
24、得数据类型下所能表示得数。(例如,给整型数值767加结果就是-3278)。如果运算对象就是不同得类型,会用那个较大得类型进行计算。如果其中一个数字(运算符)就是loa类型或double类型,将采用浮点数进行计算。示例y = y 3; x 7;i =j * ;r= r/ 5;语法reul= vue1 + lu2;resut= vue1 - u;sult =vale* ve2;reult vl1 / valu2;参数:vle:任何变量或常量alue2:任何变量或常量编程技巧:要知道整型常量默认为it型,因此一些常量计算可能会溢出(例如:0 100将产生负得结果)选择一个大小足够大得变量以容纳您得最
25、大得计算结果。要知道您得变量在哪一点将会“翻转”且要知道在另一个方向上会发生什么,例如:(0 - 1)或( - 32768)。对于数学需要分数,就使用浮点变量,但就是要注意它们得缺点:占用空间大,计算速度慢。使用强制类型转换符例如:(int)mFloa以在运行中转换一个变量到另一个类型。取模%(取模)描述计算一个数除以另一个数得余数。这对于保持一个变量在一个特定得范围很有用(例如:数组得大小)。语法sult=ividen% ivisor 参数dividen:被除数dio: 除数结果:余数示例 = 7 5; / x nowcotans x= 9% 5; / now ontains 4 =5 5;
26、 /xocontns 0x = 4% 5; / now cotns 4示例代码 /*upate one vlue ia array ach tie thgh alo *int vaues1;ti ;voi setup()oid oop() vales= nagRead(0); i ( +)% 10; / modlooeator rlls v varable 提示:取模运算符不能用于浮点型数。比较运算符if(条件) and =,!=, (比较运算符)if,用于与比较运算符联合使用,测试某一条件就是否到达,例如一个输入超出某一数值。if条件测试得格式:f(soeVrible 0) /dsomthi
27、ng he该程序测试omeiable就是否大于50。如果就是,程序执行特定得动作。换句话说,如果圆括号中得语句为真,花括号中得语句就会运行。否则,程序跳过该代码。f语句后得花括号可能被省略。如果这么做了,下一行(由分号定义得行)就会变成唯一得条件语句。if (x 20) igitalite(Dp,GH);i (x 1)igitlrite(Lpin,IG); if (x 12)digitalie(LEDpn, HIG); (x 10) digialrite(LDin1, HIGH); diialit(LEDpn2, HIGH); / allae rect圆括号中被求值得语句需要使用一个或多个运算
28、符:比较运算符:x= y( iseqal to y)x!= y (x snt equlto y) x ( esthan ) y (x is reatethany) = ( igrtr haor qul t )警告:小心偶然地使用单个等号(例如if(x= 10)。单个等号就是赋值运算符,这里设置x为10(将值0存入变量x)。改用双等号(例如if (x = 10),这个就是比较运算符,用于测试x就是否等于1。后者只在x等于0时返回真,但就是前者将总就是为真。这就是因为C如下求值语句if(x0):0分配给x(切记单个等号就是赋值运算符),因此x现在为10。然后条件求值10,其总就是为真,由于任何非零
29、数值都为真值。由此,if (x =10)将总就是求值为真,这不就是使用f语句所期望得结果。另外,变量x将被设置为10,这也不就是期望得操作。if也可以就是使用if、ls得分支控制结构得一部分。布尔运算符它们可用于if语句中得条件& (逻辑与)只有在两个操作数都为真时才返回真,例如:i (digitlRad(2) = HIGH & gitalRe()= HIGH) /a tw witchs / 、 只在两个输入都为高时返回真|(逻辑或)任意一个为真时返回真,例如:if (x 0 |y 0) / 、 x或任意一个大于0时返回真!(非)当操作数为假时返回真,例如:if(!x) / 、 若为假返回真(
30、即如果x等于)警告确保您没有把布尔与运算符,&(两个与符号)错认为按位与运算符&(单个与符号)。它们就是完全不同得概念。同样,不要混淆布尔或运算符|(双竖杠)与按位或运算符|(单竖杠)。按位取反(波浪号)瞧起来与布尔非!有很大不同(感叹号或程序员口中得“棒”),但就是您仍然必须确保在什么地方用哪一个。例如 if (a =10& a 2) / tue ias beteen 10 and 指针运算符&(引用)与 *(间接引用)指针对于C初学者来说就是更复杂得对象之一。并且可能写大量得Arduo程序甚至都不会遇到指针。无论如何,巧妙地控制特定得数据结构,使用指针可以简化代码,而且在自己工具箱中拥有熟
31、练控制指针得知识就是很方便得。位运算位与按位与(&)按位操作符在变量得位级执行运算。它们帮助解决各种常见得编程问题。以下大部分资料来自一个有关位数学得优秀教程,或许可以在这里找到。1描述与语法以下就是所有这些运算符得描述与语法。更详细得资料或许可以在参考指南中找到。按位与()在+中按位与运算符就是单个与符号,用于其它两个整型表达式之间使用。按位与运算独立地在周围得表达式得每一位上执行操作。根据这一规则:如果两个输入位都就是1,结果输出1,否则输出0。表达这一思想得另一个方法就是: 01 oerad1 0 1 0 1 operad - 0 0 1 (operand1 &operand) - et
32、ure eult在Arduio中,it型就是16位得。所以在两个整型表达式之间使用&将会导致1个与运算同时发生。代码片断就像这样: nt a 9; / i binary:1100 inb = 11; /nbnary: 00101 nt c =a& b; / reslt: 0000, or 68 indeim、在a与b得6位得每一位将使用按位与处理。且所有16位结果存入C中,以二进制存入得结果值,即十进制得68。按位与得其中一个最常用得用途就是从一个整型数中选择特定得位,常被称为掩码屏蔽。瞧如下示例:位或按位或(|)在C+中按位或运算符就是垂直得条杆符号,|。就像运算符,|独立地计算它周围得两个
33、整型表达式得每一位。(当然)它所做得就是不同得(操作)。两个输入位其中一个或都就是1按位或将得到,否则为0。换句话说: 0 0 1 1 pean1 0 opeand2 - 0 1 1 1 (oprad1 | opeand2)- etuned eult这就是一个使用一小断+代码描述得按位或(运算)得例子: na = 92; / in biy: 1110 it b= 10; / inbinary: 010 in c=a| b; / result: 101,r25 indecima、按位与与按位或得一个共同得工作就是在端口上进行程序员称之为读-改写得操作。在微控制器中,每个端口就是一个8位数字,每一
34、位表示一个引脚得状态。写一个端口可以同时控制所有得引脚。PORD就是内建得参照数字口0,1,2,3,4,5,6,7得输出状态得常量。如果一个比特位就是,那么该引脚置高。(引脚总就是需要用inMde()指令设置为输出模式)。所以如果我们写入RT= B0101;我们就会让引脚2,3与输出高。一个小小得问题就是,我们同时也改变了某些引脚得,状态。这用于Aruio与串口通讯,所以我们可能会干扰串口通讯。我们得程序规则就是:仅仅获取与清除我们想控制得与相应引脚对应得位(使用按位与)。合并要修改得RT值与所控制得引脚得新值(使用按位或)。int i; / cour varablit j;voi seu()
35、DDD =DDR | B1111100; / et dretio bits fr pis to7,lev0 d 1touch(xx| 00 = xx)/ same a pnMode(i, OUPU) o pis 2to 7rial、begin(90);void loo() (=0; i4; +)PORTD POTD& B000001; / er ou its 2- 7, lvin0nd touhed(x 11 = x)j = (i 2); /sit vriable u to ins 2 7 to aoid pi 0 an PORTD PORD j; biethe po informatiowi
36、ththe new formtiofr LD nsSeria、rintln(PORTD, I); debu to shoakngay(00); 位异或按位异或()在C+中有一个有点不寻常得操作,它被称为按位异或,或者XOR(在英语中,通常读作“ek-r”)。按位异或运算符使用符号。该运算符与按位或运算符“|”非常相似 ,唯一得不同就是当输入位都为1时它返回。 00 1 1 oprand1 1 oeran2 - 0 1 0 (opn1 operd2) - rernedesut瞧待XOR得另一个视角就是,当输入不同时结果为1,当输入相同时结果为0。这里就是一个简单得示例代码: in x 12; / inar: 1100 int y= 1