Arduino編程參考手冊(cè)中文版

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

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

9.9 積分

下載資源

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

資源描述:

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

1、Arduino編程參考手冊(cè)首頁(yè)程序結(jié)構(gòu)setup()loop()控制結(jié)構(gòu)ifif.elseforswitch casewhiledo.whilebreakcontinuereturngoto相關(guān)語(yǔ)法 ; 分號(hào) 大括號(hào)/ 單行注釋/*/ 多行注釋#define 宏定義#include 文件包含算術(shù)運(yùn)算符= 賦值+ (加)- (減)* (乘)/ (除) % (取模)比較運(yùn)算符= 等于 != (不等于) (大于)= (大于等于)布爾運(yùn)算符& (邏輯與)| (邏輯或) ! (邏輯非)指針運(yùn)算符* 指針運(yùn)算符& 地址運(yùn)算符位運(yùn)算& (位與)| (位或) (位異或) (位非) (右移)復(fù)合運(yùn)算符+ (自加

2、)- (自減)+= (復(fù)合加)-= (復(fù)合減)*= (復(fù)合乘)/= (復(fù)合除)&= (復(fù)合與)|= (復(fù)合或)范圍HIGH | LOWINPUT | OUTPUTtrue | false整型常量浮點(diǎn)數(shù)常量數(shù)據(jù)類(lèi)型voidbooleancharunsigned charbyteintunsigned intwordlongunsigned longfloatdoublestringString(c+)array數(shù)據(jù)類(lèi)型轉(zhuǎn)換char()byte()int()word()long()float()變量作用域變量作用域static (靜態(tài)變量)volatile (易變變量)const (不可改變變量)

3、輔助工具sizeof() (sizeof運(yùn)算符)ASCII碼表數(shù)字I/OpinMode()digitalWrite()digitalRead()模擬I/OanalogReference()analogRead()analogWrite()指高級(jí)I/OshiftOut()pulseIn()時(shí)間millis()delay(ms)delayMicroseconds(us)數(shù)學(xué)庫(kù)min()max()abs()constrain()map()pow()sqrt()三角函數(shù)sin(rad)cos(rad)tan(rad)隨機(jī)數(shù)randomSeed()random()random()位操作lowByte()

4、highByte()bitRead()bitWrite()bitSet()bitClear()bit()設(shè)置中斷函數(shù)attachInterrupt()detachInterrupt()interrupts()noInterrupts()串口通訊begin()available()read()flushprint()println()write()peak()serialEvent()程序結(jié)構(gòu)(本節(jié)直譯自Arduino官網(wǎng)最新Reference)在Arduino中, 標(biāo)準(zhǔn)的程序入口main函數(shù)在內(nèi)部被定義, 用戶(hù)只需要關(guān)心以下兩個(gè)函數(shù):setup()當(dāng)Arduino板起動(dòng)時(shí)setup()函數(shù)會(huì)被

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

6、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)作。換句話(huà)說(shuō),如果圓括號(hào)中的語(yǔ)句為真,大括號(hào)中的語(yǔ)句就會(huì)執(zhí)行。如果不是,程序?qū)⑻^(guò)這段代碼。大括號(hào)可以被省略,如果這么做,下一行(以分號(hào)結(jié)尾)將成為唯一的條件語(yǔ)句。 if (x 120) digitalWrite(LEDpin, HIGH); if (x 120)digitalWrite(LEDpin,

7、 HIGH); if (x 120) digitalWrite(LEDpin, HIGH); if (x 120) 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,則采取另一個(gè)動(dòng)作。代碼看起來(lái)像是這樣:if (pinFiveInput 500) / 動(dòng)作Aelse / 動(dòng)作B

8、else中可以進(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)的下一行。如果沒(méi)有一個(gè)測(cè)試被驗(yàn)證為真。缺省的else語(yǔ)句塊,如果存在的話(huà),將被設(shè)為默認(rèn)行為,并執(zhí)行。注意:一個(gè)else if語(yǔ)句塊可能有或者沒(méi)有終止else語(yǔ)句塊,同理。每個(gè)else if分支允許有無(wú)限多個(gè)。if (pinFiveInput = 1000) / 執(zhí)行動(dòng)作Belse / 執(zhí)行動(dòng)作C另外一種表達(dá)互斥分支測(cè)試的方式,是使用switch case語(yǔ)句。forfor語(yǔ)句 描述

9、for語(yǔ)句用于重復(fù)執(zhí)行被花括號(hào)包圍的語(yǔ)句塊。一個(gè)增量計(jì)數(shù)器通常被用來(lái)遞增和終止循環(huán)。for語(yǔ)句對(duì)于任何需要重復(fù)的操作是非常有用的。常常用于與數(shù)組聯(lián)合使用以收集數(shù)據(jù)/引腳。for循環(huán)的頭部有三個(gè)部分:for (初始化部分; 條件判斷部分; 數(shù)據(jù)遞增部分) /語(yǔ)句塊。初始化部分被第一個(gè)執(zhí)行,且只執(zhí)行一次。每次通過(guò)這個(gè)循環(huán),條件判斷部分將被測(cè)試;如果為真,語(yǔ)句塊和數(shù)據(jù)遞增部分就會(huì)被執(zhí)行,然后條件判斷部分就會(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() /這里無(wú)需

10、設(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ǔ)句。且可以使用任何數(shù)據(jù)類(lèi)型包括floats。這些不常用的類(lèi)型用于語(yǔ)句段也許可以為一些罕見(jiàn)的編程問(wèn)題提供解決方案。例如,在遞增部分中使用一個(gè)乘法將形成對(duì)數(shù)級(jí)增長(zhǎng):for(int x = 2; x -1; i = i + x)

11、analogWrite(PWMpin, i); if (i = 255) x = -1; / 在峰值切換方向 delay(10); switch caseswitch case 語(yǔ)句就像if語(yǔ)句,switch.case通過(guò)允許程序員根據(jù)不同的條件指定不同的應(yīng)被執(zhí)行的代碼來(lái)控制程序流。特別地,一個(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ǔ)句的最后面。如果沒(méi)有break語(yǔ)句,switch語(yǔ)句將繼續(xù)執(zhí)行下面的表達(dá)式(“持續(xù)下降”)直

12、到遇到break,或者是到達(dá)switch語(yǔ)句的末尾。示例: switch (var) case 1: /當(dāng)var等于1執(zhí)行這里 break; case 2: /當(dāng)var等于2執(zhí)行這里 break; default: / 如果沒(méi)有匹配項(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)描述:w

13、hile循環(huán)將會(huì)連續(xù)地?zé)o限地循環(huán),直到圓括號(hào)()中的表達(dá)式變?yōu)榧?。被測(cè)試的變量必須被改變,否則while循環(huán)將永遠(yuǎn)不會(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è)

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

15、 40 & x 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編程書(shū)的作者主張永遠(yuǎn)不要使用goto語(yǔ)句,但是明智地使用它可以 簡(jiǎn)化某些代碼。許多程序員不贊成使用goto的原因是,無(wú)節(jié)制地使用got

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

17、會(huì)在前一行的附近發(fā)出抱怨。大括號(hào)大括號(hào)(又稱(chēng)括弧或花括號(hào))是C語(yǔ)言的主要組成部分。它們用在幾個(gè)不同的結(jié)構(gòu)中,大致如下,這可能會(huì)令初學(xué)者感到困惑。一個(gè)左大括號(hào)必須有一個(gè)右大括號(hào)跟在后面。這是一個(gè)常被稱(chēng)為平衡括號(hào)的條件。Arduino IDE(集成開(kāi)發(fā)環(huán)境)包含一個(gè)方便的特性以檢驗(yàn)平衡大括號(hào)。只需選擇一個(gè)大括號(hào),甚至直接在一個(gè)大括號(hào)后面點(diǎn)擊插入點(diǎn),然后它的邏輯上的同伴就會(huì)高亮顯示。目前此功能有些許錯(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語(yǔ)句,在

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

19、(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 (boolean expression) statement(s) else statement(s) 注釋注釋是程序中的一些行,用于讓自己或他人了解程序的工作方式。他們會(huì)被編譯器忽略,而不

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

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

22、樣的語(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 類(lèi)似地,包含一個(gè)等號(hào)通常也會(huì)在進(jìn)一步的頁(yè)面引發(fā)奇怪的編譯錯(cuò)誤。#define ledPin = 3 / this is also an error include#include 包含#include用于在你的sketch中包含外部的庫(kù)。這使程序員可以訪(fǎng)問(wèn)

23、一個(gè)巨大的標(biāo)準(zhǔn)C庫(kù)(預(yù)定義函數(shù)集合)的集合。AVR C庫(kù)(AVR是Atmel芯片的一個(gè)基準(zhǔn),Arduino正是基于它)的主參考手冊(cè)頁(yè)在這里。注意#include和#define相似,沒(méi)有分號(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 prog_uint16_t myConstants PROGMEM = 0, 21140, 702 , 9128, 0, 25764, 8456,0,0,0,0,0,0,0,0,29810,8968,29762,2

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

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

26、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é)果。要知道你的變量在哪一點(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)制類(lèi)型轉(zhuǎn)換符例如

27、:(int)myFloat以在運(yùn)行中轉(zhuǎn)換一個(gè)變量到另一個(gè)類(lèi)型。取模%(取模)描述計(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 contains 4x = 5 % 5; / x now contains 0x = 4 % 5; / x now contains 4示例代碼 /* update one value in an arr

28、ay 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 =, !=, (比較運(yùn)算符)if,用于和比較運(yùn)算符聯(lián)合使用,測(cè)試某一條件是否到達(dá),例如一個(gè)輸入超出某一數(shù)值。if條件測(cè)試的格式:if (someVariable 50) / do something here 該程序

29、測(cè)試someVariable是否大于50。如果是, 程序執(zhí)行特定的動(dòng)作。換句話(huà)說(shuō),如果圓括號(hào)中的語(yǔ)句為真,花括號(hào)中的語(yǔ)句就會(huì)運(yùn)行。否則,程序跳過(guò)該代碼。if語(yǔ)句后的花括號(hào)可能被省略。如果這么做了,下一行(由分號(hào)定義的行)就會(huì)變成唯一的條件語(yǔ)句。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,

30、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 greater than 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í)返回真,但是前者將總是為真。這

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

32、真| (邏輯或)任意一個(gè)為真時(shí)返回真,例如:if (x 0 | y 0) / . x或y任意一個(gè)大于0時(shí)返回真! (非)當(dāng)操作數(shù)為假時(shí)返回真,例如:if (!x) / . 若x為假返回真(即如果x等于0)警告確保你沒(méi)有把布爾與運(yùn)算符,&(兩個(gè)與符號(hào))錯(cuò)認(rèn)為按位與運(yùn)算符&(單個(gè)與符號(hào))。它們是完全不同的概念。同樣,不要混淆布爾或運(yùn)算符|(雙豎杠)與按位或運(yùn)算符|(單豎杠)。按位取反(波浪號(hào))看起來(lái)與布爾非!有很大不同(感嘆號(hào)或程序員口中的“棒”),但是你仍然必須確保在什么地方用哪一個(gè)。例如 if (a = 10 & a = 20) / true if a is between 10 and 20

33、指針運(yùn)算符&(引用)和 *(間接引用)指針對(duì)于初學(xué)者來(lái)說(shuō)是更復(fù)雜的對(duì)象之一。并且可能寫(xiě)大量的Arduino程序甚至都不會(huì)遇到指針。無(wú)論如何,巧妙地控制特定的數(shù)據(jù)結(jié)構(gòu),使用指針可以簡(jiǎn)化代碼,而且在自己工具箱中擁有熟練控制指針的知識(shí)是很方便的。位運(yùn)算位與按位與(&)按位操作符在變量的位級(jí)執(zhí)行運(yùn)算。它們幫助解決各種常見(jiàn)的編程問(wèn)題。以下大部分資料來(lái)自一個(gè)有關(guān)位數(shù)學(xué)的優(yōu)秀教程,或許可以在這里找到。1描述和語(yǔ)法以下是所有這些運(yùn)算符的描述和語(yǔ)法。更詳細(xì)的資料或許可以在參考指南中找到。按位與(&)在C+中按位與運(yùn)算符是單個(gè)與符號(hào), 用于其它兩個(gè)整型表達(dá)式之間使用。按位與運(yùn)算獨(dú)立地在周?chē)谋磉_(dá)式的每一位上執(zhí)行操

34、作。根據(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í)發(fā)生。代碼片斷就像這樣: int a = 92; / in binary: 0000000001011100 int b = 101; / in binary: 0000000001100101 int c = a & b; / result:

35、 0000000001000100, or 68 in decimal. 在a和b的16位的每一位將使用按位與處理。且所有16位結(jié)果存入C中,以二進(jìn)制存入的結(jié)果值01000100,即十進(jìn)制的68。按位與的其中一個(gè)最常用的用途是從一個(gè)整型數(shù)中選擇特定的位,常被稱(chēng)為掩碼屏蔽??慈缦率纠何换虬次换颍▅)在C+中按位或運(yùn)算符是垂直的條桿符號(hào),|。就像&運(yùn)算符,|獨(dú)立地計(jì)算它周?chē)膬蓚€(gè)整型表達(dá)式的每一位。(當(dāng)然)它所做的是不同的(操作)。兩個(gè)輸入位其中一個(gè)或都是1按位或?qū)⒌玫?,否則為0。換句話(huà)說(shuō): 0 0 1 1 operand1 0 1 0 1 operand2 - 0 1 1 1 (operan

36、d1 | operand2) - returned result 這是一個(gè)使用一小斷C+代碼描述的按位或(運(yùn)算)的例子: int a = 92; / in binary: 0000000001011100 int b = 101; / in binary: 0000000001100101 int c = a | b; / result: 0000000001111101, or 125 in decimal. 按位與和按位或的一個(gè)共同的工作是在端口上進(jìn)行程序員稱(chēng)之為讀-改-寫(xiě)的操作。在微控制器中,每個(gè)端口是一個(gè)8位數(shù)字,每一位表示一個(gè)引腳的狀態(tài)。寫(xiě)一個(gè)端口可以同時(shí)控制所有的引腳。PORTD是

37、內(nèi)建的參照數(shù)字口0,1,2,3,4,5,6,7的輸出狀態(tài)的常量。如果一個(gè)比特位是1,那么該引腳置高。(引腳總是需要用pinMode()指令設(shè)置為輸出模式)。所以如果我們寫(xiě)入PORTD = B00110001;我們就會(huì)讓引腳2,3和7輸出高。一個(gè)小小的問(wèn)題是,我們同時(shí)也改變了某些引腳的0,1狀態(tài)。這用于Arduino與串口通訊,所以我們可能會(huì)干擾串口通訊。我們的程序規(guī)則是:僅僅獲取和清除我們想控制的與相應(yīng)引腳對(duì)應(yīng)的位(使用按位與)。合并要修改的PORTD值與所控制的引腳的新值(使用按位或)。int i; / counter variableint j;void setup()DDRD = DDR

38、D | B11111100; / set direction 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; i64; i+)PORTD = PORTD & B00000011; / clear out bits 2 - 7, leave pins 0 and 1 untouched (xx & 11 = xx)j = (i 2); / shift va

39、riable up 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)不尋常的操作,它被稱(chēng)為按位異或,或者XOR(在英語(yǔ)中,通常讀作“eks-or”)。按位異或運(yùn)算符使用符號(hào)。該運(yùn)算符與按位或運(yùn)算符“|”非常相似 ,唯一的不同是當(dāng)輸入位都為

40、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è)簡(jiǎn)單的示例代碼: int x = 12; / binary: 1100 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),

41、如果為0,該位不變。以下是一個(gè)閃爍引腳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è)

42、的單個(gè)操作數(shù)。按位取反操作會(huì)翻轉(zhuǎn)其每一位。0變?yōu)?,1變?yōu)?。例如: 0 1 operand1 - 1 0 operand1 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ù)的編碼被稱(chēng)為二進(jìn)制補(bǔ)碼。欲了解更多信息,請(qǐng)參閱維基百科條目:補(bǔ)碼。順便說(shuō)一句,值得注意的是,對(duì)于任何整數(shù)x, x 與 -x-1 相等。有時(shí)候,符號(hào)位在有符

43、號(hào)整數(shù)表達(dá)式中能引起一些不期的意外。左移、右移左移運(yùn)算()描述From The Bitmath Tutorial in The Playground 在C+中有兩個(gè)移位運(yùn)算符:左移運(yùn)算符。這些運(yùn)算符將使左邊操作數(shù)的每一位左移或右移其右邊指定的位數(shù)。語(yǔ)法variable number_of_bits 參數(shù) *variable - (byte, int, long) number_of_bits integer = 32 示例: int a = 5; / binary: 0000000000000101int b = a 3; / binary: 0000000000000101, or back

44、 to 5 like we started with當(dāng)把x左移y位(x y),x中最左邊的y位將會(huì)丟失。int a = 5; / binary: 0000000000000101int b = a 14; / binary: 0100000000000000 - 101中的第一個(gè)1被丟棄 如果您確信沒(méi)有值被移出,理解左移位運(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 = 512 1 3; / binary: 1111111111111110該行為

45、,被稱(chēng)為符號(hào)擴(kuò)展,常常不是你所期待的。反而,你可能希望移入左邊的是0。事實(shí)上右移規(guī)則對(duì)于無(wú)符合整型表達(dá)式是不同的。所以你可以使用強(qiáng)制類(lèi)型轉(zhuǎn)換來(lái)避免左邊移入1。int x = -16; / binary: 1111111111110000int 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

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

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

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

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

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

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

52、e 0x0假#define PI 3.14159265PI.#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.2957786角度轉(zhuǎn)弧度整型常量整數(shù)常量整數(shù)常量是直接在程序中使用的數(shù)字,如123。默認(rèn)情況下,這些數(shù)字被視為int,但你可以通過(guò)U和L修飾符進(jìn)行更多的限制(見(jiàn)下文)。 通常情況下,整數(shù)常量默認(rèn)為十進(jìn)制,但可以加上特殊前綴表示為其他進(jìn)制。進(jìn)制 例子 格式 備注10(十進(jìn)制) 123 無(wú) 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ù)沒(méi)有特定的前綴,則默認(rèn)為十進(jìn)制。二進(jìn)制以2為基底,只有數(shù)字0和1是有效的。示例:101 /和十進(jìn)制5等價(jià) (1*22 + 0*21 + 1*20)二進(jìn)制格式只能是8位的,即只能表示0-255之間的數(shù)。如果輸入二進(jìn)制數(shù)更方便的話(huà),你可以用以下的方式:myInt = (B11001100 * 256) + B10101010; /

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

相關(guān)資源

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

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

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


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