- Arduino案例實(shí)戰(zhàn)(卷Ⅳ)
- 李永華
- 3401字
- 2019-12-06 14:24:39
1.4 Arduino編程語言
Arduino編程語言是建立在C/C++語言基礎(chǔ)上的,即以C/C++語言為基礎(chǔ),把AVR單片機(jī)(微控制器)相關(guān)的一些寄存器參數(shù)設(shè)置等進(jìn)行函數(shù)化,以利于開發(fā)者更加快速地使用。其主要使用的函數(shù)包括數(shù)字I/O操作函數(shù)、模擬I/O操作函數(shù)、高級(jí)I/O操作函數(shù)、時(shí)間函數(shù)、中斷函數(shù)、通信函數(shù)和數(shù)學(xué)庫等。
1.4.1 Arduino編程基礎(chǔ)
關(guān)鍵字:if、if…else、for、switch、case、while、do…while、break、continue、return、goto。
語法符號(hào):每條語句以分號(hào)“;”結(jié)尾,每段程序以花括號(hào)“{}”括起來。
數(shù)據(jù)類型:boolean、char、int、unsigned int、long、unsigned long、float、double、string、array、void。
常量:HIGH或者LOW,表示數(shù)字I/O口的電平,HIGH表示高電平(1),LOW表示低電平(0);INPUT或者OUTPUT,表示數(shù)字I/O口的方向,INPUT表示輸入(高阻態(tài)),OUTPUT表示輸出(AVR能提供5V電壓,40mA電流);TRUE或者FALSE,TRUE表示真(1),F(xiàn)ALSE表示假(0)。
程序結(jié)構(gòu):主要包括兩部分,即void setup()和void loop()。其中,前者是聲明變量及接口名稱(如int val;int ledPin=13),在程序開始時(shí)使用,初始化變量和引腳模式,調(diào)用庫函數(shù)如pinMode(ledPin,OUTUPT)等,而void loop()用在setup()函數(shù)之后,不斷地循環(huán)執(zhí)行,是Arduino的主體。
1.4.2 數(shù)字I/O口的操作函數(shù)
1.pinMode(pin,mode)
pinMode函數(shù)用于配置引腳以及設(shè)置輸出或輸入模式,是一個(gè)無返回值函數(shù)。該函數(shù)有兩個(gè)參數(shù):pin和mode。pin參數(shù)表示要配置的引腳;mode參數(shù)表示設(shè)置該引腳的模式為INPUT(輸入)或OUTPUT(輸出)。
INPUT用于讀取信號(hào),OUTPUT用于輸出控制信號(hào)。pin的范圍是數(shù)字引腳0~13,也可以把模擬引腳(A0~A5)作為數(shù)字引腳使用,此時(shí)編號(hào)為14的引腳對(duì)應(yīng)模擬引腳0,編號(hào)為19的引腳對(duì)應(yīng)模擬引腳5。該函數(shù)一般會(huì)放在setup()里,先設(shè)置再使用。
2.digitalWrite(pin,value)
該函數(shù)的作用是設(shè)置引腳的輸出電壓為高電平或低電平,也是一個(gè)無返回值的函數(shù)。
pin參數(shù)表示所要設(shè)置的引腳;value參數(shù)表示輸出的電壓為HIGH(高電平)或LOW(低電平)。
注意:使用前必須先用pinMode設(shè)置。
3.digitalRead(pin)
該函數(shù)在引腳設(shè)置為輸入的情況下,可以獲取引腳的電壓情況:HIGH(高電平)或者LOW(低電平)。
數(shù)字I/O口操作函數(shù)使用例程如下:

1.4.3 模擬I/O口的操作函數(shù)
1.a(chǎn)nalogReference(type)
該函數(shù)用于配置模擬引腳的參考電壓。它有3種類型:DEFAULT是默認(rèn)模式,參考電壓是5V;INTERNAL是低電壓模式,使用片內(nèi)基準(zhǔn)電壓源2.56V;EXTERNAL是擴(kuò)展模式,通過AREF引腳獲取參考電壓。
注意:若不使用本函數(shù),默認(rèn)是參考電壓5V。若使用AREF作為參考電壓,需接一個(gè)5kΩ的上拉電阻。
2.a(chǎn)nalogRead(pin)
用于讀取引腳的模擬量電壓值,每讀取一次需要花100μs的時(shí)間。參數(shù)pin表示所要獲取模擬量電壓值的引腳,返回為int型。它的精度為10位,返回值為0~1023。
注意:函數(shù)參數(shù)pin的取值范圍是0~5,對(duì)應(yīng)板上的模擬口A0~A5。
3.a(chǎn)nalogWrite(pin,value)
該函數(shù)是通過PWM(Pulse-Width Modulation,脈沖寬度調(diào)制)的方式在引腳上輸出一個(gè)模擬量。圖1-23所示為PWM輸出的一般形式,也就是在一個(gè)脈沖的周期內(nèi)高電平所占的比例。它主要應(yīng)用于LED亮度控制、電機(jī)轉(zhuǎn)速控制等方面。

圖1-23 占空比的定義
注:PWM波形的特點(diǎn)是波形頻率恒定,占空比D可以改變。
Arduino中的PWM的頻率大約為490Hz,UNO開發(fā)板支持以下數(shù)字引腳(不是模擬輸入引腳)作為PWM模擬輸出:3、5、6、9、10、11。開發(fā)板帶PWM輸出的都有“~”號(hào)。
注意:PWM輸出位數(shù)為8位,即0~255。
模擬I/O口的操作函數(shù)使用例程如下:

1.4.4 高級(jí)I/O口的操作函數(shù)
PulseIn(pin,state,timeout)函數(shù)用于讀取引腳脈沖的時(shí)間長度,脈沖可以是HIGH或者LOW。如果是HIGH,該函數(shù)將先等引腳變?yōu)楦唠娖剑缓箝_始計(jì)時(shí),直到變?yōu)榈碗娖酵V褂?jì)時(shí)。返回脈沖持續(xù)的時(shí)間,單位為毫秒,如果超時(shí)沒有讀到時(shí)間,則返回0。
例程說明:做一個(gè)按鈕脈沖計(jì)時(shí)器,測(cè)量按鈕的持續(xù)時(shí)間,看誰的反應(yīng)最快,即誰按按鈕時(shí)間最短。按鈕接在第3引腳。程序如下:

1.4.5 時(shí)間函數(shù)
1.delay()
該函數(shù)是延時(shí)函數(shù),參數(shù)是延時(shí)的時(shí)長,單位是ms(毫秒)。應(yīng)用延時(shí)函數(shù)的典型例程是跑馬燈的應(yīng)用,使用Arduino開發(fā)板控制4個(gè)LED燈依次點(diǎn)亮。程序如下:

2.delayMicroseconds()
delayMicroseconds()也是延時(shí)函數(shù),不過單位是μs(微秒),1ms=1000μs。該函數(shù)可以產(chǎn)生更短的延時(shí)。
3.millis()
millis()為計(jì)時(shí)函數(shù),應(yīng)用該函數(shù)可以獲取單片機(jī)通電到現(xiàn)在運(yùn)行的時(shí)間長度,單位是ms。系統(tǒng)最長的記錄時(shí)間為9h22min,超出則從0開始。返回值是unsigned long型。
該函數(shù)適合作為定時(shí)器使用,不影響單片機(jī)的其他工作(而使用delay函數(shù)期間無法進(jìn)行其他工作)。計(jì)時(shí)時(shí)間函數(shù)使用示例(延時(shí)10s后自動(dòng)點(diǎn)亮LED燈)程序如下:

4.micros()
micros()也是計(jì)時(shí)函數(shù),該函數(shù)返回開機(jī)到現(xiàn)在運(yùn)行的時(shí)間長度,單位為μs。返回值是unsigned long型,70min溢出。程序如下:

以下例程為跑馬燈的另一種實(shí)現(xiàn)方式:

1.4.6 中斷函數(shù)
什么是中斷?實(shí)際上在人們的日常生活中,中斷非常常見,如圖1-24所示。
你在看書,電話鈴響,于是你在書上做上記號(hào),去接電話,與對(duì)方通話;門鈴響了,有人敲門,你讓打電話的對(duì)方稍等一下,你去開門,并在門旁與來訪者交談,談話結(jié)束,關(guān)好門;回到電話機(jī)旁,繼續(xù)通話,接完電話后再回來從做記號(hào)的地方接著看書。
同樣的道理,在單片機(jī)中也存在中斷概念,如圖1-25所示。在計(jì)算機(jī)或者單片機(jī)中中斷是由于某個(gè)隨機(jī)事件的發(fā)生,計(jì)算機(jī)暫停主程序的運(yùn)行,轉(zhuǎn)去執(zhí)行另一程序(隨機(jī)事件),處理完畢后又自動(dòng)返回主程序繼續(xù)運(yùn)行的過程。也就是說,高優(yōu)先級(jí)的任務(wù)中斷了低優(yōu)先級(jí)的任務(wù)。在計(jì)算機(jī)中中斷包括如下幾部分:
①中斷源——引起中斷的原因,或能發(fā)生中斷申請(qǐng)的來源;
②主程序——計(jì)算機(jī)現(xiàn)行運(yùn)行的程序;
③中斷服務(wù)子程序——處理突發(fā)事件的程序。

圖1-24 中斷的概念

圖1-25 單片機(jī)中的中斷
1.a(chǎn)ttachinterrupt(interrupt,function,mode)
該函數(shù)用于設(shè)置中斷,函數(shù)有3個(gè)參數(shù),分別表示中斷源、中斷處理函數(shù)和觸發(fā)模式。中斷源可選0或者1,對(duì)應(yīng)2或者3號(hào)數(shù)字引腳。中斷處理函數(shù)是一段子程序,當(dāng)中斷發(fā)生時(shí)執(zhí)行該子程序部分。觸發(fā)模式有4種類型:LOW(低電平觸發(fā))、CHANGE(變化時(shí)觸發(fā))、RISING(低電平變?yōu)楦唠娖接|發(fā))、FALLING(高電平變?yōu)榈碗娖接|發(fā))。例程功能如下:
數(shù)字D2口接按鈕開關(guān),D4口接LED1(紅色),D5口接LED2(綠色)。在例程中,LED3為板載的LED燈,每秒閃爍一次。使用中斷0來控制LED1,中斷1來控制LED2。按下按鈕,立即響應(yīng)中斷,由于中斷響應(yīng)速度快,LED3不受影響,繼續(xù)閃爍。使用不同的4個(gè)參數(shù),例程1試驗(yàn)LOW和CHANGE參數(shù),例程2試驗(yàn)RISING和FALLING參數(shù)。
例程1:

例程2:

2.detachInterrupt(interrupt)
該函數(shù)用于取消中斷,參數(shù)interrupt表示所要取消的中斷源。
1.4.7 串口通信函數(shù)
串行通信接口(serial interface)使數(shù)據(jù)一位一位地順序傳送,其特點(diǎn)是通信線路簡(jiǎn)單,只要一對(duì)傳輸線就可以實(shí)現(xiàn)雙向通信的接口,如圖1-26所示。

圖1-26 串行通信接口
串行通信接口出現(xiàn)在1980年前后,數(shù)據(jù)傳輸率是115~230Kbps。串行通信接口出現(xiàn)的初期是為了實(shí)現(xiàn)計(jì)算機(jī)外設(shè)的通信,初期串口一般用來連接鼠標(biāo)和外置Modem、老式攝像頭和寫字板等設(shè)備。
由于串行通信接口(COM)不支持熱插拔及傳輸速率較低,因此目前部分新主板和大部分便攜計(jì)算機(jī)已開始取消該接口,串口多用于工控和測(cè)量設(shè)備以及部分通信設(shè)備中,包括各種傳感器采集裝置、GPS信號(hào)采集裝置、多個(gè)單片機(jī)通信系統(tǒng),門禁刷卡系統(tǒng)的數(shù)據(jù)傳輸、機(jī)械手控制和操縱面板控制電機(jī)等,特別是廣泛應(yīng)用于低速數(shù)據(jù)傳輸?shù)墓こ虘?yīng)用,主要函數(shù)如下:
1.Serial.begin()
該函數(shù)用于設(shè)置串口的波特率,即數(shù)據(jù)的傳輸速率,指每秒鐘傳輸?shù)姆?hào)個(gè)數(shù)。一般的波特率有9600、19 200、57 600、115 200等。
例如:Serial.begin(57 600);
2.Serial.available()
該函數(shù)用來判斷串口是否收到數(shù)據(jù),函數(shù)的返回值為int型,不帶參數(shù)。
3.Serial.read()
該函數(shù)不帶參數(shù),只將串口數(shù)據(jù)讀入。返回值為串口數(shù)據(jù),int型。
4.Serial.print()
該函數(shù)向串口發(fā)送數(shù)據(jù)。可以發(fā)送變量,也可以發(fā)送字符串。
例1:Serial.print(“today is good”);
例2:Serial.print(x,DEC); //以十進(jìn)制發(fā)送x
例3:Serial.print(x,HEX); //以十六進(jìn)制發(fā)送變量x
5.Serial.println()
該函數(shù)與Serial.print()類似,只是多了換行功能。串口通信函數(shù)使用例程:

1.4.8 Arduino的庫函數(shù)
與C語言和C++一樣,Arduino也有相關(guān)的庫函數(shù),提供給開發(fā)者使用。這些庫函數(shù)的使用,與C語言的頭文件使用類似,需要#include語句,可將函數(shù)庫加入Arduino的IDE編輯環(huán)境中,如#include“Arduino.h”語句。
在Arduino開發(fā)中主要庫函數(shù)的類別如下:數(shù)學(xué)庫主要包括數(shù)學(xué)計(jì)算;EEPROM庫函數(shù)用于向EEPROM中讀寫數(shù)據(jù);Ethernet庫用于以太網(wǎng)的通信;LiquidCrystal庫用于液晶屏幕的顯示操作;Firmata庫實(shí)現(xiàn)Arduino與PC串口之間的編程協(xié)議;SD庫用于讀寫SD卡;Servo庫用于舵機(jī)的控制;Stepper庫用于步進(jìn)電機(jī)控制;WiFi庫用于WiFi的控制和使用等。諸如此類的庫函數(shù)非常多,還包括一些Arduino愛好者自己開發(fā)的庫函數(shù)。例如下列數(shù)學(xué)庫中的函數(shù):
(1)min(x,y); //求兩者最小值
(2)max(x,y); //求兩者最大值
(3)abs(x); //求絕對(duì)值
(4)sin(rad); //求正弦值
(5)cos(rad); //求余弦值
(6)tan(rad); //求正切值
(7)random(small,big);//求兩者之間的隨機(jī)數(shù)
舉例如下:
數(shù)學(xué)庫random(small,big),返回值為long。

- 網(wǎng)絡(luò)服務(wù)器配置與管理(第3版)
- 深入淺出SSD:固態(tài)存儲(chǔ)核心技術(shù)、原理與實(shí)戰(zhàn)(第2版)
- 數(shù)字邏輯(第3版)
- The Deep Learning with Keras Workshop
- 嵌入式系統(tǒng)中的模擬電路設(shè)計(jì)
- OUYA Game Development by Example
- STM32嵌入式技術(shù)應(yīng)用開發(fā)全案例實(shí)踐
- 面向?qū)ο蠓治雠c設(shè)計(jì)(第3版)(修訂版)
- 電腦高級(jí)維修及故障排除實(shí)戰(zhàn)
- OpenGL Game Development By Example
- Intel Edison智能硬件開發(fā)指南:基于Yocto Project
- Java Deep Learning Cookbook
- 計(jì)算機(jī)電路基礎(chǔ)(第2版)
- DevOps實(shí)戰(zhàn):VMware管理員運(yùn)維方法、工具及最佳實(shí)踐
- 嵌入式系統(tǒng)原理:基于Arm Cortex-M微控制器體系