Arduino參考手冊中文版_第1頁
Arduino參考手冊中文版_第2頁
Arduino參考手冊中文版_第3頁
Arduino參考手冊中文版_第4頁
Arduino參考手冊中文版_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精品文檔Arduino編程參考手冊程序結(jié)構(gòu)4控制語句5if5if.else6for8switch case10while11do.while12break12continue13return14goto15相關(guān)語法16分號16大括號16注釋18define19include20算術(shù)運算符21賦值21加,減,乘,除21取模22比較運算符24if(條件) and =, !=, (比較運算符)24布爾運算符26指針運算符27位運算27位與27位或28位異或30位非32左移、右移33復(fù)合運算符35自加+35自減-35復(fù)合加+=35復(fù)合減-=36復(fù)合乘*=36復(fù)合除/=36復(fù)合與&=36復(fù)合或|=36變

2、量36常量36宏定義37整型常量38浮點數(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輔助工具62sizeof() (s

3、izeof運算符)62ASCII碼表63基本函數(shù)65數(shù)字I/O65pinMode()65digitalWrite()66digitalRead()67模擬I/O68analogReference()68analogRead()69analogWrite()70高級I/O71shiftOut()71pulseIn()72時間73millis()73delay(ms)73delayMicroseconds(us)74數(shù)學(xué)庫75min()75max()76abs()76constrain()76map()77pow()78sqrt()78三角函數(shù)78sin(),cos(),tan()78隨機數(shù)79r

4、andomSeed()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中, 標準的程序入口main函數(shù)在內(nèi)部被定義, 用戶只需要關(guān)心以下兩個函數(shù):setup()當(dāng)Arduino板起動時set

5、up()函數(shù)會被調(diào)用。用它來初始化變量,引腳模式,開始使用某個庫,等等。該函數(shù)在Arduino板的每次上電和復(fù)位時只運行一次。loop()在創(chuàng)建setup函數(shù),該函數(shù)初始化和設(shè)置初始值,loop()函數(shù)所做事的正如其名,連續(xù)循環(huán),允許你的程序改變狀態(tài)和響應(yīng)事件。可以用它來實時控制arduino板。示例:int buonPin = 3;void setup() Serial.begin(9600); /初始化串口 pinMode(buonPin, INPUT); /設(shè)置3號引腳為輸入模式void loop() if (digitalRead(buonPin) = HIGH) serialWrit

6、e(H); else serialWrite(L); delay(1000);控制語句 ifif,用于與比較運算符結(jié)合使用,測試是否已達到某些條件,例如一個輸入數(shù)據(jù)在某個范圍之外。使用格式如下:if (value 50) / 這里加入你的代碼該程序測試value是否大于50。如果是,程序?qū)?zhí)行特定的動作。換句話說,如果圓括號中的語句為真,大括號中的語句就會執(zhí)行。如果不是,程序?qū)⑻^這段代碼。大括號可以被省略,如果這么做,下一行(以分號結(jié)尾)將成為唯一的條件語句。 if (x 0) digitalWrite(LEDpin, HIGH); if (x 0)digitalWrite(LEDpin,

7、HIGH); if (x 0) digitalWrite(LEDpin, HIGH); if (x 0) digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); / 都是正確的圓括號中要被計算的語句需要一個或多個操作符。if.else與基本的if語句相比,由于允許多個測試組合在一起,if/else可以使用更多的控制流。例如,可以測試一個模擬量輸入,如果輸入值小于500,則采取一個動作,而如果輸入值大于或等于500,則采取另一個動作。代碼看起來像是這樣:if (pinFiveInput 500) / 動作Aelse / 動作Belse中

8、可以進行另一個if測試,這樣多個相互獨立的測試就可以同時進行。每一個測試一個接一個地執(zhí)行直到遇到一個測試為真為止。當(dāng)發(fā)現(xiàn)一個測試條件為真時,與其關(guān)聯(lián)的代碼塊就會執(zhí)行,然后程序?qū)⑻酵暾膇f/else結(jié)構(gòu)的下一行。如果沒有一個測試被驗證為真。缺省的else語句塊,如果存在的話,將被設(shè)為默認行為,并執(zhí)行。注意:一個else if語句塊可能有或者沒有終止else語句塊,同理。每個else if分支允許有無限多個。if (pinFiveInput = 1000) / 執(zhí)行動作Belse / 執(zhí)行動作C另外一種表達互斥分支測試的方式,是使用switch case語句。forfor語句描述for語句用于

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

10、loop() for (int i=0; i = 255; i+) analogWrite(PWMpin, i); delay(10); 編碼提示:C中的for循環(huán)比在其它計算機語言中發(fā)現(xiàn)的for循環(huán)要靈活的多,包括BASIC。三個頭元素中的任何一個或全部可能被省略,盡管分號是必須的。而且初始化部分、條件判斷部分和數(shù)據(jù)遞增部分可以是任何合法的使用任意變量的C語句。且可以使用任何數(shù)據(jù)類型包括floats。這些不常用的類型用于語句段也許可以為一些罕見的編程問題提供解決方案。例如,在遞增部分中使用一個乘法將形成對數(shù)級增長:for(int x = 2; x -1; i = i + x) analogW

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

12、k,或者是到達switch語句的末尾。示例: switch (var) case 1: /當(dāng)var等于1執(zhí)行這里 break; case 2: /當(dāng)var等于2執(zhí)行這里 break; default: / 如果沒有匹配項,將執(zhí)行此缺省段 / default段是可選的 語法 switch (var) case label: / statements break; case label: / statements break; default: / statements參數(shù)var: 與不同的case中的值進行比較的變量label: 相應(yīng)的case的值whilewhile循環(huán)描述:while循環(huán)將會

13、連續(xù)地?zé)o限地循環(huán),直到圓括號()中的表達式變?yōu)榧佟1粶y試的變量必須被改變,否則while循環(huán)將永遠不會中止。這可以是你的代碼,比如一個遞增的變量,或者是一個外部條件,比如測試一個傳感器。語法: while(expression) / statement(s)參數(shù):expression - 一個(布爾型)C語句,被求值為真或假示例:var = 0; while(var 200) / 做兩百次重復(fù)的事情 var+; do.whiledo循環(huán)do循環(huán)與while循環(huán)使用相同方式工作,不同的是條件是在循環(huán)的末尾被測試的,所以do循環(huán)總是至少會運行一次。do / 語句塊 while (測試條件);示例:

14、do delay(50); / 等待傳感器穩(wěn)定 x = readSensors(); / 檢查傳感器的值 while (x 100);breakbreak用于中止do,for,或while循環(huán),繞過正常的循環(huán)條件。它也用于中止switch語句。示例: for (x = 0; x threshold) / bail out on sensor detect x = 0; break; delay(50);continuecontinue語句跳過一個循環(huán)的當(dāng)前迭代的余下部分。(do,for,或while)。通過檢查循環(huán)測試條件它將繼續(xù)進行隨后的迭代。示例:for (x = 0; x 40 & x

15、400) return 1; else return 0; return 關(guān)鍵字對測試一段代碼很方便,不需“注釋掉”大段的可能是錯誤的代碼。void loop()/在此測試代碼是個好想法return;/ 這里是功能不正常的代碼/ 這里的代碼永遠也不會執(zhí)行g(shù)oto在程序中轉(zhuǎn)移程序流到一個標記點語法:label: goto label; / sends program flow to the label 提示:在C程序中不建議使用goto,而且一些C編程書的作者主張永遠不要使用goto語句,但是明智地使用它可以簡化某些代碼。許多程序員不贊成使用goto的原因是,無節(jié)制地使用goto語句很容易產(chǎn)生執(zhí)

16、行流混亂的很難被調(diào)試程序。盡管如是說,仍然有很多使用goto語句而大大簡化編碼的實例。其中之一就是從一個很深的循環(huán)嵌套中跳出去,或者是if邏輯塊,在某人些條件下。示例: for(byte r = 0; r -1; g-) for(byte b = 0; b 250) goto bailout; / 其它語句。 bailout:相關(guān)語法分號用于一個語句的結(jié)束示例 int a = 0;提示忘記在一行的末尾加一個分號將產(chǎn)生一個編譯器錯誤。該錯誤信息可能是明顯的,且會提及丟失分號,但也許不會。如果出現(xiàn)一個不可理喻的或看起來不合邏輯的錯誤,其中一個首先要做的事就是檢查分號丟失。編譯器會在前一行的附近發(fā)出

17、抱怨。大括號大括號(又稱括弧或花括號)是C語言的主要組成部分。它們用在幾個不同的結(jié)構(gòu)中,大致如下,這可能會令初學(xué)者感到困惑。一個左大括號必須有一個右大括號跟在后面。這是一個常被稱為平衡括號的條件。Arduino IDE(集成開發(fā)環(huán)境)包含一個方便的特性以檢驗平衡大括號。只需選擇一個大括號,甚至直接在一個大括號后面點擊插入點,然后它的邏輯上的同伴就會高亮顯示。目前此功能有些許錯誤,因為IDE經(jīng)常在文本中(錯誤地)發(fā)現(xiàn)一個已經(jīng)被注釋掉的大括號。初級程序員,和從BASIC轉(zhuǎn)到C的程序員常常發(fā)現(xiàn)使用大括號令人困惑或畏縮。畢竟,用同樣的大括號在子例程(函數(shù))中替換RETURN語句,在條件語句中替換END

18、IF語句和在FOR循環(huán)中替換NEXT語句。由于大括號的使用是如此的多樣,當(dāng)插入一個需要大括號的結(jié)構(gòu)時,直接在打出開括號之后打出閉括號是個不錯的編程實踐。然后在大括號之間插入一些回車符,接著開始插入語句。你的大括號,還有你的態(tài)度,將永遠不會變得不平衡。不平衡的大括號常常導(dǎo)致古怪的,難以理解的編譯器錯誤,有時在大型程序中很難查出。因為它們的多樣的使用,大括號對于程序的語法也是極其重要的,對一個大括號移動一行或兩行常常顯著地影響程序的意義。大括號的主要用法/函數(shù) void myfunction(datatype argument) statements(s) /循環(huán) while (boolean e

19、xpression) statement(s) do statement(s) while (boolean expression); for (initialisation; termination condition; incrementing expr) statement(s) /條件語句 if (boolean expression) statement(s) else if (boolean expression) statement(s) else statement(s) 注釋注釋是程序中的一些行,用于讓自己或他人了解程序的工作方式。他們會被編譯器忽略,而不會輸出到控制器,所以

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

21、是把它們放到注釋中,所以編譯器就會忽略它們。這在定位問題時,或者當(dāng)程序無法編譯通過且編譯錯誤信息很古怪或沒有幫助時特別有用。define#define 宏定義宏定義是一個有用的C組件,它允許程序員在程序編譯前給常量取一個名字。在arduino中定義的常量不會在芯片中占用任何程序空間。編譯器在編譯時會將這些常量引用替換為定義的值。這雖然可能有些有害的副作用,舉例來說,一個已被定義的常量名被包含在一些其它的常量或變量名中。那樣的話該文本將被替換成被定義的數(shù)字(或文本)。通常,用const關(guān)鍵字定義常量是更受歡迎的且用來代替#define會很有用。Arduino宏定義與C宏定義有同樣的語法語法#de

22、fine constantName value 注意#是必須的示例:#define ledPin 3/ 編譯器在編譯時會將任何提及l(fā)edPin的地方替換成數(shù)值3。提示#define語句的后面分號。如果你加了一個,編譯器將會在進一步的頁面引發(fā)奇怪的錯誤。#define ledPin 3; / this is an error 類似地,包含一個等號通常也會在進一步的頁面引發(fā)奇怪的編譯錯誤。#define ledPin = 3 / this is also an error include#include 包含#include用于在你的sketch中包含外部的庫。這使程序員可以訪問一個巨大的標準C庫

23、(預(yù)定義函數(shù)集合)的集合。AVR C庫(AVR是Atmel芯片的一個基準,Arduino正是基于它)的主參考手冊頁在這里。注意#include和#define相似,沒有分號終止符,且如果你加了,編譯器會產(chǎn)生奇怪的錯誤信息。示例該示例包含一個用于輸出數(shù)據(jù)到程序空間閃存的庫,而不是內(nèi)存。這會為動態(tài)內(nèi)存需求節(jié)省存儲空間且使需要創(chuàng)建巨大的查找表變得更實際。#include 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ù)運算符賦

24、值=賦值運算符(單個等號)把等號右邊的值存儲到等號左邊的變量中。在C語言中單個等號被稱為賦值運算符。它與在代數(shù)課中的意義不同,后者象征等式或相等。賦值運算符告訴微控制器求值等號右邊的變量或表達式,然后把結(jié)果存入等號左邊的變量中。示例 int sensVal; /聲明一個名為sensVal的整型變量 senVal = analogRead(0); /存儲(數(shù)字的)0號模擬引腳的輸入電壓值到sensVal編程技巧賦值運算符(=號)左邊的變量需要能夠保存存儲在其中的值。如果它不足以大到容納一個值,那個存儲在該變量中的值將是錯誤的。不要混淆賦值運算符 = (單個等號)和比較運算符 = (雙等號),后者

25、求值兩個表達式是否相等。加,減,乘,除描述這些運算符(分別)返回兩人運算對象的和,差,積,商。這些操作受運算對象的數(shù)據(jù)類型的影響。所以,例如,9 / 4結(jié)果是2,如果9和2是整型數(shù)。這也意味著運算會溢出,如果結(jié)果超出其在相應(yīng)的數(shù)據(jù)類型下所能表示的數(shù)。(例如,給整型數(shù)值767加1結(jié)果是-768)。如果運算對象是不同的類型,會用那個較大的類型進行計算。如果其中一個數(shù)字(運算符)是float類型或double類型,將采用浮點數(shù)進行計算。示例y = y + 3;x = x - 7;i = j * 6;r = r / 5;語法result = value1 + value2;result = value

26、1 - value2;result = value1 * value2;result = value1 / value2;參數(shù):value1:任何變量或常量value2:任何變量或常量編程技巧:要知道整型常量默認為int型,因此一些常量計算可能會溢出(例如:60 * 1000將產(chǎn)生負的結(jié)果)選擇一個大小足夠大的變量以容納你的最大的計算結(jié)果。要知道你的變量在哪一點將會“翻轉(zhuǎn)”且要知道在另一個方向上會發(fā)生什么,例如:(0 - 1)或(0 - 768)。對于數(shù)學(xué)需要分數(shù),就使用浮點變量,但是要注意它們的缺點:占用空間大,計算速度慢。使用強制類型轉(zhuǎn)換符例如:(int)myFloat以在運行中轉(zhuǎn)換一個變

27、量到另一個類型。取模%(取模)描述計算一個數(shù)除以另一個數(shù)的余數(shù)。這對于保持一個變量在一個特定的范圍很有用(例如:數(shù)組的大?。UZ法result = dividend % divisor 參數(shù)dividend: 被除數(shù)divisor: 除數(shù)結(jié)果:余數(shù)示例x = 7 % 5; / x now contains 2x = 9 % 5; / x now contains 4x = 5 % 5; / x now contains 0x = 4 % 5; / x now contains 4示例代碼 /* update one value in an array each time through a l

28、oop */int values10;int i = 0;void setup() void loop() valuesi = analogRead(0); i = (i + 1) % 10; / modulo operator rolls over variable 提示:取模運算符不能用于浮點型數(shù)。比較運算符if(條件) and =, !=, (比較運算符)if,用于和比較運算符聯(lián)合使用,測試某一條件是否到達,例如一個輸入超出某一數(shù)值。if條件測試的格式:if (someVariable 50) / do something here該程序測試someVariable是否大于50。如果是,

29、 程序執(zhí)行特定的動作。換句話說,如果圓括號中的語句為真,花括號中的語句就會運行。否則,程序跳過該代碼。if語句后的花括號可能被省略。如果這么做了,下一行(由分號定義的行)就會變成唯一的條件語句。if (x 0) digitalWrite(LEDpin, HIGH); if (x 0)digitalWrite(LEDpin, HIGH); if (x 0) digitalWrite(LEDpin, HIGH); if (x 0) digitalWrite(LEDpin1, HIGH); digitalWrite(LEDpin2, HIGH); / all are correct圓括號中被求值的語

30、句需要使用一個或多個運算符:比較運算符: x = y (x is equal to y) x != y (x is not equal to y) x y (x is greater than y) x = y (x is greater than or equal to y)警告:小心偶然地使用單個等號(例如if(x = 10))。單個等號是賦值運算符,這里設(shè)置x為10(將值10存入變量x)。改用雙等號(例如if (x = 10)),這個是比較運算符,用于測試x是否等于10。后者只在x等于10時返回真,但是前者將總是為真。這是因為C如下求值語句if(x=10):10分配給x(切記單個等號是賦

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

32、0) / . x或y任意一個大于0時返回真! (非)當(dāng)操作數(shù)為假時返回真,例如:if (!x) / . 若x為假返回真(即如果x等于0)警告確保你沒有把布爾與運算符,&(兩個與符號)錯認為按位與運算符&(單個與符號)。它們是完全不同的概念。同樣,不要混淆布爾或運算符|(雙豎杠)與按位或運算符|(單豎杠)。按位取反(波浪號)看起來與布爾非!有很大不同(感嘆號或程序員口中的“棒”),但是你仍然必須確保在什么地方用哪一個。例如 if (a = 10 & a = 20) / true if a is between 10 and 20指針運算符&(引用)和 *(間接引用)指針對于初學(xué)者來說是更復(fù)雜的對

33、象之一。并且可能寫大量的Arduino程序甚至都不會遇到指針。無論如何,巧妙地控制特定的數(shù)據(jù)結(jié)構(gòu),使用指針可以簡化代碼,而且在自己工具箱中擁有熟練控制指針的知識是很方便的。位運算位與按位與(&)按位操作符在變量的位級執(zhí)行運算。它們幫助解決各種常見的編程問題。以下大部分資料來自一個有關(guān)位數(shù)學(xué)的優(yōu)秀教程,或許可以在這里找到。1描述和語法以下是所有這些運算符的描述和語法。更詳細的資料或許可以在參考指南中找到。按位與(&)在C+中按位與運算符是單個與符號,用于其它兩個整型表達式之間使用。按位與運算獨立地在周圍的表達式的每一位上執(zhí)行操作。根據(jù)這一規(guī)則:如果兩個輸入位都是1,結(jié)果輸出1,否則輸出0。表達這

34、一思想的另一個方法是: 0 0 1 1 operand1 0 1 0 1 operand2 - 0 0 0 1 (operand1 & operand2) - returned result 在Arduino中,int型是16位的。所以在兩個整型表達式之間使用&將會導(dǎo)致16個與運算同時發(fā)生。代碼片斷就像這樣: int a = 92; / in binary: 0000000001000 int b = 101; / in binary: 00000000000101 int c = a & b; / result: 0000000001000100, or 68 in decimal.在a和b

35、的16位的每一位將使用按位與處理。且所有16位結(jié)果存入C中,以二進制存入的結(jié)果值01000100,即十進制的68。按位與的其中一個最常用的用途是從一個整型數(shù)中選擇特定的位,常被稱為掩碼屏蔽??慈缦率纠何换虬次换颍▅)在C+中按位或運算符是垂直的條桿符號,|。就像&運算符,|獨立地計算它周圍的兩個整型表達式的每一位。(當(dāng)然)它所做的是不同的(操作)。兩個輸入位其中一個或都是1按位或?qū)⒌玫?,否則為0。換句話說: 0 0 1 1 operand1 0 1 0 1 operand2 - 0 1 1 1 (operand1 | operand2) - returned result 這是一個使用一小

36、斷C+代碼描述的按位或(運算)的例子: int a = 92; / in binary: 0000000001000 int b = 101; / in binary: 00000000000101 int c = a | b; / result: 00000000001, or 5 in decimal.按位與和按位或的一個共同的工作是在端口上進行程序員稱之為讀-改-寫的操作。在微控制器中,每個端口是一個8位數(shù)字,每一位表示一個引腳的狀態(tài)。寫一個端口可以同時控制所有的引腳。PORTD是內(nèi)建的參照數(shù)字口0,1,2,3,4,5,6,7的輸出狀態(tài)的常量。如果一個比特位是1,那么該引腳置高。(引腳總

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

38、nd 1 untouched (xx | 00 = xx)/ same as pinMode(pin, OUTPUT) for pins 2 to 7Serial.begin(9600);void loop()for (i=0; i64; i+)PORTD = PORTD & B000000; / clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & = xx)j = (i 2); / shift variable up to pins 2 - 7 - to avoid pins 0 and 1PORTD = PORTD | j; /

39、 combine the port information with the new information for LED pinsSerial.println(PORTD, BIN); / debug to show maskingdelay(100); 位異或按位異或()在C+中有一個有點不尋常的操作,它被稱為按位異或,或者XOR(在英語中,通常讀作“eks-or”)。按位異或運算符使用符號。該運算符與按位或運算符“|”非常相似 ,唯一的不同是當(dāng)輸入位都為1時它返回0。 0 0 1 1 operand1 0 1 0 1 operand2 - 0 1 1 0 (operand1 opera

40、nd2) - returned result看待XOR的另一個視角是,當(dāng)輸入不同時結(jié)果為1,當(dāng)輸入相同時結(jié)果為0。這里是一個簡單的示例代碼: int x = ; / binary: 00 int y = 10; / binary: 1010 int z = x y; / binary: 00, or decimal 6“”運算符常用于翻轉(zhuǎn)整數(shù)表達式的某些位(例如從0變?yōu)?,或從1變?yōu)?)。在一個按位異或操作中,如果相應(yīng)的掩碼位為1, 該位將翻轉(zhuǎn),如果為0,該位不變。以下是一個閃爍引腳5的程序./ Blink_Pin_5/ demo for Exclusive ORvoid setup()DDR

41、D = 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īng)用于其右側(cè)的單個操作數(shù)。按位取反操作會翻轉(zhuǎn)其每一位。0變?yōu)?,1變?yōu)?。例如: 0 1 operand1 - 1 0 operand1 int a = 103;

42、/ binary: 00000000000 int b = a; / binary: 00000 = -104 看到此操作的結(jié)果為一個負數(shù):-104,你可能會感到驚訝,這是因為一個整型變量的最高位是所謂的符號位。如果最高位為1,該整數(shù)被解釋為負數(shù)。這里正數(shù)和負數(shù)的編碼被稱為二進制補碼。欲了解更多信息,請參閱維基百科條目:補碼。順便說一句,值得注意的是,對于任何整數(shù)x, x 與 -x-1 相等。有時候,符號位在有符號整數(shù)表達式中能引起一些不期的意外。左移、右移左移運算()描述From The Bitmath Tutorial in The Playground在C+中有兩個移位運算符:左移運算符

43、。這些運算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。語法variable number_of_bits 參數(shù) *variable - (byte, int, long) number_of_bits integer = 示例: int a = 5; / binary: 0000000000000101 int b = a 3; / binary: 0000000000000101, or back to 5 like we started with當(dāng)把x左移y位(x y),x中最左邊的y位將會丟失。 int a = 5; / binary: 0000000000000101 int

44、b = a 14; / binary: 0100000000000000 - 101中的第一個1被丟棄如果您確信沒有值被移出,理解左移位運算符一個簡單的辦法是,把它的左操作數(shù)乘2將提高其冪值。例如,要生成2的乘方,可以使用以下表達式: 1 0 = 1 1 1 = 2 1 2 = 4 1 3 = 8 . 1 8 = 256 1 9 = 5 1 3; / binary: 0該行為,被稱為符號擴展,常常不是你所期待的。反而,你可能希望移入左邊的是0。事實上右移規(guī)則對于無符合整型表達式是不同的。所以你可以使用強制類型轉(zhuǎn)換來避免左邊移入1。 int x = -16; / binary: 0000 int

45、 y = (unsigned int)x 3; / binary: 0000 如果你可以很小心地避免符號擴展,你可以使用右移位運算符,作為除以2的冪的一種方法。例如 int x = 1000; int y = x 3; / 1000除以8,得y = 5.復(fù)合運算符自加+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 =

46、i & 5;復(fù)合或|=i|=5; /相當(dāng)于 i = i | 5;變量常量constants是在Arduino語言里預(yù)定義的變量。它們被用來使程序更易閱讀。我們按組將常量分類。邏輯層定義,true與false(布爾Boolean常量)在Arduino內(nèi)有兩個常量用來表示真和假:true和 false。false在這兩個常量中false更容易被定義。false被定義為0(零)。truetrue通常被定義為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ù)字引腳時只有兩個可能的值: HIGH

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論