Arduino編程參考手冊中文版

上傳人:jun****875 文檔編號(hào):18662443 上傳時(shí)間:2021-01-02 格式:DOC 頁數(shù):54 大?。?61.41KB
收藏 版權(quán)申訴 舉報(bào) 下載
Arduino編程參考手冊中文版_第1頁
第1頁 / 共54頁
Arduino編程參考手冊中文版_第2頁
第2頁 / 共54頁
Arduino編程參考手冊中文版_第3頁
第3頁 / 共54頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《Arduino編程參考手冊中文版》由會(huì)員分享,可在線閱讀,更多相關(guān)《Arduino編程參考手冊中文版(54頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、Arduino編程參考手冊 首頁 程序結(jié)構(gòu) setup() loop() 控制結(jié)構(gòu) if if...else for switch case while do...while break continue return goto 相關(guān)語法 ; 分號(hào) { 大括號(hào) // 單行注釋 /**/ 多行注釋 #define 宏定義 #include 文件包含 算術(shù)運(yùn)算符 = 賦值 + (加) - (減) * (乘) / (除) % (取模) 比較運(yùn)算符 == 等于 != (不等于) < (小于) > (大于) <= (小

2、于等于) >= (大于等于) 布爾運(yùn)算符 && (邏輯與) || (邏輯或) ! (邏輯非) 指針運(yùn)算符 * 指針運(yùn)算符 & 地址運(yùn)算符 位運(yùn)算 & (位與) | (位或) ^ (位異或) ~ (位非) << (左移) >> (右移) 復(fù)合運(yùn)算符 ++ (自加) -- (自減) += (復(fù)合加) -= (復(fù)合減) *= (復(fù)合乘) /= (復(fù)合除) &= (復(fù)合與) |= (復(fù)合或) 范圍 HIGH | LOW INPUT | OUTPUT true | false 整型常量 浮點(diǎn)數(shù)常量 數(shù)據(jù)類型 void boolean

3、char unsigned char byte int unsigned int word long unsigned long float double string String(c++) array 數(shù)據(jù)類型轉(zhuǎn)換 char() byte() int() word() long() float() 變量作用域 變量作用域 static (靜態(tài)變量) volatile (易變變量) const (不可改變變量) 輔助工具 sizeof() (sizeof運(yùn)算符) ASCII碼表 數(shù)字I/O pinMode() digitalWrit

4、e() digitalRead() 模擬I/O analogReference() analogRead() analogWrite() 指高級(jí)I/O shiftOut() pulseIn() 時(shí)間 millis() delay(ms) delayMicroseconds(us) 數(shù)學(xué)庫 min() max() abs() constrain() map() pow() sqrt() 三角函數(shù) sin(rad) cos(rad) tan(rad) 隨機(jī)數(shù) randomSeed() random() random() 位操作 lowBy

5、te() highByte() bitRead() bitWrite() bitSet() bitClear() bit() 設(shè)置中斷函數(shù) attachInterrupt() detachInterrupt() interrupts() noInterrupts() 串口通訊 begin() available() read() flush print() println() write() peak() serialEvent() 程序結(jié)構(gòu) (本節(jié)直譯自Arduino官網(wǎng)最新Reference) 在Arduino中, 標(biāo)準(zhǔn)的程序入口

6、main函數(shù)在內(nèi)部被定義, 用戶只需要關(guān)心以下兩個(gè)函數(shù): setup() 當(dāng)Arduino板起動(dòng)時(shí)setup()函數(shù)會(huì)被調(diào)用。用它來初始化變量,引腳模式,開始使用某個(gè)庫,等等。該函數(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 buttonPin = 3; void setup() { Serial.begin(9600); //初始化串口 pinMode(buttonPi

7、n, INPUT); //設(shè)置3號(hào)引腳為輸入模式 } void loop() { if (digitalRead(buttonPin) == HIGH) serialWrite(H); else serialWrite(L); delay(1000); } 控制語句 if if,用于與比較運(yùn)算符結(jié)合使用,測試是否已達(dá)到某些條件,例如一個(gè)輸入數(shù)據(jù)在某個(gè)范圍之外。使用格式如下: if (value > 50) { // 這里加入你的代碼 } 該程序測試value是否大于50。如果是,程序?qū)?zhí)行特定的動(dòng)作。換句話說,如果圓括號(hào)中的

8、語句為真,大括號(hào)中的語句就會(huì)執(zhí)行。如果不是,程序?qū)⑻^這段代碼。大括號(hào)可以被省略,如果這么做,下一行(以分號(hào)結(jié)尾)將成為唯一的條件語句。 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); }

9、 // 都是正確的 圓括號(hào)中要被計(jì)算的語句需要一個(gè)或多個(gè)操作符。 if...else 與基本的if語句相比,由于允許多個(gè)測試組合在一起,if/else可以使用更多的控制流。例如,可以測試一個(gè)模擬量輸入,如果輸入值小于500,則采取一個(gè)動(dòng)作,而如果輸入值大于或等于500,則采取另一個(gè)動(dòng)作。代碼看起來像是這樣: if (pinFiveInput < 500) { // 動(dòng)作A } else { // 動(dòng)作B } else中可以進(jìn)行另一個(gè)if測試,這樣多個(gè)相互獨(dú)立的測試就可以同時(shí)進(jìn)行。每一個(gè)測試一個(gè)接一個(gè)地執(zhí)行直到遇到一個(gè)測

10、試為真為止。當(dāng)發(fā)現(xiàn)一個(gè)測試條件為真時(shí),與其關(guān)聯(lián)的代碼塊就會(huì)執(zhí)行,然后程序?qū)⑻酵暾膇f/else結(jié)構(gòu)的下一行。如果沒有一個(gè)測試被驗(yàn)證為真。缺省的else語句塊,如果存在的話,將被設(shè)為默認(rèn)行為,并執(zhí)行。 注意:一個(gè)else if語句塊可能有或者沒有終止else語句塊,同理。每個(gè)else if分支允許有無限多個(gè)。 if (pinFiveInput < 500) { // 執(zhí)行動(dòng)作A } else if (pinFiveInput >= 1000) { // 執(zhí)行動(dòng)作B } else { // 執(zhí)行動(dòng)作C } 另外一種表達(dá)互斥分支測試的方式,是使用switc

11、h case語句。 for for語句 描述 for語句用于重復(fù)執(zhí)行被花括號(hào)包圍的語句塊。一個(gè)增量計(jì)數(shù)器通常被用來遞增和終止循環(huán)。for語句對(duì)于任何需要重復(fù)的操作是非常有用的。常常用于與數(shù)組聯(lián)合使用以收集數(shù)據(jù)/引腳。for循環(huán)的頭部有三個(gè)部分: for (初始化部分; 條件判斷部分; 數(shù)據(jù)遞增部分) { //語句塊 。。。 } 初始化部分被第一個(gè)執(zhí)行,且只執(zhí)行一次。每次通過這個(gè)循環(huán),條件判斷部分將被測試;如果為真,語句塊和數(shù)據(jù)遞增部分就會(huì)被執(zhí)行,然后條件判斷部分就會(huì)被再次測試,當(dāng)條件測試為假時(shí),結(jié)束循環(huán)。 示例: //使用一個(gè)PWM引腳使LED燈閃爍 int

12、 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ī)語言中發(fā)現(xiàn)的for循環(huán)要靈活的多,包括BASIC。三個(gè)頭元素中的任何一個(gè)或全部可能被省略,盡管分號(hào)是必須的。而且初始化部分、條件判斷部分和數(shù)據(jù)遞增部分可以是任何合法的使用任意變量的C語句。且可以

13、使用任何數(shù)據(jù)類型包括floats。這些不常用的類型用于語句段也許可以為一些罕見的編程問題提供解決方案。 例如,在遞增部分中使用一個(gè)乘法將形成對(duì)數(shù)級(jí)增長: for(int x = 2; x < 100; x = x * 1.5){ println(x); } 輸出: 2,3,4,6,9,13,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)

14、; if (i == 255) x = -1; // 在峰值切換方向 delay(10); } } switch case switch case 語句 就像if語句,switch...case通過允許程序員根據(jù)不同的條件指定不同的應(yīng)被執(zhí)行的代碼來控制程序流。特別地,一個(gè)switch語句對(duì)一個(gè)變量的值與case語句中指定的值進(jìn)行比較。當(dāng)一個(gè)case語句被發(fā)現(xiàn)其值等于該變量的值。就會(huì)運(yùn)行這個(gè)case語句下的代碼。 break關(guān)鍵字將中止并跳出switch語句段,常常用于每個(gè)case語句的最后面。如果沒有break語句,s

15、witch語句將繼續(xù)執(zhí)行下面的表達(dá)式(“持續(xù)下降”)直到遇到break,或者是到達(dá)switch語句的末尾。 示例: switch (var) { case 1: //當(dāng)var等于1執(zhí)行這里 break; case 2: //當(dāng)var等于2執(zhí)行這里 break; default: // 如果沒有匹配項(xiàng),將執(zhí)行此缺省段 // default段是可選的 } 語法 switch (var) { case label: // statements

16、 break; case label: // statements break; default: // statements } 參數(shù) var: 與不同的case中的值進(jìn)行比較的變量 label: 相應(yīng)的case的值 while while循環(huán) 描述: while循環(huán)將會(huì)連續(xù)地?zé)o限地循環(huán),直到圓括號(hào)()中的表達(dá)式變?yōu)榧?。被測試的變量必須被改變,否則while循環(huán)將永遠(yuǎn)不會(huì)中止。這可以是你的代碼,比如一個(gè)遞增的變量,或者是一個(gè)外部條件,比如測試一個(gè)傳感器。 語法: while(expression){ // st

17、atement(s) } 參數(shù): expression - 一個(gè)(布爾型)C語句,被求值為真或假 示例: var = 0; while(var < 200){ // 做兩百次重復(fù)的事情 var++; } do...while do循環(huán) do循環(huán)與while循環(huán)使用相同方式工作,不同的是條件是在循環(huán)的末尾被測試的,所以do循環(huán)總是至少會(huì)運(yùn)行一次。 do { // 語句塊 } while (測試條件); 示例: do { delay(50); // 等待傳感器穩(wěn)定 x = readSensors();

18、 // 檢查傳感器的值 } while (x < 100); break break用于中止do,for,或while循環(huán),繞過正常的循環(huán)條件。它也用于中止switch語句。 示例: for (x = 0; x < 255; x ++) { digitalWrite(PWMpin, x); sens = analogRead(sensorPin); if (sens > threshold){ // bail out on sensor detect x = 0; break; }

19、 delay(50); } continue continue語句跳過一個(gè)循環(huán)的當(dāng)前迭代的余下部分。(do,for,或while)。通過檢查循環(huán)測試條件它將繼續(xù)進(jìn)行隨后的迭代。 示例: for (x = 0; x < 255; x ++) { if (x > 40 && x < 120){ // create jump in values continue; } digitalWrite(PWMpin, x); delay(50); } return 終止一個(gè)函數(shù),并向被調(diào)用函數(shù)并返回一個(gè)值,如果

20、你想的話。 語法: return; return value; // both forms are valid 參數(shù): value: 任何類型的變量或常量 示例: //一個(gè)函數(shù),用于對(duì)一個(gè)傳感器輸入與一個(gè)閾值進(jìn)行比較 int checkSensor(){ if (analogRead(0) > 400) { return 1; else{ return 0; } } return 關(guān)鍵字對(duì)測試一段代碼很方便,不需“注釋掉”大段的可能是錯(cuò)誤的代碼。 void loop(){ //

21、在此測試代碼是個(gè)好想法 return; // 這里是功能不正常的代碼 // 這里的代碼永遠(yuǎn)也不會(huì)執(zhí)行 } goto 在程序中轉(zhuǎn)移程序流到一個(gè)標(biāo)記點(diǎn) 語法: label: goto label; // sends program flow to the label 提示: 在C程序中不建議使用goto,而且一些C編程書的作者主張永遠(yuǎn)不要使用goto語句,但是明智地使用它可以 簡化某些代碼。許多程序員不贊成使用goto的原因是,無節(jié)制地使用goto語句很容易產(chǎn)生執(zhí)行流混亂的很難被調(diào)試程序。 盡管如是說,仍然有很多使用goto語句而大大簡化編碼的實(shí)例。其中之一就是從

22、一個(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;} // 其它語句。。。 } } } bailout: 相關(guān)語法 分號(hào) 用于一個(gè)語句的結(jié)束 示例 int a = 13; 提示

23、 忘記在一行的末尾加一個(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語言的主要組成部分。它們用在幾個(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ì)高亮顯示。 目前

24、此功能有些許錯(cuò)誤,因?yàn)镮DE經(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語句,在條件語句中替換ENDIF語句和在FOR循環(huán)中替換NEXT語句。 由于大括號(hào)的使用是如此的多樣,當(dāng)插入一個(gè)需要大括號(hào)的結(jié)構(gòu)時(shí),直接在打出開括號(hào)之后打出閉括號(hào)是個(gè)不錯(cuò)的編程實(shí)踐。然后在大括號(hào)之間插入一些回車符,接著開始插入語句。你的大括號(hào),還有你的態(tài)度,將永遠(yuǎn)不會(huì)變得不平衡。 不平衡的大括號(hào)常常導(dǎo)致古怪的,難以理解的編譯器錯(cuò)誤,有時(shí)在大型程序中很難查出。因?yàn)樗鼈兊亩鄻拥氖褂?,?/p>

25、括號(hào)對(duì)于程序的語法也是極其重要的,對(duì)一個(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 condit

26、ion; incrementing expr) { statement(s) } //條件語句 if (boolean expression) { statement(s) } else if (boolean expression) { statement(s) } else { statement(s) } 注釋 注釋是程序中的一些行,用于讓自己或他人了解程序的工作方式。他們會(huì)被編譯器忽略,而不會(huì)輸出到控制器,所以它們不會(huì)占用Atmega芯片上

27、的任何空間。 注釋唯一的目的是幫助你理解(或記憶)你的程序是怎樣工作的,或者是告知其他人你的程序是怎樣工作的。標(biāo)記一行為注釋只有兩種方式: 示例 x = 5; //這是一個(gè)單行注釋。此斜線后的任何內(nèi)容都是注釋 //直到該行的結(jié)尾 /* 這是多行注釋 - 用它來注釋掉整個(gè)代碼塊 if (gwb == 0){ //在多行注釋中使用單行注釋是沒有問題的 x = 3; /* 但是其中不可以使用另一個(gè)多行注釋 - 這是不合法的 */ } //別忘了加上“關(guān)閉”注釋符 - 它們必須是平衡的 */ 提示 當(dāng)實(shí)驗(yàn)代碼時(shí),“注釋

28、掉”你的程序的一部分來移除可能是錯(cuò)誤的行是一種方便的方法。這不是把這些行從程序中移除,而是把它們放到注釋中,所以編譯器就會(huì)忽略它們。這在定位問題時(shí),或者當(dāng)程序無法編譯通過且編譯錯(cuò)誤信息很古怪或沒有幫助時(shí)特別有用。 define #define 宏定義 宏定義是一個(gè)有用的C組件,它允許程序員在程序編譯前給常量取一個(gè)名字。在arduino中定義的常量不會(huì)在芯片中占用任何程序空間。編譯器在編譯時(shí)會(huì)將這些常量引用替換為定義的值。 這雖然可能有些有害的副作用,舉例來說,一個(gè)已被定義的常量名被包含在一些其它的常量或變量名中。那樣的話該文本將被替換成被定義的數(shù)字(或文本)。 通常,用const

29、關(guān)鍵字定義常量是更受歡迎的且用來代替#define會(huì)很有用。 Arduino宏定義與C宏定義有同樣的語法 語法 #define constantName value 注意‘#’是必須的 示例: #define ledPin 3 // 編譯器在編譯時(shí)會(huì)將任何提及l(fā)edPin的地方替換成數(shù)值3。 提示 #define語句的后面分號(hào)。如果你加了一個(gè),編譯器將會(huì)在進(jìn)一步的頁面引發(fā)奇怪的錯(cuò)誤。 #define ledPin 3; // this is an error 類似地,包含一個(gè)等號(hào)通常也會(huì)在進(jìn)一步的頁面引發(fā)奇怪的編譯錯(cuò)誤。 #define ledPin = 3

30、 // this is also an error include #include 包含 #include用于在你的sketch中包含外部的庫。這使程序員可以訪問一個(gè)巨大的標(biāo)準(zhǔn)C庫(預(yù)定義函數(shù)集合)的集合。 AVR C庫(AVR是Atmel芯片的一個(gè)基準(zhǔn),Arduino正是基于它)的主參考手冊頁在這里。 注意#include和#define相似,沒有分號(hào)終止符,且如果你加了,編譯器會(huì)產(chǎn)生奇怪的錯(cuò)誤信息。 示例 該示例包含一個(gè)用于輸出數(shù)據(jù)到程序空間閃存的庫,而不是內(nèi)存。這會(huì)為動(dòng)態(tài)內(nèi)存需求節(jié)省存儲(chǔ)空間且使需要?jiǎng)?chuàng)建巨大的查找表變得更實(shí)際。 #include

31、gmspace.h> 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}; 算術(shù)運(yùn)算符 賦值 =賦值運(yùn)算符(單個(gè)等號(hào)) 把等號(hào)右邊的值存儲(chǔ)到等號(hào)左邊的變量中。 在C語言中單個(gè)等號(hào)被稱為賦值運(yùn)算符。它與在代數(shù)課中的意義不同,后者象征等式或相等。賦值運(yùn)算符告訴微控制器求值等號(hào)右邊的變量或表達(dá)式,然后把結(jié)果存入等號(hào)左邊的變量中。 示例 int sensVal;

32、 //聲明一個(gè)名為sensVal的整型變量 senVal = analogRead(0); //存儲(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是整型

33、數(shù)。這也意味著運(yùn)算會(huì)溢出,如果結(jié)果超出其在相應(yīng)的數(shù)據(jù)類型下所能表示的數(shù)。(例如,給整型數(shù)值32767加1結(jié)果是-32768)。如果運(yùn)算對(duì)象是不同的類型,會(huì)用那個(gè)較大的類型進(jìn)行計(jì)算。 如果其中一個(gè)數(shù)字(運(yùn)算符)是float類型或double類型,將采用浮點(diǎn)數(shù)進(jìn)行計(jì)算。 示例 y = y + 3; x = x - 7; i = j * 6; r = r / 5; 語法 result = value1 + value2; result = value1 - value2; result = value1 * value2; result = value1 / value2;

34、參數(shù): value1:任何變量或常量 value2:任何變量或常量 編程技巧: 要知道整型常量默認(rèn)為int型,因此一些常量計(jì)算可能會(huì)溢出(例如:60 * 1000將產(chǎn)生負(fù)的結(jié)果) 選擇一個(gè)大小足夠大的變量以容納你的最大的計(jì)算結(jié)果。 要知道你的變量在哪一點(diǎn)將會(huì)“翻轉(zhuǎn)”且要知道在另一個(gè)方向上會(huì)發(fā)生什么,例如:(0 - 1)或(0 - 32768)。 對(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ù)

35、。這對(duì)于保持一個(gè)變量在一個(gè)特定的范圍很有用(例如:數(shù)組的大?。? 語法 result = dividend % divisor 參數(shù) dividend: 被除數(shù) divisor: 除數(shù) 結(jié)果:余數(shù) 示例 x = 7 % 5; // x now contains 2 x = 9 % 5; // x now contains 4 x = 5 % 5; // x now contains 0 x = 4 % 5; // x now contains 4 示例代碼 /* update one value in an array each time thr

36、ough a loop */ int values[10]; int i = 0; void setup() {} void loop() { values[i] = analogRead(0); i = (i + 1) % 10; // modulo operator rolls over variable } 提示: 取模運(yùn)算符不能用于浮點(diǎn)型數(shù)。 比較運(yùn)算符 if(條件) and ==, !=, <, > (比較運(yùn)算符) if,用于和比較運(yùn)算符聯(lián)合使用,測試某一條件是否到達(dá),例如一個(gè)輸入超出某一數(shù)值。if條件測試的格式: if (s

37、omeVariable > 50) { // do something here } 該程序測試someVariable是否大于50。如果是, 程序執(zhí)行特定的動(dòng)作。換句話說,如果圓括號(hào)中的語句為真,花括號(hào)中的語句就會(huì)運(yùn)行。否則,程序跳過該代碼。 if語句后的花括號(hào)可能被省略。如果這么做了,下一行(由分號(hào)定義的行)就會(huì)變成唯一的條件語句。 if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120) digitalWrite(LEDpin, HIGH); if (x > 120){ digitalWrite(LEDpi

38、n, HIGH); } if (x > 120){ digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); } // all are correct 圓括號(hào)中被求值的語句需要使用一個(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)

39、 x <= 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)算符,用于測試x是否等于10。后者只在x等于10時(shí)返回真,但是前者將總是為真。 這是因?yàn)镃如下求值語句if(x=10):10分配給x(切記單個(gè)等號(hào)是賦值運(yùn)算符),因此x現(xiàn)在為10。然后if條件求值10,其總是為真,由于任何非零數(shù)值都為真值。

40、由此,if (x = 10)將總是求值為真,這不是使用if語句所期望的結(jié)果。另外,變量x將被設(shè)置為10,這也不是期望的操作。 if也可以是使用[if...else]的分支控制結(jié)構(gòu)的一部分。 布爾運(yùn)算符 它們可用于if語句中的條件 && (邏輯與) 只有在兩個(gè)操作數(shù)都為真時(shí)才返回真,例如: if (digitalRead(2) == HIGH && digitalRead(3) == HIGH) { // read two switches // ... } 只在兩個(gè)輸入都為高時(shí)返回真 || (邏輯或) 任意一個(gè)為真時(shí)返回真,例如: if (x >

41、0 || y > 0) { // ... } x或y任意一個(gè)大于0時(shí)返回真 ! (非) 當(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){}

42、// true if a is between 10 and 20 指針運(yùn)算符 &(引用)和 *(間接引用) 指針對(duì)于C初學(xué)者來說是更復(fù)雜的對(duì)象之一。并且可能寫大量的Arduino程序甚至都不會(huì)遇到指針。 無論如何,巧妙地控制特定的數(shù)據(jù)結(jié)構(gòu),使用指針可以簡化代碼,而且在自己工具箱中擁有熟練控制指針的知識(shí)是很方便的。 位運(yùn)算 位與 按位與(&) 按位操作符在變量的位級(jí)執(zhí)行運(yùn)算。它們幫助解決各種常見的編程問題。以下大部分資料來自一個(gè)有關(guān)位數(shù)學(xué)的優(yōu)秀教程,或許可以在這里找到。[1] 描述和語法 以下是所有這些運(yùn)算符的描述和語法。更詳細(xì)的資料或許可以在參考指南中找到

43、。 按位與(&) 在C++中按位與運(yùn)算符是單個(gè)與符號(hào), 用于其它兩個(gè)整型表達(dá)式之間使用。按位與運(yùn)算獨(dú)立地在周圍的表達(dá)式的每一位上執(zhí)行操作。根據(jù)這一規(guī)則:如果兩個(gè)輸入位都是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í)

44、發(fā)生。代碼片斷就像這樣: int a = 92; // in binary: 0000000001011100 int b = 101; // in binary: 0000000001100101 int c = a & b; // result: 0000000001000100, or 68 in decimal. 在a和b的16位的每一位將使用按位與處理。且所有16位結(jié)果存入C中,以二進(jìn)制存入的結(jié)果值01000100,即十進(jìn)制的68。 按位與的其中一個(gè)最常用的用途是從一個(gè)整型數(shù)中選擇特定的位,常被稱為掩碼屏蔽??慈缦率纠?

45、 位或 按位或(|) 在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 | operand2) - returned result 這是一個(gè)使用一小斷C++代碼描述的按位或(運(yùn)算)的例子: int a = 92;

46、 // in binary: 0000000001011100 int b = 101; // in binary: 0000000001100101 int c = a | b; // result: 0000000001111101, or 125 in decimal. 按位與和按位或的一個(gè)共同的工作是在端口上進(jìn)行程序員稱之為讀-改-寫的操作。在微控制器中,每個(gè)端口是一個(gè)8位數(shù)字,每一位表示一個(gè)引腳的狀態(tài)。寫一個(gè)端口可以同時(shí)控制所有的引腳。 PORTD是內(nèi)建的參照數(shù)字口0,1,2,3,4,5,6,7的輸出狀態(tài)的常量。如果一個(gè)比特位是1,那么該

47、引腳置高。(引腳總是需要用pinMode()指令設(shè)置為輸出模式)。所以如果我們寫入PORTD = B00110001;我們就會(huì)讓引腳2,3和7輸出高。一個(gè)小小的問題是,我們同時(shí)也改變了某些引腳的0,1狀態(tài)。這用于Arduino與串口通訊,所以我們可能會(huì)干擾串口通訊。 我們的程序規(guī)則是: 僅僅獲取和清除我們想控制的與相應(yīng)引腳對(duì)應(yīng)的位(使用按位與)。 合并要修改的PORTD值與所控制的引腳的新值(使用按位或)。 int i; // counter variable int j; void setup(){ DDRD = DDRD | B11111100; // set dir

48、ection bits for pins 2 to 7, leave 0 and 1 untouched (xx | 00 == xx) // same as pinMode(pin, OUTPUT) for pins 2 to 7 Serial.begin(9600); } void loop(){ for (i=0; i<64; i++){ PORTD = PORTD & B00000011; // clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & 11 == xx) j = (i << 2);

49、 // shift variable up to pins 2 - 7 - to avoid pins 0 and 1 PORTD = PORTD | j; // combine the port information with the new information for LED pins Serial.println(PORTD, BIN); // debug to show masking delay(100); } } 位異或 按位異或(^) 在C++中有一個(gè)有點(diǎn)不尋常的操作,它被稱為按位異或,或者XOR(在英語

50、中,通常讀作“eks-or”)。按位異或運(yùn)算符使用符號(hào)^。該運(yùn)算符與按位或運(yùn)算符“|”非常相似 ,唯一的不同是當(dāng)輸入位都為1時(shí)它返回0。 0 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è)簡單的示例代碼: int x = 12; // binary: 1100

51、 int y = 10; // binary: 1010 int z = x ^ y; // binary: 0110, or decimal 6 “^”運(yùn)算符常用于翻轉(zhuǎn)整數(shù)表達(dá)式的某些位(例如從0變?yōu)?,或從1變?yōu)?)。在一個(gè)按位異或操作中,如果相應(yīng)的掩碼位為1, 該位將翻轉(zhuǎn),如果為0,該位不變。以下是一個(gè)閃爍引腳5的程序. // Blink_Pin_5 // demo for Exclusive OR void setup(){ DDRD = DDRD | B00100000; // set digital pin five as OUTPUT S

52、erial.begin(9600); } void loop(){ PORTD = PORTD ^ B00100000; // invert bit 5 (digital pin 5), leave others untouched delay(100); } 位非 按位取反(~) 在C++中按位取反運(yùn)算符為波浪符“~”。不像“&”和“|”,按位取反運(yùn)算符應(yīng)用于其右側(cè)的單個(gè)操作數(shù)。按位取反操作會(huì)翻轉(zhuǎn)其每一位。0變?yōu)?,1變?yōu)?。例如: 0 1 operand1 ---------- 1 0 ~ operand1

53、 int a = 103; // binary: 0000000001100111 int b = ~a; // binary: 1111111110011000 = -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á)式中能引起一些不期的意外。 左移、右移

54、 左移運(yùn)算(<<),右移運(yùn)算(>>) 描述 From The Bitmath Tutorial in The Playground 在C++中有兩個(gè)移位運(yùn)算符:左移運(yùn)算符<<和右移運(yùn)算符>>。這些運(yùn)算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。 語法 variable << number_of_bits variable >> number_of_bits 參數(shù)
*variable - (byte, int, long) number_of_bits integer <= 32
示例:

	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: 0000000000000101
	int b = a <

56、< 14; // binary: 0100000000000000 - 101中的第一個(gè)1被丟棄 如果您確信沒有值被移出,理解左移位運(yùn)算符一個(gè)簡單的辦法是,把它的左操作數(shù)乘2將提高其冪值。例如,要生成2的乘方,可以使用以下表達(dá)式: 1 << 0 == 1 1 << 1 == 2 1 << 2 == 4 1 << 3 == 8 ... 1 << 8 == 256 1 << 9 == 512 1 << 10 == 1024 ... 當(dāng)把x

57、右移y位,x的最高位為1,該行為依賴于x的確切的數(shù)據(jù)類型。如果x的類型是int,最高位為符號(hào)位,決定x是不是負(fù)數(shù),正如我們在上面已經(jīng)討論過的。在這種情況下,符號(hào)位會(huì)復(fù)制到較低的位: int x = -16; // binary: 1111111111110000 int y = x >> 3; // binary: 1111111111111110 該行為,被稱為符號(hào)擴(kuò)展,常常不是你所期待的。反而,你可能希望移入左邊的是0。事實(shí)上右移規(guī)則對(duì)于無符合整型表達(dá)式是不同的。所以你可以使用強(qiáng)制類型轉(zhuǎn)換來避免左邊移入1。 int x = -16;

58、 // binary: 1111111111110000 int y = (unsigned int)x >> 3; // binary: 0001111111111110 如果你可以很小心地避免符號(hào)擴(kuò)展,你可以使用右移位運(yùn)算符>>,作為除以2的冪的一種方法。例如 int x = 1000; int y = x >> 3; // 1000除以8,得y = 125. 復(fù)合運(yùn)算符 自加++ i++; //相當(dāng)于 i = i + 1; 自減-- i--; //相當(dāng)于 i = i - 1; 復(fù)合加+= i+=5; //相當(dāng)于 i = i + 5; 復(fù)

59、合減-= 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; 變量 (本節(jié)轉(zhuǎn)自極客工坊) 常量 constants是在Arduino語言里預(yù)定義的變量。它們被用來使程序更易閱讀。我們按組將常量分類。 邏輯層定義,true與false(布爾Boolean常量) 在Arduino內(nèi)有兩個(gè)常量用來表示真和假:true和 false。 fa

60、lse 在這兩個(gè)常量中false更容易被定義。false被定義為0(零)。 true true通常被定義為1,這是正確的,但true具有更廣泛的定義。在布爾含義(Boolean sense)里任何 非零 整數(shù) 為true。所以在布爾含義內(nèi)-1,2和-200都定義為ture。 需要注意的是true和false常量,不同于HIGH,LOW,INPUT和OUTPUT,需要全部小寫。 ——這里引申一下題外話arduino是大小寫敏感語言(case sensitive)。 引腳電壓定義,HIGH和LOW 當(dāng)讀?。╮ead)或?qū)懭耄╳rite)數(shù)字引腳時(shí)只有兩個(gè)可能的值: HIGH 和 LOW

61、 。 HIGH HIGH(參考引腳)的含義取決于引腳(pin)的設(shè)置,引腳定義為INPUT或OUTPUT時(shí)含義有所不同。當(dāng)一個(gè)引腳通過pinMode被設(shè)置為INPUT,并通過digitalRead讀?。╮ead)時(shí)。如果當(dāng)前引腳的電壓大于等于3V,微控制器將會(huì)返回為HIGH。 引腳也可以通過pinMode被設(shè)置為INPUT,并通過digitalWrite設(shè)置為HIGH。輸入引腳的值將被一個(gè)內(nèi)在的20K上拉電阻 控制 在HIGH上,除非一個(gè)外部電路將其拉低到LOW。 當(dāng)一個(gè)引腳通過pinMode被設(shè)置為OUTPUT,并digitalWrite設(shè)置為HIGH時(shí),引腳的電壓應(yīng)在5V。在這種狀態(tài)下

62、,它可以 輸出電流 。例如,點(diǎn)亮一個(gè)通過一串電阻接地或設(shè)置為LOW的OUTPUT屬性引腳的LED。 LOW LOW的含義同樣取決于引腳設(shè)置,引腳定義為INPUT或OUTPUT時(shí)含義有所不同。當(dāng)一個(gè)引腳通過pinMode配置為INPUT,通過digitalRead設(shè)置為讀?。╮ead)時(shí),如果當(dāng)前引腳的電壓小于等于2V,微控制器將返回為LOW。 當(dāng)一個(gè)引腳通過pinMode配置為OUTPUT,并通過digitalWrite設(shè)置為LOW時(shí),引腳為0V。在這種狀態(tài)下,它可以 倒灌 電流。例如,點(diǎn)亮一個(gè)通過串聯(lián)電阻連接到+5V,或到另一個(gè)引腳配置為OUTPUT、HIGH的的LED。 數(shù)字引腳(D

63、igital pins)定義,INPUT和OUTPUT 數(shù)字引腳當(dāng)作 INPUT 或 OUTPUT都可以 。用pinMode()方法使一個(gè)數(shù)字引腳從INPUT到OUTPUT變化。 引腳(Pins)配置為輸入(Inputs) Arduino(Atmega)引腳通過pinMode()配置為 輸入(INPUT) 即是將其配置在一個(gè)高阻抗的狀態(tài)。配置為INPUT的引腳可以理解為引腳取樣時(shí)對(duì)電路有極小的需求,即等效于在引腳前串聯(lián)一個(gè)100兆歐姆(Megohms)的電阻。這使得它們非常利于讀取傳感器,而不是為LED供電。 引腳(Pins)配置為輸出(Outputs) 引腳通過pinMode()配

64、置為 輸出(OUTPUT) 即是將其配置在一個(gè)低阻抗的狀態(tài)。 這意味著它們可以為電路提供充足的電流。Atmega引腳可以向其他設(shè)備/電路提供(提供正電流positive current)或倒灌(提供負(fù)電流negative current)達(dá)40毫安(mA)的電流。這使得它們利于給LED供電,而不是讀取傳感器。輸出(OUTPUT)引腳被短路的接地或5V電路上會(huì)受到損壞甚至燒毀。Atmega引腳在為繼電器或電機(jī)供電時(shí),由于電流不足,將需要一些外接電路來實(shí)現(xiàn)供電。 宏定義 #define HIGH 0x1 高電平 #define LOW 0x0 低電平

65、 #define INPUT 0x0 輸入 #define OUTPUT 0x1 輸出 #define true 0x1 真 #define false 0x0 假 #define PI 3.14159265 PI. #define HALF_PI 1.57079 二分之一PI #define TWO_PI 6.283185 二倍PI #define DEG_TO_RAD 0.01745329 弧度轉(zhuǎn)角度 #define RAD_TO_DEG 57.295778

66、6 角度轉(zhuǎn)弧度 整型常量 整數(shù)常量 整數(shù)常量是直接在程序中使用的數(shù)字,如123。默認(rèn)情況下,這些數(shù)字被視為int,但你可以通過U和L修飾符進(jìn)行更多的限制(見下文)。 通常情況下,整數(shù)常量默認(rèn)為十進(jìn)制,但可以加上特殊前綴表示為其他進(jìn)制。 進(jìn)制 例子 格式 備注 10(十進(jìn)制) 123 無 2(二進(jìn)制) B1111011 前綴B 只適用于8位的值(0到255)字符0-1有效 8(八進(jìn)制) 0173 前綴”0” 字符0-7有效 16(十六進(jìn)制) 0x7B 前綴”0x” 字符0-9,A-F,A-F有效 小數(shù)是十進(jìn)制數(shù)。這是數(shù)學(xué)常識(shí)。如果一個(gè)數(shù)沒有特定的前綴,則默認(rèn)為十進(jìn)制。 二進(jìn)制以2為基底,只有數(shù)字0和1是有效的。 示例: 101 //和十進(jìn)制5等價(jià) (1*2^2 + 0*2^1 + 1*2^0) 二進(jìn)制格式只能是8位的,即只能表示0-255之間的數(shù)。如果輸入二進(jìn)制數(shù)更方便的話,你可以用以下的方式: myInt = (B11001100 * 256) + B10101010; //

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!