




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Arduino編程參考手冊(cè)程序結(jié)構(gòu)4控制語(yǔ)句5if5if.else6for8switch case10while11do.while12break12continue13return14goto15相關(guān)語(yǔ)法16分號(hào)16大括號(hào)16注釋18define19include20算術(shù)運(yùn)算符21賦值21加,減,乘,除21取模22比較運(yùn)算符24if(條件) and =, !=, <, > (比較運(yùn)算符)24布爾運(yùn)算符26指針運(yùn)算符27位運(yùn)算27位與27位或28位異或30位非32左移、右移33復(fù)合運(yùn)算符35自加+35自減-35復(fù)合加+=35復(fù)合減-=36復(fù)合乘*=36復(fù)合除/=36復(fù)合與&
2、=36復(fù)合或|=36變量36常量36宏定義37整型常量38浮點(diǎn)數(shù)常量40數(shù)據(jù)類型41void41boolean42char43unsigned char43byte43int44unsigned int45word46long46unsigned long47float48double49string49String(c+)51array52數(shù)據(jù)類型轉(zhuǎn)換54char()54byte()54int()55word()55long()56float()56變量作用域&修飾符57變量作用域57static (靜態(tài)變量)58volatile (易變變量)60const (不可改變變量)61輔助
3、工具62sizeof() (sizeof運(yùn)算符)62ASCII碼表63基本函數(shù)65數(shù)字I/O65pinMode()65digitalWrite()66digitalRead()67模擬I/O68analogReference()68analogRead()69analogWrite()70高級(jí)I/O71shiftOut()71pulseIn()72時(shí)間73millis()73delay(ms)73delayMicroseconds(us)74數(shù)學(xué)庫(kù)75min()75max()76abs()76constrain()76map()77pow()78sqrt()78三角函數(shù)78sin(),cos(
4、),tan()78隨機(jī)數(shù)79randomSeed()79random()79位操作80設(shè)置中斷函數(shù)81a81achInterrupt()81detachInterrupt()82interrupts()83noInterrupts()83串口通訊84begin()84available()84read()87flush()88print()88println()92write()92peak()93serialEvent()93程序結(jié)構(gòu)(本節(jié)直譯自Arduino官網(wǎng)最新Reference)在Arduino中, 標(biāo)準(zhǔn)的程序入口main函數(shù)在內(nèi)部被定義, 用戶只需要關(guān)心以下兩個(gè)函數(shù):setup()
5、當(dāng)Arduino板起動(dòng)時(shí)setup()函數(shù)會(huì)被調(diào)用。用它來初始化變量,引腳模式,開始使用某個(gè)庫(kù),等等。該函數(shù)在Arduino板的每次上電和復(fù)位時(shí)只運(yùn)行一次。loop()在創(chuàng)建setup函數(shù),該函數(shù)初始化和設(shè)置初始值,loop()函數(shù)所做事的正如其名,連續(xù)循環(huán),允許你的程序改變狀態(tài)和響應(yīng)事件??梢杂盟鼇韺?shí)時(shí)控制arduino板。示例:int buonPin = 3;void setup() Serial.begin(9600); /初始化串口 pinMode(buonPin, INPUT); /設(shè)置3號(hào)引腳為輸入模式void loop() if (digitalRead(buonPin) = H
6、IGH) serialWrite('H'); else serialWrite('L'); delay(1000);控制語(yǔ)句 ifif,用于與比較運(yùn)算符結(jié)合使用,測(cè)試是否已達(dá)到某些條件,例如一個(gè)輸入數(shù)據(jù)在某個(gè)范圍之外。使用格式如下:if (value > 50) / 這里加入你的代碼該程序測(cè)試value是否大于50。如果是,程序?qū)?zhí)行特定的動(dòng)作。換句話說,如果圓括號(hào)中的語(yǔ)句為真,大括號(hào)中的語(yǔ)句就會(huì)執(zhí)行。如果不是,程序?qū)⑻^這段代碼。大括號(hào)可以被省略,如果這么做,下一行(以分號(hào)結(jié)尾)將成為唯一的條件語(yǔ)句。 if (x > 0) digitalWrite
7、(LEDpin, HIGH); if (x > 0)digitalWrite(LEDpin, HIGH); if (x > 0) digitalWrite(LEDpin, HIGH); if (x > 0) digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); / 都是正確的圓括號(hào)中要被計(jì)算的語(yǔ)句需要一個(gè)或多個(gè)操作符。if.else與基本的if語(yǔ)句相比,由于允許多個(gè)測(cè)試組合在一起,if/else可以使用更多的控制流。例如,可以測(cè)試一個(gè)模擬量輸入,如果輸入值小于500,則采取一個(gè)動(dòng)作,而如果輸入值大于或等于500,則
8、采取另一個(gè)動(dòng)作。代碼看起來像是這樣:if (pinFiveInput < 500) / 動(dòng)作Aelse / 動(dòng)作Belse中可以進(jìn)行另一個(gè)if測(cè)試,這樣多個(gè)相互獨(dú)立的測(cè)試就可以同時(shí)進(jìn)行。每一個(gè)測(cè)試一個(gè)接一個(gè)地執(zhí)行直到遇到一個(gè)測(cè)試為真為止。當(dāng)發(fā)現(xiàn)一個(gè)測(cè)試條件為真時(shí),與其關(guān)聯(lián)的代碼塊就會(huì)執(zhí)行,然后程序?qū)⑻酵暾膇f/else結(jié)構(gòu)的下一行。如果沒有一個(gè)測(cè)試被驗(yàn)證為真。缺省的else語(yǔ)句塊,如果存在的話,將被設(shè)為默認(rèn)行為,并執(zhí)行。注意:一個(gè)else if語(yǔ)句塊可能有或者沒有終止else語(yǔ)句塊,同理。每個(gè)else if分支允許有無限多個(gè)。if (pinFiveInput < 500) /
9、執(zhí)行動(dòng)作Aelse if (pinFiveInput >= 1000) / 執(zhí)行動(dòng)作Belse / 執(zhí)行動(dòng)作C另外一種表達(dá)互斥分支測(cè)試的方式,是使用switch case語(yǔ)句。forfor語(yǔ)句描述for語(yǔ)句用于重復(fù)執(zhí)行被花括號(hào)包圍的語(yǔ)句塊。一個(gè)增量計(jì)數(shù)器通常被用來遞增和終止循環(huán)。for語(yǔ)句對(duì)于任何需要重復(fù)的操作是非常有用的。常常用于與數(shù)組聯(lián)合使用以收集數(shù)據(jù)/引腳。for循環(huán)的頭部有三個(gè)部分:for (初始化部分; 條件判斷部分; 數(shù)據(jù)遞增部分) /語(yǔ)句塊。初始化部分被第一個(gè)執(zhí)行,且只執(zhí)行一次。每次通過這個(gè)循環(huán),條件判斷部分將被測(cè)試;如果為真,語(yǔ)句塊和數(shù)據(jù)遞增部分就會(huì)被執(zhí)行,然后條件判斷部
10、分就會(huì)被再次測(cè)試,當(dāng)條件測(cè)試為假時(shí),結(jié)束循環(huán)。示例:/使用一個(gè)PWM引腳使LED燈閃爍int PWMpin = 10; / LED在10號(hào)引腳串聯(lián)一個(gè)470歐姆的電阻void setup() /這里無需設(shè)置void loop() for (int i=0; i <= 255; i+) analogWrite(PWMpin, i); delay(10); 編碼提示:C中的for循環(huán)比在其它計(jì)算機(jī)語(yǔ)言中發(fā)現(xiàn)的for循環(huán)要靈活的多,包括BASIC。三個(gè)頭元素中的任何一個(gè)或全部可能被省略,盡管分號(hào)是必須的。而且初始化部分、條件判斷部分和數(shù)據(jù)遞增部分可以是任何合法的使用任意變量的C語(yǔ)句。且可以使用
11、任何數(shù)據(jù)類型包括floats。這些不常用的類型用于語(yǔ)句段也許可以為一些罕見的編程問題提供解決方案。例如,在遞增部分中使用一個(gè)乘法將形成對(duì)數(shù)級(jí)增長(zhǎng):for(int x = 2; x < 100; x = x * 1.5) println(x);輸出: 2,3,4,6,9,19,28,42,63,94另一個(gè)例子,在一個(gè)for循環(huán)中使一個(gè)LED燈漸漸地變亮和變暗:void loop() int x = 1; for (int i = 0; i > -1; i = i + x) analogWrite(PWMpin, i); if (i = 255) x = -1; / 在峰值切換方向 d
12、elay(10); switch caseswitch case 語(yǔ)句就像if語(yǔ)句,switch.case通過允許程序員根據(jù)不同的條件指定不同的應(yīng)被執(zhí)行的代碼來控制程序流。特別地,一個(gè)switch語(yǔ)句對(duì)一個(gè)變量的值與case語(yǔ)句中指定的值進(jìn)行比較。當(dāng)一個(gè)case語(yǔ)句被發(fā)現(xiàn)其值等于該變量的值。就會(huì)運(yùn)行這個(gè)case語(yǔ)句下的代碼。break關(guān)鍵字將中止并跳出switch語(yǔ)句段,常常用于每個(gè)case語(yǔ)句的最后面。如果沒有break語(yǔ)句,switch語(yǔ)句將繼續(xù)執(zhí)行下面的表達(dá)式(“持續(xù)下降”)直到遇到break,或者是到達(dá)switch語(yǔ)句的末尾。示例: switch (var) case 1: /當(dāng)var
13、等于1執(zhí)行這里 break; case 2: /當(dāng)var等于2執(zhí)行這里 break; default: / 如果沒有匹配項(xiàng),將執(zhí)行此缺省段 / default段是可選的 語(yǔ)法 switch (var) case label: / statements break; case label: / statements break; default: / statements參數(shù)var: 與不同的case中的值進(jìn)行比較的變量label: 相應(yīng)的case的值whilewhile循環(huán)描述:while循環(huán)將會(huì)連續(xù)地?zé)o限地循環(huán),直到圓括號(hào)()中的表達(dá)式變?yōu)榧?。被測(cè)試的變量必須被改變,否則while循環(huán)將永遠(yuǎn)
14、不會(huì)中止。這可以是你的代碼,比如一個(gè)遞增的變量,或者是一個(gè)外部條件,比如測(cè)試一個(gè)傳感器。語(yǔ)法: while(expression) / statement(s)參數(shù):expression - 一個(gè)(布爾型)C語(yǔ)句,被求值為真或假示例:var = 0; while(var < 200) / 做兩百次重復(fù)的事情 var+; do.whiledo循環(huán)do循環(huán)與while循環(huán)使用相同方式工作,不同的是條件是在循環(huán)的末尾被測(cè)試的,所以do循環(huán)總是至少會(huì)運(yùn)行一次。do / 語(yǔ)句塊 while (測(cè)試條件);示例:do delay(50); / 等待傳感器穩(wěn)定 x = readSensors(); /
15、 檢查傳感器的值 while (x < 100);breakbreak用于中止do,for,或while循環(huán),繞過正常的循環(huán)條件。它也用于中止switch語(yǔ)句。示例: for (x = 0; x < 255; x +) digitalWrite(PWMpin, x); sens = analogRead(sensorPin); if (sens > threshold) / bail out on sensor detect x = 0; break; delay(50);continuecontinue語(yǔ)句跳過一個(gè)循環(huán)的當(dāng)前迭代的余下部分。(do,for,或while)。通
16、過檢查循環(huán)測(cè)試條件它將繼續(xù)進(jìn)行隨后的迭代。示例:for (x = 0; x < 255; x +) if (x > 40 && x < 0) / create jump in values continue; digitalWrite(PWMpin, x); delay(50);return終止一個(gè)函數(shù),并向被調(diào)用函數(shù)并返回一個(gè)值,如果你想的話。語(yǔ)法:return; return value; / both forms are valid 參數(shù):value: 任何類型的變量或常量示例:/一個(gè)函數(shù),用于對(duì)一個(gè)傳感器輸入與一個(gè)閾值進(jìn)行比較 int checkSen
17、sor() if (analogRead(0) > 400) return 1; else return 0; return 關(guān)鍵字對(duì)測(cè)試一段代碼很方便,不需“注釋掉”大段的可能是錯(cuò)誤的代碼。void loop()/在此測(cè)試代碼是個(gè)好想法return;/ 這里是功能不正常的代碼/ 這里的代碼永遠(yuǎn)也不會(huì)執(zhí)行g(shù)oto在程序中轉(zhuǎn)移程序流到一個(gè)標(biāo)記點(diǎn)語(yǔ)法:label: goto label; / sends program flow to the label 提示:在C程序中不建議使用goto,而且一些C編程書的作者主張永遠(yuǎn)不要使用goto語(yǔ)句,但是明智地使用它可以簡(jiǎn)化某些代碼。許多程序員不贊成
18、使用goto的原因是,無節(jié)制地使用goto語(yǔ)句很容易產(chǎn)生執(zhí)行流混亂的很難被調(diào)試程序。盡管如是說,仍然有很多使用goto語(yǔ)句而大大簡(jiǎn)化編碼的實(shí)例。其中之一就是從一個(gè)很深的循環(huán)嵌套中跳出去,或者是if邏輯塊,在某人些條件下。示例: for(byte r = 0; r < 255; r+) for(byte g = 255; g > -1; g-) for(byte b = 0; b < 255; b+) if (analogRead(0) > 250) goto bailout; / 其它語(yǔ)句。 bailout:相關(guān)語(yǔ)法分號(hào)用于一個(gè)語(yǔ)句的結(jié)束示例 int a = 0;提示忘
19、記在一行的末尾加一個(gè)分號(hào)將產(chǎn)生一個(gè)編譯器錯(cuò)誤。該錯(cuò)誤信息可能是明顯的,且會(huì)提及丟失分號(hào),但也許不會(huì)。如果出現(xiàn)一個(gè)不可理喻的或看起來不合邏輯的錯(cuò)誤,其中一個(gè)首先要做的事就是檢查分號(hào)丟失。編譯器會(huì)在前一行的附近發(fā)出抱怨。大括號(hào)大括號(hào)(又稱括弧或花括號(hào))是C語(yǔ)言的主要組成部分。它們用在幾個(gè)不同的結(jié)構(gòu)中,大致如下,這可能會(huì)令初學(xué)者感到困惑。一個(gè)左大括號(hào)必須有一個(gè)右大括號(hào)跟在后面。這是一個(gè)常被稱為平衡括號(hào)的條件。Arduino IDE(集成開發(fā)環(huán)境)包含一個(gè)方便的特性以檢驗(yàn)平衡大括號(hào)。只需選擇一個(gè)大括號(hào),甚至直接在一個(gè)大括號(hào)后面點(diǎn)擊插入點(diǎn),然后它的邏輯上的同伴就會(huì)高亮顯示。目前此功能有些許錯(cuò)誤,因?yàn)镮D
20、E經(jīng)常在文本中(錯(cuò)誤地)發(fā)現(xiàn)一個(gè)已經(jīng)被注釋掉的大括號(hào)。初級(jí)程序員,和從BASIC轉(zhuǎn)到C的程序員常常發(fā)現(xiàn)使用大括號(hào)令人困惑或畏縮。畢竟,用同樣的大括號(hào)在子例程(函數(shù))中替換RETURN語(yǔ)句,在條件語(yǔ)句中替換ENDIF語(yǔ)句和在FOR循環(huán)中替換NEXT語(yǔ)句。由于大括號(hào)的使用是如此的多樣,當(dāng)插入一個(gè)需要大括號(hào)的結(jié)構(gòu)時(shí),直接在打出開括號(hào)之后打出閉括號(hào)是個(gè)不錯(cuò)的編程實(shí)踐。然后在大括號(hào)之間插入一些回車符,接著開始插入語(yǔ)句。你的大括號(hào),還有你的態(tài)度,將永遠(yuǎn)不會(huì)變得不平衡。不平衡的大括號(hào)常常導(dǎo)致古怪的,難以理解的編譯器錯(cuò)誤,有時(shí)在大型程序中很難查出。因?yàn)樗鼈兊亩鄻拥氖褂?,大括?hào)對(duì)于程序的語(yǔ)法也是極其重要的,對(duì)一
21、個(gè)大括號(hào)移動(dòng)一行或兩行常常顯著地影響程序的意義。大括號(hào)的主要用法/函數(shù) void myfunction(datatype argument) statements(s) /循環(huán) while (boolean expression) statement(s) do statement(s) while (boolean expression); for (initialisation; termination condition; incrementing expr) statement(s) /條件語(yǔ)句 if (boolean expression) statement(s) else if
22、(boolean expression) statement(s) else statement(s) 注釋注釋是程序中的一些行,用于讓自己或他人了解程序的工作方式。他們會(huì)被編譯器忽略,而不會(huì)輸出到控制器,所以它們不會(huì)占用Atmega芯片上的任何空間。注釋唯一的目的是幫助你理解(或記憶)你的程序是怎樣工作的,或者是告知其他人你的程序是怎樣工作的。標(biāo)記一行為注釋只有兩種方式:示例 x = 5; /這是一個(gè)單行注釋。此斜線后的任何內(nèi)容都是注釋 /直到該行的結(jié)尾 /* 這是多行注釋 - 用它來注釋掉整個(gè)代碼塊if (gwb = 0) /在多行注釋中使用單行注釋是沒有問題的x = 3; /* 但是其中
23、不可以使用另一個(gè)多行注釋 - 這是不合法的 */別忘了加上“關(guān)閉”注釋符 - 它們必須是平衡的*/提示當(dāng)實(shí)驗(yàn)代碼時(shí),“注釋掉”你的程序的一部分來移除可能是錯(cuò)誤的行是一種方便的方法。這不是把這些行從程序中移除,而是把它們放到注釋中,所以編譯器就會(huì)忽略它們。這在定位問題時(shí),或者當(dāng)程序無法編譯通過且編譯錯(cuò)誤信息很古怪或沒有幫助時(shí)特別有用。define#define 宏定義宏定義是一個(gè)有用的C組件,它允許程序員在程序編譯前給常量取一個(gè)名字。在arduino中定義的常量不會(huì)在芯片中占用任何程序空間。編譯器在編譯時(shí)會(huì)將這些常量引用替換為定義的值。這雖然可能有些有害的副作用,舉例來說,一個(gè)已被定義的常量名被
24、包含在一些其它的常量或變量名中。那樣的話該文本將被替換成被定義的數(shù)字(或文本)。通常,用const關(guān)鍵字定義常量是更受歡迎的且用來代替#define會(huì)很有用。Arduino宏定義與C宏定義有同樣的語(yǔ)法語(yǔ)法#define constantName value 注意#是必須的示例:#define ledPin 3/ 編譯器在編譯時(shí)會(huì)將任何提及l(fā)edPin的地方替換成數(shù)值3。提示#define語(yǔ)句的后面分號(hào)。如果你加了一個(gè),編譯器將會(huì)在進(jìn)一步的頁(yè)面引發(fā)奇怪的錯(cuò)誤。#define ledPin 3; / this is an error 類似地,包含一個(gè)等號(hào)通常也會(huì)在進(jìn)一步的頁(yè)面引發(fā)奇怪的編譯錯(cuò)誤。#
25、define ledPin = 3 / this is also an error include#include 包含#include用于在你的sketch中包含外部的庫(kù)。這使程序員可以訪問一個(gè)巨大的標(biāo)準(zhǔn)C庫(kù)(預(yù)定義函數(shù)集合)的集合。AVR C庫(kù)(AVR是Atmel芯片的一個(gè)基準(zhǔn),Arduino正是基于它)的主參考手冊(cè)頁(yè)在這里。注意#include和#define相似,沒有分號(hào)終止符,且如果你加了,編譯器會(huì)產(chǎn)生奇怪的錯(cuò)誤信息。示例該示例包含一個(gè)用于輸出數(shù)據(jù)到程序空間閃存的庫(kù),而不是內(nèi)存。這會(huì)為動(dòng)態(tài)內(nèi)存需求節(jié)省存儲(chǔ)空間且使需要?jiǎng)?chuàng)建巨大的查找表變得更實(shí)際。#include <avr/pgm
26、space.h>prog_uin6_t myConstants PROGMEM = 0, 40, 702 , 98, 0, 25764, 8456,0,0,0,0,0,0,0,0,29810,8968,29762,29762,4500;算術(shù)運(yùn)算符賦值=賦值運(yùn)算符(單個(gè)等號(hào))把等號(hào)右邊的值存儲(chǔ)到等號(hào)左邊的變量中。在C語(yǔ)言中單個(gè)等號(hào)被稱為賦值運(yùn)算符。它與在代數(shù)課中的意義不同,后者象征等式或相等。賦值運(yùn)算符告訴微控制器求值等號(hào)右邊的變量或表達(dá)式,然后把結(jié)果存入等號(hào)左邊的變量中。示例 int sensVal; /聲明一個(gè)名為sensVal的整型變量 senVal = analogRead(0);
27、 /存儲(chǔ)(數(shù)字的)0號(hào)模擬引腳的輸入電壓值到sensVal編程技巧賦值運(yùn)算符(=號(hào))左邊的變量需要能夠保存存儲(chǔ)在其中的值。如果它不足以大到容納一個(gè)值,那個(gè)存儲(chǔ)在該變量中的值將是錯(cuò)誤的。不要混淆賦值運(yùn)算符 = (單個(gè)等號(hào))和比較運(yùn)算符 = (雙等號(hào)),后者求值兩個(gè)表達(dá)式是否相等。加,減,乘,除描述這些運(yùn)算符(分別)返回兩人運(yùn)算對(duì)象的和,差,積,商。這些操作受運(yùn)算對(duì)象的數(shù)據(jù)類型的影響。所以,例如,9 / 4結(jié)果是2,如果9和2是整型數(shù)。這也意味著運(yùn)算會(huì)溢出,如果結(jié)果超出其在相應(yīng)的數(shù)據(jù)類型下所能表示的數(shù)。(例如,給整型數(shù)值767加1結(jié)果是-768)。如果運(yùn)算對(duì)象是不同的類型,會(huì)用那個(gè)較大的類型進(jìn)行計(jì)
28、算。如果其中一個(gè)數(shù)字(運(yùn)算符)是float類型或double類型,將采用浮點(diǎn)數(shù)進(jìn)行計(jì)算。示例y = y + 3;x = x - 7;i = j * 6;r = r / 5;語(yǔ)法result = value1 + value2;result = value1 - value2;result = value1 * value2;result = value1 / value2;參數(shù):value1:任何變量或常量value2:任何變量或常量編程技巧:要知道整型常量默認(rèn)為int型,因此一些常量計(jì)算可能會(huì)溢出(例如:60 * 1000將產(chǎn)生負(fù)的結(jié)果)選擇一個(gè)大小足夠大的變量以容納你的最大的計(jì)算結(jié)果。要知
29、道你的變量在哪一點(diǎn)將會(huì)“翻轉(zhuǎn)”且要知道在另一個(gè)方向上會(huì)發(fā)生什么,例如:(0 - 1)或(0 - 768)。對(duì)于數(shù)學(xué)需要分?jǐn)?shù),就使用浮點(diǎn)變量,但是要注意它們的缺點(diǎn):占用空間大,計(jì)算速度慢。使用強(qiáng)制類型轉(zhuǎn)換符例如:(int)myFloat以在運(yùn)行中轉(zhuǎn)換一個(gè)變量到另一個(gè)類型。取模%(取模)描述計(jì)算一個(gè)數(shù)除以另一個(gè)數(shù)的余數(shù)。這對(duì)于保持一個(gè)變量在一個(gè)特定的范圍很有用(例如:數(shù)組的大?。UZ(yǔ)法result = dividend % divisor 參數(shù)dividend: 被除數(shù)divisor: 除數(shù)結(jié)果:余數(shù)示例x = 7 % 5; / x now contains 2x = 9 % 5; / x now
30、 contains 4x = 5 % 5; / x now contains 0x = 4 % 5; / x now contains 4示例代碼 /* update one value in an array each time through a loop */int values10;int i = 0;void setup() void loop() valuesi = analogRead(0); i = (i + 1) % 10; / modulo operator rolls over variable 提示:取模運(yùn)算符不能用于浮點(diǎn)型數(shù)。比較運(yùn)算符if(條件) and =, !=
31、, <, > (比較運(yùn)算符)if,用于和比較運(yùn)算符聯(lián)合使用,測(cè)試某一條件是否到達(dá),例如一個(gè)輸入超出某一數(shù)值。if條件測(cè)試的格式:if (someVariable > 50) / do something here該程序測(cè)試someVariable是否大于50。如果是, 程序執(zhí)行特定的動(dòng)作。換句話說,如果圓括號(hào)中的語(yǔ)句為真,花括號(hào)中的語(yǔ)句就會(huì)運(yùn)行。否則,程序跳過該代碼。if語(yǔ)句后的花括號(hào)可能被省略。如果這么做了,下一行(由分號(hào)定義的行)就會(huì)變成唯一的條件語(yǔ)句。if (x > 0) digitalWrite(LEDpin, HIGH); if (x > 0)digit
32、alWrite(LEDpin, HIGH); if (x > 0) digitalWrite(LEDpin, HIGH); if (x > 0) digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); / all are correct圓括號(hào)中被求值的語(yǔ)句需要使用一個(gè)或多個(gè)運(yùn)算符:比較運(yùn)算符: x = y (x is equal to y) x != y (x is not equal to y) x < y (x is less than y) x > y (x is greater than y) x &l
33、t;= y (x is less than or equal to y) x >= y (x is greater than or equal to y)警告:小心偶然地使用單個(gè)等號(hào)(例如if(x = 10))。單個(gè)等號(hào)是賦值運(yùn)算符,這里設(shè)置x為10(將值10存入變量x)。改用雙等號(hào)(例如if (x = 10)),這個(gè)是比較運(yùn)算符,用于測(cè)試x是否等于10。后者只在x等于10時(shí)返回真,但是前者將總是為真。這是因?yàn)镃如下求值語(yǔ)句if(x=10):10分配給x(切記單個(gè)等號(hào)是賦值運(yùn)算符),因此x現(xiàn)在為10。然后'if'條件求值10,其總是為真,由于任何非零數(shù)值都為真值。由此,i
34、f (x = 10)將總是求值為真,這不是使用if語(yǔ)句所期望的結(jié)果。另外,變量x將被設(shè)置為10,這也不是期望的操作。if也可以是使用if.else的分支控制結(jié)構(gòu)的一部分。布爾運(yùn)算符它們可用于if語(yǔ)句中的條件&& (邏輯與)只有在兩個(gè)操作數(shù)都為真時(shí)才返回真,例如:if (digitalRead(2) = HIGH && digitalRead(3) = HIGH) / read two switches / . 只在兩個(gè)輸入都為高時(shí)返回真| (邏輯或)任意一個(gè)為真時(shí)返回真,例如:if (x > 0 | y > 0) / . x或y任意一個(gè)大于0時(shí)返回真
35、! (非)當(dāng)操作數(shù)為假時(shí)返回真,例如:if (!x) / . 若x為假返回真(即如果x等于0)警告確保你沒有把布爾與運(yùn)算符,&&(兩個(gè)與符號(hào))錯(cuò)認(rèn)為按位與運(yùn)算符&(單個(gè)與符號(hào))。它們是完全不同的概念。同樣,不要混淆布爾或運(yùn)算符|(雙豎杠)與按位或運(yùn)算符|(單豎杠)。按位取反(波浪號(hào))看起來與布爾非!有很大不同(感嘆號(hào)或程序員口中的“棒”),但是你仍然必須確保在什么地方用哪一個(gè)。例如 if (a >= 10 && a <= 20) / true if a is between 10 and 20指針運(yùn)算符&(引用)和 *(間接引用)指針
36、對(duì)于初學(xué)者來說是更復(fù)雜的對(duì)象之一。并且可能寫大量的Arduino程序甚至都不會(huì)遇到指針。無論如何,巧妙地控制特定的數(shù)據(jù)結(jié)構(gòu),使用指針可以簡(jiǎn)化代碼,而且在自己工具箱中擁有熟練控制指針的知識(shí)是很方便的。位運(yùn)算位與按位與(&)按位操作符在變量的位級(jí)執(zhí)行運(yùn)算。它們幫助解決各種常見的編程問題。以下大部分資料來自一個(gè)有關(guān)位數(shù)學(xué)的優(yōu)秀教程,或許可以在這里找到。1描述和語(yǔ)法以下是所有這些運(yùn)算符的描述和語(yǔ)法。更詳細(xì)的資料或許可以在參考指南中找到。按位與(&)在C+中按位與運(yùn)算符是單個(gè)與符號(hào),用于其它兩個(gè)整型表達(dá)式之間使用。按位與運(yùn)算獨(dú)立地在周圍的表達(dá)式的每一位上執(zhí)行操作。根據(jù)這一規(guī)則:如果兩個(gè)輸
37、入位都是1,結(jié)果輸出1,否則輸出0。表達(dá)這一思想的另一個(gè)方法是: 0 0 1 1 operand1 0 1 0 1 operand2 - 0 0 0 1 (operand1 & operand2) - returned result 在Arduino中,int型是16位的。所以在兩個(gè)整型表達(dá)式之間使用&將會(huì)導(dǎo)致16個(gè)與運(yùn)算同時(shí)發(fā)生。代碼片斷就像這樣: int a = 92; / in binary: 0000000001000 int b = 101; / in binary: 00000000000101 int c = a & b; / result: 000000
38、0001000100, or 68 in decimal.在a和b的16位的每一位將使用按位與處理。且所有16位結(jié)果存入C中,以二進(jìn)制存入的結(jié)果值01000100,即十進(jìn)制的68。按位與的其中一個(gè)最常用的用途是從一個(gè)整型數(shù)中選擇特定的位,常被稱為掩碼屏蔽。看如下示例:位或按位或(|)在C+中按位或運(yùn)算符是垂直的條桿符號(hào),|。就像&運(yùn)算符,|獨(dú)立地計(jì)算它周圍的兩個(gè)整型表達(dá)式的每一位。(當(dāng)然)它所做的是不同的(操作)。兩個(gè)輸入位其中一個(gè)或都是1按位或?qū)⒌玫?,否則為0。換句話說: 0 0 1 1 operand1 0 1 0 1 operand2 - 0 1 1 1 (operand1 |
39、 operand2) - returned result 這是一個(gè)使用一小斷C+代碼描述的按位或(運(yùn)算)的例子: int a = 92; / in binary: 0000000001000 int b = 101; / in binary: 00000000000101 int c = a | b; / result: 00000000001, or 5 in decimal.按位與和按位或的一個(gè)共同的工作是在端口上進(jìn)行程序員稱之為讀-改-寫的操作。在微控制器中,每個(gè)端口是一個(gè)8位數(shù)字,每一位表示一個(gè)引腳的狀態(tài)。寫一個(gè)端口可以同時(shí)控制所有的引腳。PORTD是內(nèi)建的參照數(shù)字口0,1,2,3,4
40、,5,6,7的輸出狀態(tài)的常量。如果一個(gè)比特位是1,那么該引腳置高。(引腳總是需要用pinMode()指令設(shè)置為輸出模式)。所以如果我們寫入PORTD = B000001;我們就會(huì)讓引腳2,3和7輸出高。一個(gè)小小的問題是,我們同時(shí)也改變了某些引腳的0,1狀態(tài)。這用于Arduino與串口通訊,所以我們可能會(huì)干擾串口通訊。我們的程序規(guī)則是:僅僅獲取和清除我們想控制的與相應(yīng)引腳對(duì)應(yīng)的位(使用按位與)。合并要修改的PORTD值與所控制的引腳的新值(使用按位或)。int i; / counter variableint j;void setup()DDRD = DDRD | B00; / set dire
41、ction bits for pins 2 to 7, leave 0 and 1 untouched (xx | 00 = xx)/ same as pinMode(pin, OUTPUT) for pins 2 to 7Serial.begin(9600);void loop()for (i=0; i<64; i+)PORTD = PORTD & B000000; / clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & = xx)j = (i << 2); / shift variable up
42、 to pins 2 - 7 - to avoid pins 0 and 1PORTD = PORTD | j; / combine the port information with the new information for LED pinsSerial.println(PORTD, BIN); / debug to show maskingdelay(100); 位異或按位異或()在C+中有一個(gè)有點(diǎn)不尋常的操作,它被稱為按位異或,或者XOR(在英語(yǔ)中,通常讀作“eks-or”)。按位異或運(yùn)算符使用符號(hào)。該運(yùn)算符與按位或運(yùn)算符“|”非常相似 ,唯一的不同是當(dāng)輸入位都為1時(shí)它返回0。 0
43、 0 1 1 operand1 0 1 0 1 operand2 - 0 1 1 0 (operand1 operand2) - returned result看待XOR的另一個(gè)視角是,當(dāng)輸入不同時(shí)結(jié)果為1,當(dāng)輸入相同時(shí)結(jié)果為0。這里是一個(gè)簡(jiǎn)單的示例代碼: int x = ; / binary: 00 int y = 10; / binary: 1010 int z = x y; / binary: 00, or decimal 6“”運(yùn)算符常用于翻轉(zhuǎn)整數(shù)表達(dá)式的某些位(例如從0變?yōu)?,或從1變?yōu)?)。在一個(gè)按位異或操作中,如果相應(yīng)的掩碼位為1, 該位將翻轉(zhuǎn),如果為0,該位不變。以下是一個(gè)閃爍
44、引腳5的程序./ Blink_Pin_5/ demo for Exclusive ORvoid setup()DDRD = DDRD | B00100000; / set digital pin five as OUTPUT Serial.begin(9600);void loop()PORTD = PORTD B00100000; / invert bit 5 (digital pin 5), leave others untoucheddelay(100);位非按位取反()在C+中按位取反運(yùn)算符為波浪符“”。不像“&”和“|”,按位取反運(yùn)算符應(yīng)用于其右側(cè)的單個(gè)操作數(shù)。按位取反操作會(huì)
45、翻轉(zhuǎn)其每一位。0變?yōu)?,1變?yōu)?。例如: 0 1 operand1 - 1 0 operand1 int a = 103; / binary: 00000000000 int b = a; / binary: 00000 = -104 看到此操作的結(jié)果為一個(gè)負(fù)數(shù):-104,你可能會(huì)感到驚訝,這是因?yàn)橐粋€(gè)整型變量的最高位是所謂的符號(hào)位。如果最高位為1,該整數(shù)被解釋為負(fù)數(shù)。這里正數(shù)和負(fù)數(shù)的編碼被稱為二進(jìn)制補(bǔ)碼。欲了解更多信息,請(qǐng)參閱維基百科條目:補(bǔ)碼。順便說一句,值得注意的是,對(duì)于任何整數(shù)x, x 與 -x-1 相等。有時(shí)候,符號(hào)位在有符號(hào)整數(shù)表達(dá)式中能引起一些不期的意外。左移、右移左移運(yùn)算(&l
46、t;<),右移運(yùn)算(>>)描述From The Bitmath Tutorial in The Playground在C+中有兩個(gè)移位運(yùn)算符:左移運(yùn)算符<<和右移運(yùn)算符>>。這些運(yùn)算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。語(yǔ)法variable << number_of_bits variable >> number_of_bits 參數(shù)<br> *variable - (byte, int, long) number_of_bits integer <= <br>示例:<br>
47、; <pre style="color:green"> int a = 5; / binary: 0000000000000101 int b = a << 3; / binary: 0000000000101000, or 40 in decimal int c = b >> 3; / binary: 0000000000000101, or back to 5 like we started with當(dāng)把x左移y位(x << y),x中最左邊的y位將會(huì)丟失。 int a = 5; / binary: 00000000000
48、00101如果您確信沒有值被移出,理解左移位運(yùn)算符一個(gè)簡(jiǎn)單的辦法是,把它的左操作數(shù)乘2將提高其冪值。例如,要生成2的乘方,可以使用以下表達(dá)式: 1 << 0 = 1 1 << 1 = 2 1 << 2 = 4 1 << 3 = 8 . 1 << 8 = 256 1 << 9 = 5 1 << 10 = 1024 . 當(dāng)把x右移y位,x的最高位為1,該行為依賴于x的確切的數(shù)據(jù)類型。如果x的類型是int,最高位為符號(hào)位,決定x是不是負(fù)數(shù),正如我們?cè)谏厦嬉呀?jīng)討論過的。在這種情況下,符號(hào)位會(huì)復(fù)制到較低的位: int x
49、 = -16; / binary: 0000 int y = x >> 3; / binary: 0該行為,被稱為符號(hào)擴(kuò)展,常常不是你所期待的。反而,你可能希望移入左邊的是0。事實(shí)上右移規(guī)則對(duì)于無符合整型表達(dá)式是不同的。所以你可以使用強(qiáng)制類型轉(zhuǎn)換來避免左邊移入1。 int x = -16; / binary: 0000 int y = (unsigned int)x >> 3; / binary: 0000 如果你可以很小心地避免符號(hào)擴(kuò)展,你可以使用右移位運(yùn)算符>>,作為除以2的冪的一種方法。例如 int x = 1000; int y = x >&g
50、t; 3; / 1000除以8,得y = 5.復(fù)合運(yùn)算符自加+i+; /相當(dāng)于 i = i + 1;自減-i-; /相當(dāng)于 i = i - 1;復(fù)合加+=i+=5; /相當(dāng)于 i = i + 5;復(fù)合減-=i-=5; /相當(dāng)于 i = i - 5;復(fù)合乘*=i*=5; /相當(dāng)于 i = i * 5;復(fù)合除/=i/=5; /相當(dāng)于 i = i / 5;復(fù)合與&=i&=5; /相當(dāng)于 i = i & 5;復(fù)合或|=i|=5; /相當(dāng)于 i = i | 5;變量常量constants是在Arduino語(yǔ)言里預(yù)定義的變量。它們被用來使程序更易閱讀。我們按組將常量分類。邏輯層定義,true與false(布爾Boolean常量)在Arduino內(nèi)有兩個(gè)常量用來表示真和假:true和 false。false在這兩個(gè)常量中false更容易被定義。false被定義為0(零)。truetrue通常被定義為1,這是正確的,但true具有更廣泛的定義。在布爾含義(Boolean sense)里任何 非零 整數(shù) 為true。所以在布爾含義內(nèi)-1,2和-200都定義為ture。 需要注意的是true和false常量,不同于HIGH,LOW,INPUT和OUTPUT,需要全部小寫。這里引申一下題外話arduino
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年統(tǒng)計(jì)學(xué)考試相關(guān)數(shù)據(jù)處理試題及答案
- 吸引力與技術(shù)的美容師考試試題及答案
- 二手車現(xiàn)場(chǎng)評(píng)估準(zhǔn)備工作試題及答案
- 寵物營(yíng)養(yǎng)師考試知識(shí)點(diǎn)解析試題及答案
- 2024年美容師誠(chéng)信經(jīng)營(yíng)考量試題及答案
- 2024年小自考行政管理考試重點(diǎn)試題試題及答案
- 汽車美容器械的維護(hù)與保養(yǎng)試題及答案
- 2024-2025學(xué)年內(nèi)蒙古巴彥淖爾一中高一下學(xué)期第一次學(xué)業(yè)診斷生物及答案
- 2024年計(jì)算機(jī)基礎(chǔ)考試知識(shí)整合試題及答案
- 關(guān)于寵物營(yíng)養(yǎng)師職業(yè)倫理的討論試題及答案
- 【基于單片機(jī)的電子密碼鎖設(shè)計(jì)(論文)10000字】
- 湖南省長(zhǎng)沙市2024年中考地理試題
- 蜘蛛開店第二課時(shí) 教案
- 模擬試卷:2023-2024學(xué)年八年級(jí)下學(xué)期語(yǔ)文期中模擬考試(考試版A4)【測(cè)試范圍:1-3單元】(廣東深圳專用)
- 零星維修工程投標(biāo)方案(技術(shù)方案)
- DBJ04∕T 390-2019 基坑工程裝配式鋼支撐技術(shù)標(biāo)準(zhǔn)
- 痕跡檢驗(yàn)練習(xí)題
- 佛山市2023-2024學(xué)年高二下學(xué)期7月期末英語(yǔ)試題(解析版)
- 人教版數(shù)學(xué)四年級(jí)下冊(cè)3運(yùn)算定律《解決問題策略的多樣性》說課稿
- 注射相關(guān)感染預(yù)防與控制(全文)
- GB 31825-2024制漿造紙單位產(chǎn)品能源消耗限額
評(píng)論
0/150
提交評(píng)論