【单片机】Arduino(以UNO R3为例)
文章目錄
- 單片機(jī)是什么?
- 如何學(xué)習(xí)單片機(jī)
- Arduino系列單片機(jī)介紹
- 官網(wǎng)文件
- 其他問題匯總 /* 2021.10.24更新 */
- Arduino語言
- 1. C語言基礎(chǔ)
- 2. 數(shù)據(jù)類型
- (1)各數(shù)據(jù)類型占用字節(jié)數(shù)
- (2)Arduino中特有的數(shù)據(jù)類型
- ?? i) boolean ··· 布爾類型
- ?? ii) byte ··· 字節(jié)類型
- ?? iii) word ··· 字類型
- ?? iv) String ··· 特殊的字符串
- 3. 程序結(jié)構(gòu)
- 4. 函數(shù)總結(jié)
- (1)數(shù)字 I/O(GPIO)
- pinMode()
- digitalWrite()
- digitalRead()
- (2)模擬 I/O(ADC & Timer)
- analogRead()
- analogWrite()
- (3)高級(jí) I/O(Soft USART)
- shiftOut()
- shiftIn()
- pulseIn()
- tone()
- noTone()
- (4)時(shí)間函數(shù)(Timer)
- millis()
- micros()
- delay()
- delayMicroseconds()
- (5)數(shù)學(xué)函數(shù)
- min()
- max()
- constrain()
- map()
- pow()
- sqrt()
- 三角函數(shù)
- (6)字符判斷函數(shù)
- (7)隨機(jī)函數(shù)
- random()
- randomSeed()
- (8)字節(jié)函數(shù)
- (9)外部中斷函數(shù)(GPIO Interrupt)
- interrupts()
- noInterrupts()
- attachInterrupt()
- detachInterrupt()
- 串行通訊(Hardware)
- UART
- if (Serial)
- available()
- availableForWrite()
- begin()
- end()
- write()
- read()
- peek()
- print()
- println()(ln為"line"的縮寫)
- readBytes()
- readBytesUntil()
- readString()
- readStringUntil()
- find()
- findUntil()
- flush()
- setTimeout()
- parseFloat()
- parseInt()
- SPI
- I2C
- 高級(jí)應(yīng)用:用AVR開發(fā)Arduino
- 其他操作
- 1. Arduino IDE的“高級(jí)用法”——串口繪圖器
- 2. Arduino IDE的替代編輯器——Visual Studio Code
- 3. Arduino IDE v2.0 Beta版本
- 4. 記錄兩個(gè)寫得非常好的教程
單片機(jī)是什么?
??單片機(jī),全稱單片微型計(jì)算機(jī)(英語:Single-chip Microcomputer),又稱微控制器單元(Microcontroller Unit),是把中央處理器、存儲(chǔ)器、定時(shí)/計(jì)數(shù)器(timer/counter)、各種輸入輸出接口等都集成在一塊集成電路芯片上的微型計(jì)算機(jī)。與應(yīng)用在個(gè)人電腦中的通用型微處理器相比,它更強(qiáng)調(diào)自供應(yīng)(不用外接硬件)和節(jié)約成本。它的最大優(yōu)點(diǎn)是體積小,可放在儀表內(nèi)部,但存儲(chǔ)量小,輸入輸出接口簡單,功能較低。由于其發(fā)展非常迅速,舊的定義已不能滿足,所以在很多應(yīng)用場合被稱為微控制器,中文翻譯為“單片機(jī)”,英文縮寫為MCU。
參考: 單片機(jī)-維基百科
如何學(xué)習(xí)單片機(jī)
??在經(jīng)過電賽那段時(shí)間的培訓(xùn)之后,我突然覺得,想要真正掌握一款單片機(jī),首先是要理解單片機(jī)的原理,這也是最重要的,不理解單片機(jī)的工作原理只是不斷地套代碼,確實(shí)也可以做成一些項(xiàng)目,但如果遇到比較底層的問題想要解決可能就會(huì)很困難。
??其次的話,我覺得就是要學(xué)會(huì)看官方手冊(cè),和真正理解示例代碼。很多人包括我,在入門的時(shí)候往往會(huì)被官方手冊(cè)中大段的英文以及示例中幾百行代碼(或注釋)嚇得有點(diǎn)怕,但后來我的老師告訴了我一個(gè)很簡單但卻被忽略的方法:根據(jù)自己學(xué)過的知識(shí)抓住關(guān)鍵,不求全部看懂,先理解框架。所以:先求完成,再求完美,切勿好高騖遠(yuǎn)。 與君共勉!
Arduino系列單片機(jī)介紹
官網(wǎng)文件
??注:Arduino主要編寫語言為C/C++。
??為了詳細(xì)了解Arduino單片機(jī)的信息,我們需要到官網(wǎng)去查找更詳細(xì)的資料,首先打開官網(wǎng):https://www.arduino.cc/,在搜索欄中搜索對(duì)應(yīng)的型號(hào),這里以UNO R3這個(gè)型號(hào)為例(其他型號(hào)類似)進(jìn)入詳情頁面:
??這里截取官網(wǎng)提供的引腳圖,建議一定要保存一份!!!
??繼續(xù)往下翻,可以看到Features(UNO的特性介紹)板塊:
??在最后的Resource板塊還可以下載Arduino相關(guān)的資料及集成開發(fā)環(huán)境,這里方便起見,匯總一下:
??到此,官方的相關(guān)文件初步下載完畢了,IDE也安裝完畢,現(xiàn)在就可以開始學(xué)習(xí)Arduino的語言了。
其他問題匯總 /* 2021.10.24更新 */
??之前一直以為這篇教程寫得非常完善了,但還有一些電氣特性沒有交代好,下面補(bǔ)充一下。
- Arduino數(shù)字引腳是TTL電平,這個(gè)在使用的時(shí)候還是需要注意一下。具體可以參考這篇鏈接。
- Arduino一共有3種供電方案,相信這也是很多人開始使用Arduino時(shí)非常關(guān)注的點(diǎn)。第一種是最常見的,也就是用USB供電,比如插在電腦上或者充電寶等。第二種是使用直流穩(wěn)壓5V供電,方法是接入5V和GND,這種一定要保證電源電壓的穩(wěn)定性。第三種是Vin輸入,輸入7-12V,如果低于7V,可能會(huì)導(dǎo)致Arduino工作不穩(wěn)定。第四種是黑色端子輸入電壓,要求輸入電壓為9-12V,如果低于9V,可能會(huì)導(dǎo)致Arduino工作不穩(wěn)。具體可以參考這篇文章。
- 這里有一個(gè)比較完整的介紹文件,可以參考一下,鏈接。
Arduino語言
1. C語言基礎(chǔ)
??此處一些C語言的基本用法(包括基本數(shù)據(jù)變量,基本程序結(jié)構(gòu)等)就不再介紹了,如果有需求的可以去網(wǎng)上找一些資料復(fù)習(xí)一下,也可以看看這個(gè)鏈接。
2. 數(shù)據(jù)類型
(1)各數(shù)據(jù)類型占用字節(jié)數(shù)
??注意:在單片機(jī)的程序中,很多時(shí)候只會(huì)關(guān)注數(shù)據(jù)的字節(jié)數(shù),而不關(guān)心它到底是什么類型的。另外,數(shù)據(jù)類型占用的字節(jié)數(shù)與單片機(jī)的位數(shù)無關(guān)!!!而是與編譯器的類型有關(guān),詳情可以參見這篇博客:int字節(jié)問題說明
(2)Arduino中特有的數(shù)據(jù)類型
?? i) boolean ··· 布爾類型
???布爾類型占用1個(gè)字節(jié),其值只能為1(true)或 0(false)。關(guān)于bool和boolean可以參考這篇文章。
?? ii) byte ··· 字節(jié)類型
???儲(chǔ)存的數(shù)值范圍為0到255,占用1個(gè)字節(jié)。
?? iii) word ··· 字類型
???在UNO等基于ATMEGA芯片的板子上,word為無符號(hào)16位整數(shù),其他型號(hào)為無符號(hào)32位整數(shù)。
?? iv) String ··· 特殊的字符串
???String類型(首字母為大寫)本質(zhì)上為一個(gè)類,允許以比字符數(shù)組更復(fù)雜的方式使用和操作文本字符串。 可以連接字符串、附加、搜索和替換子字符串等。 它比簡單的字符數(shù)組需要更多的內(nèi)存,但也更有用。
???另外需要注意的是,雙引號(hào)內(nèi)的一個(gè)字符串會(huì)被看作字符數(shù)組,而不是String類的實(shí)例。
???構(gòu)建一個(gè)String類有很多種方法,如下所示:
String stringOne = "Hello String"; // using a constant String String stringOne = String('a'); // converting a constant char into a String String stringTwo = String("This is a string"); // converting a constant string into a String object String stringOne = String(stringTwo + " with more"); // concatenating two strings String stringOne = String(13); // using a constant integer String stringOne = String(analogRead(0), DEC); // using an int and a base String stringOne = String(45, HEX); // using an int and a base (hexadecimal) String stringOne = String(255, BIN); // using an int and a base (binary) String stringOne = String(millis(), DEC); // using a long and a base String stringOne = String(5.698, 3); // using a float and the decimal places(保留3位小數(shù))???String類相關(guān)操作函數(shù)總結(jié)
string.charAt(n); //訪問第n+1個(gè)字符,返回該字符 string.setCharAt(index, c); //將string中的index位置的字符設(shè)為c string.compareTo(string2); //按字母比較兩個(gè)字符串,如果string > string2,返回正值,如果 //string < string2,返回負(fù)值,如果相等,返回0。另外,string這種類型可以用運(yùn)算符進(jìn)行比較和運(yùn)算 //比如 ==, !=,>, < ,>=, <= string.equals(string2); //判斷string和string2是否相等,相當(dāng)于 string == string2 string.equalsIgnoreCase(string2); //忽略字符大小寫的比較,返回一個(gè)布爾值 string3 = string.concat(string, string2); //string3 = string + string2; string.concat(string2); //string += string2; /*string類型還可以加上字符(常、變)、整數(shù)(常、變)、字符串(常),但要注意不能混用: stringThree = stringOne + 123456789; stringThree = stringOne + 'A'; stringThree = stringOne + "abc"; */ string.c_str();//將string轉(zhuǎn)換成C風(fēng)格的無終止符的字符串,返回的是字符串首地址,一個(gè)指針。 string.endsWith(string2);//判斷string是否以string2中的字符結(jié)尾,返回一個(gè)布爾值 string.startsWith(string2, n);//判斷從第n+1個(gè)字符開始,string是不是以string2開頭,n默認(rèn)為0,返回一個(gè)布爾值 string.getBytes(buf, len);//將string存入len長度的緩存區(qū)buf中。string.indexOf(val); //在string中搜索字符或字符串val,默認(rèn)從頭開始搜索 string.indexOf(val, from);//如果加上了from,則從from處開始檢索,返回val所在的位置,如果沒找到,返回-1 string.lastIndexOf(val);//和上面一樣,只是從后開始檢索 string.lastIndexOf(val, from);string.length();//求字符串的長度 string.remove(index); //移除從index開始后的count個(gè)數(shù)的字符,若沒有count,則默認(rèn)到末尾 string.remove(index, count); //就地轉(zhuǎn)換,無返回值 string.replace(substring1, substring2);//將string中的子字符串substring1替換為substring2,返回新的字符串 string.reserve(size);//給string申請(qǐng)size大小的存儲(chǔ)空間 string.substring(from); //截取string的子字符串,從from(包含)到to(不包含), string.substring(from, to); //如果沒有to,則默認(rèn)到末尾,返回子字符串 string.toCharArray(buf, len); //將字符串由String類型轉(zhuǎn)換成char[]類型,其中buf為轉(zhuǎn)換后的字符數(shù)組,len為buf的長度 string.toInt(); //將字符串轉(zhuǎn)換為整型,要求string第一個(gè)字符必須為數(shù)字,如果遇到非數(shù)字字符,轉(zhuǎn)換將停止,函數(shù)返回一個(gè)long類型,如果字符串開頭不是數(shù)字,則返回0 string.toFloat(); //將字符串轉(zhuǎn)換為浮點(diǎn)型,和上面一樣,要求字符串第一個(gè)字符為數(shù)字,如果遇到非字符數(shù)字或小數(shù)點(diǎn),轉(zhuǎn)換將停止,如果只有整數(shù),后面默認(rèn)加上“.00”,返回一個(gè)浮點(diǎn)數(shù),注意數(shù)字有效數(shù)字為6-7位 string.toLowerCase(); //將字符串轉(zhuǎn)換為小寫字母,就地轉(zhuǎn)換,無返回值 string.toUpperCase(); //將字符串轉(zhuǎn)換為大寫字母,就地轉(zhuǎn)換,無返回值 string.trim(); //獲取刪除開頭和結(jié)尾whitespace的字符串版本,就地轉(zhuǎn)換,無返回值 char thisChar = string1[n]; //用[]訪問特定位置的元素3. 程序結(jié)構(gòu)
??每次新建一個(gè)uno程序時(shí),都可以看到如下這個(gè)界面,
??由此可知,程序預(yù)置了兩個(gè)函數(shù),分別是setup()和loop()。
- setup() :每次Arduino上電或按下reset按鈕時(shí),程序會(huì) 執(zhí)行一遍 setup中的內(nèi)容,因此一般用來初始化變量(不能聲明變量!),設(shè)置引腳模式,開始使用庫等操作。
- loop() :運(yùn)行完setup函數(shù)后,程序會(huì) 反復(fù)執(zhí)行 loop中的內(nèi)容,所以如果在loop程序中放置死循環(huán)(比如while(1)),那么死循環(huán)前的程序只會(huì)執(zhí)行一次。
??注意:uno程序中沒有main函數(shù)
4. 函數(shù)總結(jié)
(1)數(shù)字 I/O(GPIO)
pinMode()
a. 功能
設(shè)置 數(shù)字引腳(GPIO) 的輸入輸出模式
b. 語法
c. 參數(shù)解釋
pin:GPIO引腳號(hào)(參考上文中的引腳圖 D開頭的引腳)
mode:輸入輸出模式,有以下選項(xiàng):
- INPUT:輸入模式,禁用上拉電阻
- INPUT_PULLUP:輸入模式,使能上拉電阻
- OUTPUT:輸出模式
d. 返回值
無
e. 說明
digitalWrite()
a. 功能
設(shè)置GPIO引腳的輸出電平(高低)
b. 語法
c. 參數(shù)解釋
pin:GPIO引腳號(hào)(參考上文中的引腳圖 D開頭的引腳)
value:電平值,有以下選項(xiàng):
- HIGH:輸出高電平,5V(如果是3.3V的板子則是3.3V)
- LOW:輸出低電平(0V,ground)
d. 返回值
無
e. 說明
digitalRead()
a. 功能
讀取GPIO引腳電平
b. 語法
c. 參數(shù)解釋
pin:GPIO引腳號(hào)(參考上文中的引腳圖 D開頭的引腳)
d. 返回值
引腳電平值,為HIGH(對(duì)應(yīng)高電平)或LOW(對(duì)應(yīng)低電平)
e. 說明
如果該引腳為空,則返回值是隨機(jī)的,HIGH或LOW。
(2)模擬 I/O(ADC & Timer)
analogRead()
a. 功能
讀取引腳模擬值
b. 語法
c. 參數(shù)解釋
pin:模擬引腳號(hào)(0 ~ 5或A0 ~ A5)
d. 返回值
一個(gè)整型數(shù),0 ~ 1023,對(duì)應(yīng)電壓值為0 ~ 5V,每增加4.88mV,返回值增加1。
e. 說明
NADC=1023?VinVrefN_{ADC}=1023\cdot \frac{V_{in}}{V_{ref}} NADC?=1023?Vref?Vin??
其中參考電壓Vref默認(rèn)值為5V,如果需要設(shè)置其他的參考電壓,可以使用 analogReference(type) 函數(shù),其參數(shù)type如下所示
-
- DEFAULT:默認(rèn)參考電壓值
- INTERNAL:一個(gè)內(nèi)置的參考電壓,ATmega168和ATmega328為1.1V;ATmega8為2.56V(Mega不適用)
- INTERNAL1V1:內(nèi)置的1.1V參考電壓(只有Mega適用)
- INTERNAL2V56:內(nèi)置的2.56V參考電壓(只有Mega適用)
- EXTERNAL:外接參考電壓(AREF引腳),但電壓范圍必須在 0 ~ 5V之間!
analogWrite()
a. 功能
特定的數(shù)字引腳輸出PWM波
b. 語法
c. 參數(shù)解釋
pin:特定的數(shù)字引腳,在Arduino UNO中只有引腳3、5、6、9、10、11支持PWM輸出(即引腳數(shù)字前有波浪線的引腳)。
value:PWM占空比(the duty cycle),一個(gè)整型數(shù),范圍在0 ~ 255之間。
d. 返回值
無
e. 說明
- PWM輸出其本質(zhì)是調(diào)用定時(shí)器的比較模塊,而Arduino UNO中內(nèi)置了三個(gè)定時(shí)器,分別是Timer0,Timer1、Timer2。
- Timer0 為8位定時(shí)器,對(duì)應(yīng)引腳5和6,其產(chǎn)生的PWM頻率為490HZ
- Timer1 為16位定時(shí)器,對(duì)應(yīng)引腳9和10,其產(chǎn)生的PWM的頻率為980HZ
- Timer2 為8位定時(shí)器,對(duì)應(yīng)引腳3和11,其產(chǎn)生的PWM頻率為490HZ
- 此外,由于delay()、millis()、delayMicroseconds() 等函數(shù)依賴于定時(shí)器Timer0,因此5、6引腳輸出的PWM波的占空比可能會(huì)高于預(yù)期值(higher-than-expected)
- 調(diào)用analogWrite()函數(shù)前可以不調(diào)用pinMode()函數(shù)。
- analogWrite()函數(shù)雖然和analogRead()函數(shù)很相近,但二者沒有任何關(guān)系,一個(gè)是定時(shí)器的比較模塊,一個(gè)是ADC模塊。
(3)高級(jí) I/O(Soft USART)
shiftOut()
a. 功能
串行輸出數(shù)據(jù),一次一位(one bit a time)
b. 語法
c. 參數(shù)解釋
dataPin: 串行輸出數(shù)據(jù)的引腳號(hào)(int)
clockPin: 時(shí)鐘引腳號(hào)(int)
bitOrder: 串行傳輸數(shù)據(jù)的順序,有以下選項(xiàng):
- MSBFIRST(Most Significant Bit First):從左往右傳輸,大數(shù)優(yōu)先
- LSBFIRST(Least Significant Bit First):從右往左傳輸,小數(shù)優(yōu)先
value: 需要傳輸?shù)臄?shù)據(jù)(byte)
d. 返回值
無
e. 說明
shiftIn()
a. 功能
串行讀取數(shù)據(jù),一次一位(one bit a time)
b. 語法
c. 參數(shù)解釋
dataPin: 串行輸出數(shù)據(jù)的引腳號(hào)(int)
clockPin: 時(shí)鐘引腳號(hào)(int)
bitOrder: 串行傳輸數(shù)據(jù)的順序,有以下選項(xiàng):
- MSBFIRST(Most Significant Bit First):從左往右傳輸,最高位優(yōu)先
- LSBFIRST(Least Significant Bit First):從右往左傳輸,最低位優(yōu)先
d. 返回值
讀取的數(shù)據(jù)(byte)
e. 說明
參考shiftOut
pulseIn()
a. 功能
讀取脈沖(高脈沖或低脈沖)的時(shí)間寬度
b. 語法
c. 參數(shù)解釋
pin:脈沖讀取引腳;
value:讀取脈沖的形式(高脈沖、低脈沖):
- HIGH:讀取高脈沖(高電平持續(xù)時(shí)間)
- LOW:讀取低脈沖(低電平持續(xù)時(shí)間)
timeout(optional):等待時(shí)間(unsigned long,單位:μs)
d. 返回值
脈沖的時(shí)間寬度(單位:μs),如果在timeout時(shí)間內(nèi)沒有讀取到脈沖則返回0.
e. 說明
脈沖長度讀取范圍為 10μs~3min,超過這個(gè)范圍讀取值會(huì)發(fā)生錯(cuò)誤
tone()
a. 功能
產(chǎn)生特定頻率的方波(即音調(diào))
b. 語法
c. 參數(shù)解釋
pin:產(chǎn)生音調(diào)的引腳
frequency:音調(diào)的頻率(單位:Hz)
duration(optional):持續(xù)時(shí)間(單位:μs),如果沒有則音調(diào)直到調(diào)用noTone函數(shù)時(shí)停止。
d. 返回值
無
e. 說明
noTone()
a. 功能
停止引腳上的音頻輸出
b. 語法
c. 參數(shù)解釋
pin:需要停止輸出音頻的引腳。
d. 返回值
無
(4)時(shí)間函數(shù)(Timer)
millis()
a. 功能
返回定時(shí)器的計(jì)數(shù)值(單位:ms)——自程序運(yùn)行開始計(jì)時(shí),大約50天溢出 (根據(jù)unsigned long數(shù)據(jù)大小算出來的,因此返回值必須用unsigned long類型接收)
b. 語法
c. 參數(shù)解釋
無
d. 返回值
定時(shí)器的計(jì)數(shù)值(單位:ms,unsigned long)
micros()
a. 功能
返回定時(shí)器的計(jì)數(shù)值(單位:μs)——自程序運(yùn)行開始計(jì)時(shí),大約70min溢出 (根據(jù)unsigned long數(shù)據(jù)大小算出來的,因此返回值必須用unsigned long類型接收)
b. 語法
c. 參數(shù)解釋
無
d. 返回值
定時(shí)器的計(jì)數(shù)值(單位:μs,unsigned long)
delay()
a. 功能
延時(shí)(ms級(jí))
b. 語法
c. 參數(shù)解釋
ms:延時(shí)時(shí)間,單位為ms(unsigned long)
d. 返回值
無
delayMicroseconds()
a. 功能
延時(shí)(μs級(jí))
b. 語法
c. 參數(shù)解釋
us:延時(shí)的微秒數(shù)(unsigned long)
d. 返回值
無
e. 說明
(5)數(shù)學(xué)函數(shù)
min()
a. 功能
取兩個(gè)數(shù)中的較小值
b. 語法
c. 參數(shù)解釋
x,y:需要比較的數(shù),數(shù)據(jù)類型任意
d. 返回值
兩個(gè)數(shù)中的較小值。
max()
a. 功能
取兩個(gè)數(shù)中的較大值
b. 語法
c. 參數(shù)解釋
x,y:需要比較的數(shù),數(shù)據(jù)類型任意
d. 返回值
兩個(gè)數(shù)中的較大值。
e. 說明
constrain()
a. 功能
限制數(shù)據(jù)的范圍。
b. 語法
c. 參數(shù)解釋
x:需要限制的范圍,任意數(shù)據(jù)類型;
a:限制下限,任意數(shù)據(jù)類型;
b:限制上限,任意數(shù)據(jù)類型。
d. 返回值
- 如果a<=x<=b,返回x;
- 如果x>b,返回b;
- 如果x<a,返回a。
map()
a. 功能
將一個(gè)整數(shù)從一個(gè)范圍映射到另一個(gè)范圍。
b. 語法
c. 參數(shù)解釋
value:需要映射的值,long類型
fromLow:原范圍下限,long類型
fromHigh:原范圍上限,long類型
toLow:映射的范圍下限,long類型
toHigh:映射范圍上限,long類型
d. 返回值
映射后的值(long)
e. 說明
pow()
a. 功能
指數(shù)運(yùn)算函數(shù)
b. 語法
c. 參數(shù)解釋
base:底數(shù)(float)
exponent:指數(shù)(float)
d. 返回值
運(yùn)算結(jié)果(double)
sqrt()
a. 功能
求平方根
b. 語法
c. 參數(shù)解釋
x:需要求平方根的數(shù),任意數(shù)據(jù)類型
d. 返回值
運(yùn)算結(jié)果(double)
e. 說明
注意與 sq(x) 函數(shù)進(jìn)行區(qū)分,sq(x) 是求x的平方,x為任意數(shù)據(jù)類型。
三角函數(shù)
sin(rad); //rad為弧度,float類型,計(jì)算結(jié)果為double類型 cos(rad); //rad為弧度,float類型,計(jì)算結(jié)果為double類型 tan(rad); //rad為弧度,float類型,計(jì)算結(jié)果為double類型(6)字符判斷函數(shù)
??字符判斷函數(shù)取自C語言的庫<ctype.h>,函數(shù)格式相同:
bool fun_name(char c)即參數(shù)都是char類型,返回值均為布爾型,注意:Arduino中的char類型默認(rèn)是unsigned char!,參考鏈接
isAlphaNumeric(thisChar); //判斷字符是否為數(shù)字或字母('0'~'9','A'~'Z','a'~'z') isAlpha(thisChar); //判斷字符是否為字母Alphabetical('A'~'Z','a'~'z') isLowerCase(thisChar); //判斷字符是否為小寫字母 isUpperCase(thisChar); //判斷字符是否為大寫字母 isSpace(thisChar); //判斷字符是否為空格 isAscii(thisChar); //判斷字符是否為ASCII字符(0~127) isWhitespace(thisChar); //判斷字符是否為whitespace isControl(thisChar); //判斷字符是否為控制字符 isDigit(thisChar); //判斷字符是否為數(shù)字 isGraph(thisChar); //判斷字符是否為可打印字符 isPrintable(thisChar); //判斷字符是否為可打印字符 isPunct(thisChar); //判斷字符是否為標(biāo)點(diǎn)符號(hào) isHexadecimalDigit(thisChar); //判斷字符是否為有效的十六進(jìn)制數(shù)字(7)隨機(jī)函數(shù)
random()
a. 功能
生成一定范圍內(nèi)的隨機(jī)數(shù)(整數(shù))
b. 語法
c. 參數(shù)解釋
max:隨機(jī)數(shù)的上限,不包含(long)
min(optional):隨機(jī)數(shù)的下限,包含在內(nèi),沒有默認(rèn)為0
d. 返回值
一個(gè)隨機(jī)數(shù)(long),范圍 [min, max-1]
e. 說明
這個(gè)函數(shù)產(chǎn)生的隨機(jī)數(shù)確實(shí)是符合隨機(jī)分布,但每次產(chǎn)生的隨機(jī)數(shù)的序列都是一樣的,所以本質(zhì)上是一個(gè)偽隨機(jī)函數(shù),如果需要產(chǎn)生真隨機(jī)函數(shù),就需要改變隨機(jī)數(shù)的序列,方法就是利用 randomSeed() 生成一個(gè)隨機(jī)“種子”,或者叫隨機(jī)源,詳情見后面。
randomSeed()
a. 功能
初始化隨機(jī)數(shù)源
b. 語法
c. 參數(shù)解釋
seed:為一個(gè)整形數(shù)(long or int),但為了保持隨機(jī)性,一般設(shè)置為空引腳的analogRead值,比如analogRead(A0)
d. 返回值
無
(8)字節(jié)函數(shù)
??在單片機(jī)中傳輸數(shù)據(jù)時(shí),往往最關(guān)心的就是數(shù)據(jù)的字節(jié)數(shù),因此掌握字節(jié)操作函數(shù)對(duì)傳輸數(shù)據(jù)處理有很大幫助。
lowByte(x); //獲取x的最低字節(jié),x為任意數(shù)據(jù)類型,返回一個(gè)字節(jié) highByte(x); //獲取x的最低字節(jié),x為任意數(shù)據(jù)類型,返回一個(gè)字節(jié) bitRead(x, n); //讀取x的第n-1位,最低位為0,從右至左依次增加。返回1或0 bitWrite(x, n, b); //將x的第n-1位寫為b,b為0或1,無返回值 bitSet(x, n); //將x的第n-1位置1 bitClear(x, n); //將x的第n-1位清0(9)外部中斷函數(shù)(GPIO Interrupt)
interrupts()
a. 功能
打開總中斷
b. 語法
c. 參數(shù)解釋
無
d. 返回值
無
e. 說明
Arduino的中斷默認(rèn)是打開的,只有當(dāng)中斷被關(guān)閉時(shí)才會(huì)使用該函數(shù)重新打開。
noInterrupts()
a. 功能
關(guān)閉總中斷
b. 語法
c. 參數(shù)解釋
無
d. 返回值
無
attachInterrupt()
a. 功能
設(shè)置中斷服務(wù)程序(Interrupt Service Routine,簡稱ISR)
b. 語法
c. 參數(shù)解釋
pin:中斷引腳,在UNO型號(hào)中,只支持2、3引腳。
ISR:中斷服務(wù)程序(一個(gè)無參數(shù)無返回值的函數(shù))
mode:中斷模式,有以下選項(xiàng):
- LOW:在引腳為低電平時(shí),產(chǎn)生中斷
- CHANGE:引腳電平改變時(shí)(上升沿或下降沿),產(chǎn)生中斷
- RISING:上升沿中斷
- FALLING:下降沿中斷
- HIGH:引腳為高電平時(shí),發(fā)生中斷 (只支持Due,Zero)
interrupt:或者叫interrupt number,與引腳號(hào)一一對(duì)應(yīng)但不相同,如下圖所示:
d. 返回值
無
e. 說明
??中斷服務(wù)程序(ISR)是一種特殊的函數(shù),沒有參數(shù),沒有返回值,當(dāng)程序進(jìn)入中斷服務(wù)程序時(shí),總中斷會(huì)關(guān)閉,只有在執(zhí)行完畢當(dāng)前的ISR才能去執(zhí)行下一個(gè)ISR,因此一次只能執(zhí)行一個(gè)ISR,且ISR內(nèi)不能再嵌套ISR。因此,需要依賴中斷的函數(shù)在ISR內(nèi)將失效,比如delay(), millis(), micros() ,而函數(shù)delayMicroseconds() 仍然有效。
??當(dāng)程序有多個(gè)中斷時(shí),且執(zhí)行頻率較高的話,就需要將ISR寫得盡可能簡潔。由于ISR沒有參數(shù),如果需要傳遞變量,需要將變量定義為全局變量,且要加上volatile 關(guān)鍵字,表明在ISR中可以進(jìn)行修改。
detachInterrupt()
a. 功能
關(guān)閉特定的中斷
b. 語法
c. 參數(shù)解釋
pin:中斷引腳
interrupt:中斷數(shù)字,參見上面的解釋
d. 返回值
無
e. 說明
注意和noInterrupt() 函數(shù)區(qū)分,后者是關(guān)閉總中斷,而該函數(shù)是關(guān)閉某個(gè)外部中斷。
串行通訊(Hardware)
UART
??在Arduino UNO中,只有一個(gè)UART模塊,對(duì)應(yīng)數(shù)字引腳0和1,程序中,用Serial這個(gè)類表示串口,其內(nèi)部預(yù)置了很多函數(shù),用來實(shí)現(xiàn)串口通訊的各種功能。以下將一一介紹
if (Serial)
a. 功能
指示某個(gè)串口是否連接(比如打開電腦上的串口)(但只適用于Leonardo, Yun中連接USB的端口)
b. 語法
c. 參數(shù)解釋
無
d. 返回值
一個(gè)布爾值,連接為true,未連接為false。
available()
a. 功能
返回到達(dá) 串行緩存區(qū)(64 byte) 中但未被讀取的字節(jié)的個(gè)數(shù)
b. 語法
c. 參數(shù)解釋
無
d. 返回值
未被讀取的字節(jié)數(shù)
availableForWrite()
a. 功能
在不阻塞寫操作的情況下獲取可用于寫入串行緩沖區(qū)的字節(jié)數(shù)。
b. 語法
c. 參數(shù)解釋
無
d. 返回值
待寫字節(jié)數(shù)。
begin()
a. 功能
串口初始化設(shè)置(波特率,數(shù)據(jù)傳輸格式)
b. 語法
c. 參數(shù)解釋
speed:波特率(1s傳輸多少位)與電腦的連接一般是300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200中的一種,在引腳0和1連接時(shí)可以根據(jù)外設(shè)任意設(shè)置。
config:數(shù)據(jù)傳輸格式:數(shù)據(jù)位(7位,8位或其他),校驗(yàn)位(奇校驗(yàn)Odd,偶校驗(yàn)Even,無校驗(yàn)None),停止位(1位或2位),一般有如下選項(xiàng):
- SERIAL_5N1
- SERIAL_6N1
- SERIAL_7N1
- SERIAL_8N1 (the default)
- SERIAL_5N2
- SERIAL_6N2
- SERIAL_7N2
- SERIAL_8N2
- SERIAL_5E1
- SERIAL_6E1
- SERIAL_7E1
- SERIAL_8E1
- SERIAL_5E2
- SERIAL_6E2
- SERIAL_7E2
- SERIAL_8E2
- SERIAL_5O1
- SERIAL_6O1
- SERIAL_7O1
- SERIAL_8O1
- SERIAL_5O2
- SERIAL_6O2
- SERIAL_7O2
- SERIAL_8O2
d. 返回值
無
end()
a. 功能
禁用串口
b. 語法
c. 參數(shù)解釋
無
d. 返回值
無
write()
a. 功能
將二進(jìn)制數(shù)據(jù)寫入串口。
b. 語法
c. 參數(shù)解釋
val:單字節(jié)數(shù)據(jù)(char, byte)
str:字符數(shù)組, 字符串(char[], byte[] )
buf:字符數(shù)組
len:buf的長度
d. 返回值
被寫入的字節(jié)數(shù)(char)
read()
a. 功能
讀取緩存區(qū)中第一個(gè)字節(jié),并在緩存區(qū)中刪除。
b. 語法
c. 參數(shù)解釋
無
d. 返回值
第一個(gè)字節(jié)或-1(未讀到數(shù)據(jù))
peek()
a. 功能
讀取緩存區(qū)中第一個(gè)字節(jié),但不在緩存區(qū)中刪除。
b. 語法
c. 參數(shù)解釋
無
d. 返回值
第一個(gè)字節(jié)或-1(未讀到數(shù)據(jù))如果反復(fù)調(diào)用該函數(shù),讀取到的數(shù)據(jù)是一樣的
print()
a. 功能
按格式輸出各種類型的數(shù)據(jù),將各種數(shù)據(jù)輸出為可見的ASCII碼格式
b. 語法
c. 參數(shù)解釋
val:需要輸出的數(shù)據(jù)(多種格式)
format(optional):數(shù)據(jù)輸出格式(或小數(shù)點(diǎn)位數(shù))詳情參照以下實(shí)例:
d. 返回值
返回輸出字節(jié)的個(gè)數(shù)(可以不讀取)
println()(ln為"line"的縮寫)
a. 功能
和print函數(shù)一樣,但輸出的內(nèi)容自帶換行符( ‘\r’ 和 ‘\n’ )
b. 語法
c. 參數(shù)解釋
參考print函數(shù)
d. 返回值
返回輸出字節(jié)的個(gè)數(shù)(可以不讀取)
readBytes()
a. 功能
讀取緩存區(qū)中的字符并放在設(shè)定長度的緩存區(qū)中,當(dāng)buffer裝滿或超時(shí),則函數(shù)終止。
b. 語法
c. 參數(shù)解釋
buffer:用來儲(chǔ)存字符的緩存區(qū)(char[],or byte[])
length:buffer的長度(int)
d. 返回值
放入buffer的字節(jié)數(shù)(char),如果沒有合法字符,返回 A0
readBytesUntil()
a. 功能
和readBytes函數(shù)一樣,讀取緩存區(qū)中的字符并放在設(shè)定長度的緩存區(qū)中,但終止條件多了一個(gè)——檢測(cè)到終止字符character。
b. 語法
c. 參數(shù)解釋
character:終止字符(char)
buffer:緩存區(qū)(char[] or byte[] )
length:buffer的長度
d. 返回值
放入buffer的字節(jié)數(shù),如果沒有合法字符,返回 A0
readString()
a. 功能
讀取緩存區(qū)中的字符串,直到時(shí)間times out才停止
b. 語法
c. 參數(shù)解釋
無
d. 返回值
讀取到的字符串(char[] )
readStringUntil()
a. 功能
讀取緩存區(qū)的字符串,直到終止符出現(xiàn)或時(shí)間到才停止
b. 語法
c. 參數(shù)解釋
terminator:終止字符
d. 返回值
整個(gè)字符串(char[] )
find()
a. 功能
在串行緩存區(qū)中查找對(duì)應(yīng)的字符
b. 語法
c. 參數(shù)解釋
target:需要查找的字符(char)
d. 返回值
布爾值,找到為true,未找到為false。
findUntil()
a. 功能
在串行緩存區(qū)中查找字符直到設(shè)定的終止字符被找到
b. 語法
c. 參數(shù)解釋
target:目標(biāo)字符
terminal:終止字符
d. 返回值
布爾值,找到為true,沒找到或超時(shí)為false。
flush()
a. 功能
等待串口傳輸完成
b. 語法
c. 參數(shù)解釋
無
d. 返回值
無
setTimeout()
a. 功能
設(shè)置超時(shí)時(shí)間(單位為ms),默認(rèn)為1000ms
b. 語法
c. 參數(shù)解釋
time:時(shí)間值,單位為ms。
d. 返回值
無
parseFloat()
a. 功能
讀取緩存區(qū)中第一個(gè)浮點(diǎn)數(shù)(終止于第一個(gè)非浮點(diǎn)數(shù))
b. 語法
c. 參數(shù)解釋
無
d. 返回值
讀取到的浮點(diǎn)數(shù)(float)
parseInt()
a. 功能
在緩存區(qū)中查找下一個(gè)有效整數(shù)。
b. 語法
c. 參數(shù)解釋
skipChar:用于跳過搜索中指定的字符。 例如用于跳過千位分隔符。
d. 返回值
下一個(gè)有效整數(shù)(long類型)
SPI
(有緣再寫)
I2C
(有緣再寫)
注:以上內(nèi)容主要參考自官方的手冊(cè),介紹兩種方法尋找該文件:
- 方法一:到IDE安裝根目錄下找。參考:C:/Program Files (x86)/Arduino/reference/www.arduino.cc/en/Reference/PulseIn.html
- 方法二:打開IDE寫一個(gè)常用的函數(shù),然后右鍵,選擇在參考文件中查找
高級(jí)應(yīng)用:用AVR開發(fā)Arduino
??我們都知道,單片機(jī)的程序,本質(zhì)上就是對(duì)內(nèi)置的寄存器的讀和寫,雖然Arduino的集成度很高,但是仍然可以用寄存器的方法來開發(fā),但程序的麻煩程度將陡增。
??很多人一想到用寄存器開發(fā),第一反應(yīng)就是:太麻煩。確實(shí),用寄存器開發(fā)在初始階段確實(shí)很麻煩,需要去了解某個(gè)模塊是由哪些寄存器控制的,這是一個(gè)需要花費(fèi)較多時(shí)間精力去熟悉的過程,但是如果熟悉了寄存器,也積累了一些自己寫的庫之后,其實(shí)和用庫函數(shù)開發(fā)是差不多的。但是用寄存器寫,可以讓你最大程度了解該單片機(jī)的各種模塊。
??對(duì)于Arduino來說,一般的開發(fā)確實(shí)沒有必要,只要大致理解函數(shù)用的是哪些模塊即可,但是如果想要編寫自己的庫(比如Timer庫)或者查看函數(shù)源碼,就必須要懂寄存器語言了。
附:
- AVR開發(fā) Arduino方法(一) 端口子系統(tǒng)
- AVR開發(fā) Arduino方法(二) 中斷子系統(tǒng)
- AVR開發(fā) Arduino方法(三) 定時(shí)/計(jì)數(shù)器子系統(tǒng)
- AVR開發(fā) Arduino方法(四) 串行通信子系統(tǒng)
- AVR開發(fā) Arduino方法(五) 模數(shù)轉(zhuǎn)換子系統(tǒng)
- AVR開發(fā) Arduino方法(六) 內(nèi)存子系統(tǒng)
- AVR開發(fā) Arduino方法(七) 嵌入式操作系統(tǒng)FreeRTOS
- AVR開發(fā) Arduino方法(附一) 工具鏈與調(diào)試技術(shù)
- AVR開發(fā) Arduino方法(附二) 故障排除:燒錄引導(dǎo)程序
- AVR開發(fā) Arduino方法(附三) 附件列表
- AVR開發(fā) Arduino方法(附四) 參考文獻(xiàn)與網(wǎng)址
- arduino 定時(shí)器、定時(shí)中斷與PWM使用以及注意事項(xiàng)
其他操作
1. Arduino IDE的“高級(jí)用法”——串口繪圖器
??談到Arduino的串口,我們第一時(shí)間想到的就是IDE右上角的那個(gè)串口圖標(biāo),但其實(shí)Arduino還有一個(gè)串口繪圖器的功能,也在工具菜單欄里面。
??使用的方法也很簡單,和串口輸出一樣,使用Serial.println() 函數(shù)即可。有其他繪圖需求的可以參考這篇文章。
2. Arduino IDE的替代編輯器——Visual Studio Code
??Arduino IDE缺少一個(gè)很重要的功能,那就是代碼補(bǔ)全的功能,這嚴(yán)重降低了寫代碼的效率,而且Arduino IDE的UI也差強(qiáng)人意,因此很多人都不用Arduino IDE編程,轉(zhuǎn)而尋找替代品,而用得最多的,就是VS Code 。這個(gè)網(wǎng)上有很多配置方法,也比較簡單,可以參考這個(gè)鏈接,如果遇到什么問題,可以在瀏覽器點(diǎn)對(duì)點(diǎn)搜索,不再贅述。
??其他教程:
- VScode配置Arduino開發(fā)環(huán)境 保姆級(jí)教程 - CSDN
- Arduino頭文件在VS code中提示錯(cuò)誤紅色波浪線的解決辦法 - CSDN
3. Arduino IDE v2.0 Beta版本
??最近才知道Arduino IDE出2.0版本了,據(jù)說增加了代碼補(bǔ)全和代碼高亮 的功能。附: 下載鏈接
4. 記錄兩個(gè)寫得非常好的教程
- 極速入門教程(上)
- 極速入門教程(下)
總結(jié)
以上是生活随笔為你收集整理的【单片机】Arduino(以UNO R3为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux mkdir 命令使用介绍
- 下一篇: hive 正则表达式验证电话号码