標籤:trim cti 通訊 嵌入式 rom main 左移 實現 asc
arduino 函數 api
程式結構
在Arduino中, 標準的程式入口main函數在內部被定義, 使用者只需要關心以下兩個函數:
void setup()
void loop()
setup() 函數用於初始化, loop() 函數用於執行. 初始化函數一般放在程式開頭, 用於設定一些引腳的輸出/輸入模式, 初始化串口通訊等類似工作. loop() 函數中 的代碼將被迴圈執行, 例如: 讀入引腳狀態, 設定引腳輸出狀態等.
控制語句
if,if...else,for,switch,while,do...while,break,continue,return,goto
相關文法
; (分號),(大括弧),// (單行注釋),/* */ (多行注釋),#define,#include,
算術運算子
= (賦值),+ (加),- (減),* (乘),/ (除),% (模數)
比較子
== (等於),!= (不等於),< (小於),> (大於),<= (小於等於),>= (大於等於)
布林運算子
&& (邏輯與)、|| (邏輯或)、! (邏輯非)
指標運算子
* 指標運算子 & 地址運算子
位元運算
& (位與)、| (位或)、^ (位異或)、~ (位非)、<< (左移)、>> (右移)、連接埠操作
複合運算子
++ (自加)、-- (自減)、+= (複合加)、-= (複合減)、*= (複合乘)、/= (複合除)、&= (複合與)、|= (複合或)
常量
HIGH | LOW
INPUT | OUTPUT
true | false
整數常量
浮點數常量
資料類型
void(無類型)
word(字組) 0~65535 //16位
boolean(布爾型) 0~1 //1位
char(字元型) -128~+127 //8位
unsigned char(無符號字元型) 0~255 //8位
short -32768~+32767 //16位
byte(位元組型) //8bit
int(整型) -2147483648~+2147483647 //32位
unsigned int(無符號整型) 0~65535 //16位
long(長整型) -2147483648~+2147483647 //32位
unsigned long(無符號長整型) 0~4297967295 //32位
float(單精確度) -3.4028235E+38~+3.4028235E+38
double(雙精確度)
string(字串)
array(數組)
資料類型轉換
char(),byte(),int(),word(),long(),float()
變數範圍&修飾符
變數範圍
static (靜態變數),volatile (易變變數),const (不可改變變數)
協助工具輔助
sizeof() (sizeof運算子)、ASCII碼錶
//基本函數
/**************數字I/O*************/
pinMode(pin,mode); //設定引腳輸出狀態
pinMode函數用於配置引腳為輸入或輸出模式,該函數是一個無傳回值函數,函數有兩個參數 pin 和 mode,pin參數表示所要配置的引腳,mode 參數表示設定的模式——INPUT(輸入模式),OUTPUT(輸出模式)和INPUT_PULLUP(輸入模式,且引腳點位拉高);
digitalWrite(pin,value); //設定引腳的輸出資料
digitalWrite函數的作用是設定引腳輸出引腳引腳的電平為高電平或地電平。該函數是一個無傳回值函數,函數有兩個參數pin和value,pin參數表示所要配置的引腳,value參數表示輸出電壓——HIGH(高點平)和LOW(第電平)。
int digitalRead(pin); //引腳資料讀取
digitalRead函數用在函數為輸入情況,可以擷取引腳電壓的情況——HIGH(高電平)或LOW(低電平),參數 pin參數表示要擷取電壓值的引腳,該函數傳回值為 int 類型,表示引腳的電壓情況。
/*************類比I/O*************/
analogRead(pin); //讀取引腳的電壓值
analogRead函數用於讀取引腳的類比量電壓值,每一次讀取需要消耗的時間為 100us。參數 pin參數表示要擷取類比量電壓值的引腳,該函數傳回值為 int 類型,表示類比量電壓值,範圍在 0~1023。
analogWrite(pin,value); //設定引腳輸出類比量(PWM)
通過指定引腳輸出類比量(PWM),可用於讓LED以不同的亮度點亮或驅動電機以不同的速度旋轉。
analogWrite()輸出結束後,該引腳將產生一個穩定的特殊PWM波形,直到下次調用 analogWrite()(或在同一引腳使用digitalRead()或 digitalWrite())。
PWM訊號的頻率大約是490Hz。
在大多 Arduino板(ATmega168或ATmega328)上,只有引腳3,5,6,9,10和11可以實現該功能。AduinoMega上,引腳2~13可以實現該功能。Arduino舊版本的板子 (ATmega8)只有9,10,11可以使用 analogWrite()。
在使用 analogWrite()前,不需要使用 pinMode()來設定引腳。analogWrite函數與類比引腳、analogRead函數沒有直接關係。
analogReference(type); //設定類比參考電壓
analogReference函數的作用是配置引腳的參考電壓。在嵌入式應用中引腳擷取類比電壓值之後,將根據參考電壓將類比值轉換到0~1023。該函數為無傳回值函數,參考為 mode 類型,有 3 種類型(DEFAULT/INTERNAL/EXTERNAL),具體含義如下所表示。
NEFAULT:預設定,參考電壓5V
INTERNAL:低電壓模式,使用偏內基準電壓源。
INTERNAL1V1:1V的內基準電壓源(只能在 ArduinoMega使用)
INTERNAL2V56:56V的內基準電壓源(只能在 ArduinoMega使用)
EXTERNAL:擴充模式,通過AREF引腳擷取參考電壓
實際電壓 = (analogRead(pin)*基準電壓)/1024;
/*************進階I/O************/
shiftOut(dataPin, clockPin, bitOrder, val); //將一個資料以此移出
這個函數的作用是將一個資料的一個字元組中的字元組中的字元以次移出。從最高有效位(最左邊)或最低有效位(最右邊)開始。依次向資料引腳寫入每一個字元,之後時鐘引腳被拉高或拉低,指示剛才的資料有效。
注意:如果連結的裝置時鐘類型為上升沿,就要確定在調用 shiftOut()前時鐘引腳為低電平,如調用 digitalWrite(clockPin,LOW)。
這是一個軟體實現的功能。
Arduino提供了一個硬體實現的ISP函數庫,它速度更快,但只在特定引腳才會有效。
dataPin:資料輸出引腳,資料的每一個字元將逐次輸出。引腳模式需要設定成輸出。
clockPin:時鐘輸出引腳,為資料輸出提供時鐘,引腳模式需要設定成輸出。
bitOrder:資料位元移順序選擇字元,該參數為byte類型,有兩種類型可選擇,分別是高位先入 MSBFIRST 和低位先入 LSBFIRST
val:所有輸出的資料
shiftOut函數能夠將資料通過串列的方式在引腳上輸出,相當於一般意義上的同步串列通訊,這是控制器與控制器,控制器與感應器之間常用的一種通訊方式。
pulseIn(pin, state, timeout); //讀取引腳上的脈衝時間長度
pin:讀取脈衝的引腳編號
state:讀取引腳的脈衝的電平狀態
timeout:最大的讀取時間長度(已um為單位)
/************時間函數************/
millis();
millis函數可通過傳回值、返回擷取機器啟動並執行時間長度,單位為ms。系統最長的記錄時間為9小時22分,如果超出時間從0開始。函數傳回值為unsigned long 型,無參數。
delay(ms);
delay函數為一個延時函數,曾在Blink程式中用到,參數表示設定的延長時間,單位ms。
delayMicroseconds(us);
delayMicroseconds函數為一個延時函數,參數表示設定的延長時間,單位us。
/**************數學庫************/
min(x, y); //返回兩個參數中較小的值。
max(x, y); //返回兩個參數中較大的值。
abs(x); //返回參數的絕對值。
constrain(amt, low, high); //區間
如果 amt<low,則返回low的值。
如果 amt>high,則返回high的值。
如果 low<amt<high,則返回amt的值。
map(x, in_min, in_max, out_min, out_max); //區間映射
map函數的作用是將[in_min,in_max]範圍內的X等比映射到[out_min,out_max]範圍內。意思是說,這個函數可以由原來的比例範圍,換算成另一個比例範圍。
x:判斷的數字。
in_min:原來的數字範圍最小的數值。
in_max:原來的數字範圍最大的數值。
out_min:計算後範圍最小的數值。
out_max:計算後範圍最大的數值。
pow(base, exponent); //求 base的 exponent次方
sqrt(x); //求平方根
/************三角函數***********/
sin(rad); //正弦
cos(rad); //餘弦
tan(rad); //正切
/**************隨機數************/
randomSeed(seed); //產生偽隨機數。(調用random函數)
long myRandomNumber = random(max);
random(howbig); //產生偽隨機數。
random函數返回一個0~howbig-1之間的隨機數。可以做類比雜訊訊號。
random(howsmall, howbig);
/*********字串(string)**********/
charAT(); //擷取字串的第 n 個字元
String1.charAT(n); //string是字串的頭指標
compareTo(); //比較兩個字串
compareTo函數是比較兩個字串,相同返回兩個字串當前比較字串的差值。前-後
文法:string1.compareTo(string2);
string1:第一個字串
string2:第二個字串
concat(); //字串拼接
string1.concat(string2); //把 string2拼接到 string1後面
endsWith(); //字串尾部判斷對比
string1.endsWith(string2); //判斷 string1尾部是否是字串 string2,當然你也可以用它來判斷‘\n‘
equals(); //判斷字串是否相等。
string1.equals(string2);
string1:被判斷的字串
string2:判斷的字串
傳回值是布爾類型,true 和 false
equalslgnoreCase(string2); //判讀字串口是否相等。
string1.equalslgnoreCase(string2);
string1:被判斷的字串
string2:判斷的字串
傳回值是布爾類型,true 和 false
getBytes(); //字串的複製和和函數 toCharArray()功能非常相識。
string1.getBytes(buf,len);
string1:原本的字串
buf:要搬移的目的變數
len:字串長度
indexOf(); //在字串中選擇特定的字元,並返回位置的功能函數。(正向)
如果你想在一個很長的字串中尋找這個特別的關鍵字,可以使用這個函數。
string1.indexOf(val);
string1.indexOf(val,from);
string1:原本的字串
val:想要找的關鍵字,可以是char或 string 字串。
from:選擇性參數,你可以特別指定從那個位置開始尋找這個關鍵字。
傳回值:成功返回位置,失敗返回-1
lastlndexOf(); //在字串中選擇特定的字串,並返回位置的功能函數。(反向)
string1.lastlndexOf(val);
string1.lastlndexOf(val,from);
string1:原本的字串
val:想要找到的關鍵字,可以是char或者 string字串。
from:選擇性參數,你可以特別指定從那個位置回頭尋找這個關鍵字。
傳回值:成功返回位置,失敗返回-1
length(); //測量字元長度
string1.length();
string1:要被測量的字串。
傳回值:字串的長度。
replace(); //字串替換
string1.replace(string2,string3);
string1:原本的字串。
string2:在字串中欲被替換的字串。
string3:要替換之後的新字串。
傳回值:無
setCharAt(); //字元替換
string1.setCharAt(i,charl);
string1:原本的字串。
i:字串中欲被換掉的字元的位置。
charl:要替換的字元,注意只有一個字元,而不是字串。
傳回值:無
startsWith(); //判斷字串是否已某個特殊的字串開始的
string1.starts With(string2);
string1:原本的字串。
string2:判斷是不是已這個字串開始。
傳回值:布爾代數,true 和 false
substring(); //用來截取字串中間的某一位置。另外是決定那裡結束。
string1.substring(from); //返回 from 之後的
string1.substring(from,to); //返回 from 和 to 之間的
string1:原本的字串
from:要截取的字串從第幾個字開始。
to:要截取後面的第幾個字。
傳回值:返回的字串。
toCharArray(); // 把string拷貝char中
toCharArray函數是字串處理中常用的一個函數,你可以把他當成 string 轉 char[] 的轉換函式,或者複製文字的函數,他的功能和 getBytes()非常相似,toCharArray()函數轉換後是呈現文字,而getBytes()函數轉換後是呈現數字。
string1.toCharArray(buf,len);
string:原本的字串。
buf:指定的char[]的位置,注意char[]的空間,一個要等於或大於複製的大小,不然儲存空間和程式都會產生不可預期的問題。
len:要複製的字串長度。
傳回值:要複製的字串長度。
toInt(); // string 轉 int
string1.toInt();
string1:字串,如"123"
傳回值:整數,如 123
toLowerCase(); //把英文全部轉換為小寫
string1.toLowerCase();
string1:字串(全英文)
傳回值:字串(小寫)
toUpperCase(); //把英文全部轉換為大寫
string1.toUpperCase();
string1:字串(全英文)
傳回值:字串(大寫)
trim(); //自動清除字串中最前面和最後面的空白資料。
string1.trim();
string1:原本的字串。
傳回值:無。
/**************位操作************/
lowByte();
highByte();
bitRead();
bitWrite();
bitSet();
bitClear();
bit();
/*********設定中斷函數***********/
attachInterrupt(interrupt, function, mode); //中斷設定函數
attachInterrupt函數用於設定外部中斷,函數有3個參數:interrupt、function、mode分別代表中斷源,中斷處理函數,觸發模式。參數選項可選值0或1,在 Arduino中,一般對應2號和3號引腳;參數中斷處理函數用來指定中段的處理函數,參數值為函數指標,
觸發模式有4種:
LOW(低點平觸發)、
CHANGE(變化時觸發)、
RISING(低點平轉為高點平)、
FALLING(高點平轉為低點平觸發)。
注意:
在中斷函數中 delay函數不能使用。
在使用 millis函數始終返回進入中斷前的值。
讀取串列資料的話,可能會丟失。
中斷函數中使用的變數需要定義為 volatile 類型。
detachInterrupt(interrupt); //取消中斷
interrupt為所要取消的中斷源。
/***********開關中斷************/
interrupts(); //從新啟用noInterrupts關閉的中斷
noInterrupts(); //關閉已經開啟的中斷
/***********串口通訊************/
Serial.begin(speed); //設定串口的通訊速率
speed:int 整數,用來設定傳輸速率,通常是這幾個數:300,600,1200,2400,4800,9600,14400,19200,28800,18400,57600或115200
傳回值:無
Serial.available(); //擷取前串口緩衝池的資料量。串口的緩衝區預設只有64位元組,但大小是可以改變的,詳情見:http://www.cnblogs.com/jikexianfeng/p/6250564.html
Serial.read(); //用來讀取資料,每次只能讀取一個字元。
Serial.available函數和 Serial.read函數通常是在一起使用,Serial.available函數是用來判斷是否有資料送進來,我們接著用 Serial.read函數用來讀取資料。
Serial.flush(); //清空緩衝區資料,Serial.flush()函數的功能在arduino1.0之前和之後版本是不一樣的。之前版本是用來清除已經進入緩衝區的輸入的串口資料,1.0版之後,用來等待要發送的串口資料發送完畢。詳情:http://www.cnblogs.com/jikexianfeng/p/6250638.html
Serial.print(data); //串口輸出
Serial.println(data); //串口輸出(比print的尾部多一個分行符號。)
/************擴充庫************/
如果要使用一些已有的庫, 可以選擇菜單"Sketch->Import Library", 然後選擇 相應的庫. Sketch工具會自己在代碼的開頭包含庫的標頭檔(#include).
在引入庫之後, 程式的體積也將會增大(因為包含了庫的代碼). 對於不是必要的庫, 直接刪除對應的#include語句就可以了.
官方擴充庫
以下是Arduino官方提供的擴充庫, 被預設包含在開發工具中.
EEPROM - 讀寫EEPROM儲存區.
Ethernet - 乙太網路支援.
Firmata - 基於串口的通訊協議.
LiquidCrystal - LCD液晶顯示.
Servo - 伺服電機.
SoftwareSerial - 軟體實現的串口, 可以選擇任意引腳.
Stepper - 步進電機.
Wire - I2C協議支援.
Matrix - LED顯示陣列控制.
Sprite - LED顯示陣列中子塊控制.
第三方擴充庫
這裡只包含了Roboduino擴充板的相關庫, 其他的庫資訊請訪問: Arduino線上文檔 online~.
Roboduino擴充板:
RoboduinoMotor - Roboduino電機擴充板驅動.
如果需要設計自己的庫, 請參考"arduino\hardware\libraries"目錄中相關庫的代碼.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
參考書籍:http://blog.csdn.net/powenko/article/details/48570043#plain
參考文檔:https://www.douban.com/note/493189178/
參考網站:http://wiring.org.co/reference/
參考網頁:http://www.cnblogs.com/jikexianfeng/p/6031291.html
參考網頁:http://www.cnblogs.com/rayray/p/3198091.html
參考網頁:http://www.cnblogs.com/jikexianfeng/p/6250638.html
進階之路(基礎篇) - 011 arduino api基礎手冊