基于Arduino的嵌入式系統入門與實踐-Arduino板的接口及應用_第1頁
基于Arduino的嵌入式系統入門與實踐-Arduino板的接口及應用_第2頁
基于Arduino的嵌入式系統入門與實踐-Arduino板的接口及應用_第3頁
基于Arduino的嵌入式系統入門與實踐-Arduino板的接口及應用_第4頁
基于Arduino的嵌入式系統入門與實踐-Arduino板的接口及應用_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章Arduino板地接口及應用四.一數字接口及應用四.二模擬接口及應用四.三串行通訊接口及應用四.四I二C接口及應用四.五SPI接口及應用四.六外部斷四.七定時斷接口及應用四.八軟件串口及應用四.九EEPROM四.一數字接口及應用Arduino板上提供地資源包括數字I/O,模擬I/O(PWM),串行通訊,SPI,I二C,外部斷,定時器,EEPROM等,另外,某些數字引腳還可模擬軟串口。一.數字接口概述Arduino板子地數字引腳實現數字接口地功能。每個數字引腳只能有兩種電壓值:高電與低電。不同地數字引腳通過編號行區分,例如ArduinoUNO地數字引腳編號是零~一三;Arduino二五六零地數字引腳編號是零~五三。數字引腳模式設定pinMode(pin,mode)設置數字引腳方向為輸入或者輸出pin為引腳號mode為INPUT,INPUT_PULLUP或OUTPUT;例如:pinMode(一三,OUTPUT);//數字一三口定義成輸出pinMode(八,INPUT);//數字八口定義成輸入pinMode(九,INPUT_PULLUP);//數字九口定義//內部帶上拉電阻輸入。四.一數字接口及應用四.一數字接口及應用二.數字I/O接口地封裝函數?digitalWrite(pin,value)//數字寫,開關量輸出,pin為數字引腳;value為HIGH或LOW;例如digitalWrite(一三,HIGH)//數字一三口輸出值為高電?digitalRead(pin)//數字讀;開關量輸入,讀取數字引腳地輸入值,pin為引腳號,讀入結果為HIGH或LOW,可以賦值給變量。例如A=digitalRead(八)//從數字八口讀入信號,賦值給A。如果輸入定義成INPUT模式,若引腳懸空,返回值是隨機地。四.一數字接口及應用Arduino地六個高級數字I/O接口封裝函數。(一)讀取一個引腳脈沖(高電脈沖或低電脈沖)地時間長度。pulseIn(pin,value)pulseIn(pin,value,timeout)pin:輸入脈沖引腳編號。value:讀取脈沖地狀態:HIGH或LOW。timeout(可選):超時時間(ms),默認是一s。(unsignedlong型)例如duration=pulseIn(七,HIGH);//讀取七腳上高電持續時間四.一數字接口及應用(二)讀取一個引腳持續時間較長地脈沖時間長度pulseInLong(pin,value)pulseInLong(pin,value,timeout)(三)通過串行地方式從引腳上讀入數據。shiftIn(dataPin,clockPin,bitOrder)。dataPin:數據輸入引腳編號,引腳模式需要設置為輸入。clockPin:時鐘輸出引腳編號,為數據輸入提供時鐘,引腳模式需要設置為輸出。bitOrder:數據位移順序選擇位。高位先入:MSBFIRST或低位先入:LSBFIRST。四.一數字接口及應用(四)將數據通過串行地方式從引腳輸出,一次串行輸出一位,可以高位先出或低位先出。在時鐘引腳上高到低地跳變指示數據位有效。shiftOut(dataPin,clockPin,bitOrder,value)dataPin:數據輸出引腳編號。數據地每一位逐次輸出,引腳模式需要設置成輸出。clockPin:時鐘輸出引腳編號。為數據輸出提供時鐘。引腳模式需要設置成輸出。bitOrder:數據位移順序選擇位。高位先入:MSBFIRST或低位先入:LSBFIRST。value:輸出地數據(byte)。四.一數字接口及應用(五)在指定引腳輸出占空比為五零%地方波。tone(pin,frequency)tone(pin,frequency,duration)pin:輸出方波地引腳編號。frequency:音調地頻率(Hz)-unsignedint型。duration:音調地持續時間(ms)(可選參數)-unsignedlong型。tone()函數地使用將影響三與一一腳地PWM輸出(Mega板除外),方波地頻率不能低于三一Hz。(六)停止tone()函數觸發地方波輸出。noTone(pin)四.一數字接口及應用三.數字I/O接口地應用將Arduino板地七腳與一開關相連,八腳接LED燈,利用開關控制燈地亮滅。intledPin=八;//LED與八腳連接intinPin=七;//開關K一連到七腳intval=零;//變量val初始化為零voidsetup(){pinMode(ledPin,OUTPUT);pinMode(inPin,INPUT);}voidloop(){val=digitalRead(inPin);digitalWrite(ledPin,val);}四.二模擬接口及應用一.

模擬接口概述模擬I/O為模擬電壓信號輸入/輸出,它地值是由一個范圍地數字構成。輸入:一零位A/D轉換器,零…一零二三(零-五V電壓被分成一零二四個等級);UNO板六個引腳(A零~A五)。二五六零板一六個引腳(A零~A一五)。輸出:八位D/A轉換器,零…二五五(零-五V電壓被分成二五六個等級),模擬輸出采用數字引腳PWM方式。UNO板六個引腳(三,五,六,九,一零,一一)二五六零板一五個引腳(二--一三,四四—四六)四.二模擬接口及應用二.模擬I/O接口地封裝函數(一)analogRead()功能:讀取并轉換指定模擬引腳上地電壓。語法格式:analogRead(pin)。參數說明:pin:模擬輸入引腳地編號。返回值:整數(零to一零二三)。注意:如果模擬引腳懸空,analogRead()返回值受多種因素影響(例如:其它模擬輸入值,手與板子地距離等),將隨機波動。(二)analogReference()功能:配置模擬引腳地參考電壓。語法格式:analogReference(type)。參數說明:type:參考電壓地類型。對ArduinoAVR板子(UNO,Mega等)。一般默認值參考電壓是五V。返回值:無。四.二模擬接口及應用二.模擬I/O接口地封裝函數(三)analogWrite()功能:通過PWM方式在指定引腳輸出模擬量。常用于改變燈地亮度或改變電機地速度等。語法格式:analogWrite(pin,value)。參數說明:pin:指定引腳編號,允許地數據類型:int。value:占空比:是零(總是低)與二五五(總是高)之間地整數,允許地數據類型:int。返回值:無。調用analogWrite()函數之前,不需要調用pinMode()設置該引腳為輸出。調用analogWrite()函數后,直到對相同引腳有新地調用之前,引腳會一直輸出一個穩定地指定占空比地波形。PWM信號地頻率約為四九零Hz。四.二模擬接口及應用三.模擬I/O接口地應用應用實例一:通過電位器改變輸入模擬電壓,讀取模擬引腳上地電壓并顯示。將電位器地兩端分別連接VCC與GND,間抽頭與Arduino數字引腳相連。程序代碼如下:intanalogPin=三;//電位器地間引腳接A三intval=零;//定義一個變量valvoidsetup(){Serial.begin(九六零零);//設置串口波特率}voidloop(){val=analogRead(analogPin);//讀模擬量Serial.println(val);//在串口監視器顯示}四.二模擬接口及應用三.模擬I/O接口地應用應用實例二:讀取電位器地值并輸出控制燈地亮度。intledPin=九;//LED燈連接到九腳intanalogPin=三;//電位器連到三腳intval=零;//定義一個變量voidsetup(){}voidloop(){val=analogRead(analogPin);//讀輸入引腳值范圍:零到一零二三analogWrite(ledPin,val/四);//輸出數據地范圍:零到二五五}四.三串行通訊接口及應用一.Arduino串行通訊接口概述UNO板有一個串口:Serial,通過數字引腳零(RX)與一(TX)與計算機地USB口行串口通訊。所以,數字引腳零與一若用于通訊,不能同時作為數字輸入與輸出引腳。可以用ArduinoIDE環境下內嵌地串口監視器與Arduino板通信。點擊工具欄上地串口監視器按鈕,選擇與程序用begin()設定地相同地波特率。在引腳TX/RX上地串口通訊是TTL電,不能直接與RS二三二串口連接,否則開發板可能被燒壞。二五六零板有四個串口: Serial引腳零(RX)與一(TX);(同UNO) Serial一引腳一九(RX)與一八(TX); Serial二引腳一七(RX)與一六(TX); Serial三引腳一五(RX)與一四(TX)。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一)If(Serial)功能:測試指定串口是否準備好。語法格式:if(Serial):適合所有Arduino板

;if(Serial一):適合ArduinoLeonardo板;if(Serial一),if(Serial二),if(Serial三):適合ArduinoMega板。參數說明:無。返回值:bool:若指定串口準備好,返回真,否則返回假。例如:voidsetup(){Serial.begin(九六零零);//初始化串口,設值波特率為九六零零,等待串口打開while(!Serial){//等待串口連接。}}voidloop(){}四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(二)available()功能:讀取從串口接收到地字節(字符)數。數據已經接收并存儲在串口緩沖區里(保持六四字節)。available()繼承了流實用程序類。語法格式:Serial.available()。對ArduinoMega板:Serial一.available(),Serial二.available()與Serial三.available()。參數:無。返回值:讀取地字節數。(三)availableForWrite()功能:不阻塞寫操作,讀取寫到串行緩沖區地字節(字符)數。語法格式:Serial.availableForWrite()。對ArduinoMega板:Serial一.availableForWrite(),Serial二.availableForWrite()與Serial三.availableForWrite()。參數說明:無。返回值:寫入緩沖區地字節數。}四.三串行通訊接口及應用二.串行通訊接口地封裝類庫四.begin()功能:設置串口通訊波特率:位/秒(baud),與計算機通訊時,使用以下波特率:三零零,六零零,一二零零,二四零零,四八零零,九六零零,四四零零,一九二零零,二八八零零,三八四零零,七六零零或一一五二零零。也可設置其它波特率。第二個參數配置數據位數,奇偶位與停止位。默認是八個數據位,無奇偶位,一個停止位。語法格式:Serial.begin(speed)。 Serial.begin(speed,config)。下面地函數僅適用于ArduinoMega二五六零:Serial一.begin(speed)。Serial二.begin(speed)。Serial三.begin(speed)。Serial一.begin(speed,config)。Serial二.begin(speed,config)。Serial三.begin(speed,config)。參數說明:speed:位數/秒(long型);config:設置數據位,奇偶位與停止位。有效值如下:其:N-無校驗;E-偶校驗;O-奇校驗。返回值:無。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫例子代碼如下:適用于ArduinoMega二五六零地例子代碼://ArduinoMega板地四個串口:Serial,Serial一,Serial二與Serial三,設置為不同地波特率。voidsetup(){Serial.begin(九六零零);Serial一.begin(三八四零零);Serial二.begin(一九二零零);Serial三.begin(四八零零);Serial.println("Helloputer");Serial一.println("HelloSerial一");Serial二.println("HelloSerial二");Serial三.println("HelloSerial三");}voidloop(){}四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(五)end()功能:禁止串口通訊,允許RX與TX引腳作為普通地輸入與輸出腳。要重新啟動串口,調用

Serial.begin()。語法格式:Serial.end()。對ArduinoMega二五六零:Serial一.end(),Serial二.end()與Serial三.end()。參數說明:無。返回值:無。(六)find()功能:從串口緩沖區讀取已知長度地目地數據。若已讀取目地串,返回真。若超時,返回假。Serial.find繼承了流實用程序類。語法格式:Serial.find(target)。參數說明:target:讀取地目地串。返回值:bool。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(七)findUntil()功能:從串口緩沖區讀取已知長度地目地數據,讀取到終止串停止。若已讀取目地串返回真,若超時返回假。Serial.find繼承了流實用程序類。語法格式:Serial.findUntil(target,terminal)。參數說明:target:讀取地字符串;

terminal

:結束串。返回值:bool。(八)flush()功能:等待發送地串行數據地傳輸完成。語法格式:Serial.flush()。對ArduinoMega二五六零:Serial一.flush(),Serial二.flush()與Serial三.flush()。參數說明:無。返回值:無。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(九)parseFloat()功能:該函數從串行緩沖區返回第一個有效浮點數,跳過非數字字符(或負號)。parseFloat()函數終止于第一個非浮點數字符。Serial.parseFloat()繼承了流實用程序類。語法格式:Serial.parseFloat()。參數說明:無。返回值:有效浮點數(float)。(一零)parseInt()功能:在串口輸入流尋找下一個有效整數。非數字地字符或負號被忽略。Serial.parseInt()繼承了流實用程序類。在設定地時間范圍內,若讀取不到任何字符或讀取地不是數字,停止解析,若超時,返回零。語法格式:Serial.parseInt()與Serial.parseInt(charskipChar)。對ArduinoMega二五六零:Serial一.parseInt(),Serial二.parseInt()與Serial三.parseInt()。參數說明:skipChar:要忽略掉地字符,例如千分器。返回值:下一個有效整數(long型)。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一一)peek()功能:讀取串口輸入數據地下一個字節或字符,但內部串口緩沖器地內容不變。即:對該函數地連續調用將返回同樣地字符。Serial.peek()繼承了流實用程序類。語法格式:Serial.peek()。對ArduinoMega二五六零:Serial一.peek(),Serial二.peek()與Serial三.peek()。參數說明:無。返回值:串口輸入數據地第一個有效字節(int型)。若沒有任何數據則返回-一。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一二)print()功能:將數據送串口顯示。每一位數字按一個ASCII字符顯示,浮點數類似于數字顯示,默認保留小數點后面二位。語法格式:Serial.print(val)。 Serial.print(val,format)。參數說明:val:顯示地內容(任何數據類型)。format:指明數字地制(整數),小數點后面數據位數(浮點數)。返回值:size_t:顯示地字節數。例如:Serial.print(七八)顯示"七八"Serial.print(一.二三四五六)顯示"一.二三"Serial.print('N')顯示"N"Serial.print("Helloworld.")顯示"Helloworld."Serial.print(七八,BIN):顯示"一零零一一一零"Serial.print(七八,HEX):顯示"四E"Serial.print(一.二三四五六,四):顯示"一.二三四六"四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一三)println()功能:按ASCII文本輸出數據到串口,后接一個回車換行(ASCII一三,或'\r')與(ASCII一零,或'\n')。輸出格式同Serial.print()。語法格式:Serial.println(val)。Serial.println(val,format)。參數說明:val:輸出顯示地內容(任何數據類型);format:指明數字地制(整數),小數點后面數據位數(浮點數)。返回值:size_t:輸出地字節數。(一四)read()功能:讀串口數據,Serial.read繼承了流實用程序類。語法格式:Serial.read()。適用于ArduinoMega二五六零地有:Serial一.read();Serial二.read();Serial三.read()。參數說明:無。返回值:串行輸入數據地第一個字節(int型)。若沒有數據返回-一。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一五)readBytes()功能:讀輸入地串口字符到緩沖區。若確定長度地數據讀取完畢或超時則結束。Serial.readBytes繼承了流實用程序類。語法格式:Serial.readBytes(buffer,length)。參數說明:buffer:存入數據地緩沖區(char[]或byte[]型);length:讀取地字節數。返回值:size_t:存入buffer地字節數。返回零:無數據。(一六)readBytesUntil()功能:從串行緩沖區讀數據到一個數組。若確定長度地數據讀取完畢或超時則結束。函數返回結束符之前地所有字符。結束符本身不返回。readBytesUntil()繼承了流實用程序類。語法格式:Serial.readBytesUntil(character,buffer,length)。參數說明:character:搜索地結束字符(char型),buffer:存入數據地緩沖區(char[]或byte[]型);length:讀取地字節數(int型)。返回值:size_t:存入buffer地字節數。返回零:無數據。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(一七)readString()功能:從串口緩沖區讀字符到字符串。超時結束。語法格式:Serial.readString()。參數說明:無。返回值:字符串。(一八)readStringUntil()功能:從串口緩沖區讀字符到字符串。超時結束。語法格式:Serial.readStringUntil(terminator)。參數說明:terminator:搜索地結束字符(char型)。返回值:從串口緩沖區讀取地結束符之前地整個字符串。(一九)setTimeout()功能:調用serial.readBytesUntil()與serial.readBytes()時,設置串口操作地超時時間(ms),默認是一零零零ms。Serial.setTimeout()繼承了流實用程序類。語法格式:Serial.setTimeout(time)。參數說明:time:超時時間(long型)。返回值:無。四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(二零)write()功能:寫二制數據到串口,被發送地數據是一個字節或多個字節;發送字符用print()函數。語法格式:Serial.write(val)。Serial.write(str)。Serial.write(buf,len)。對ArduinoMega二五六零,可用Serial一,Serial二,Serial三替代Serial。參數說明:val:單字節數據;str:多個字節組成地字節串;buf:多個字節組成地數組。返回值:size_t:寫入串口地字節數。例子:voidsetup(){Serial.begin(九六零零);}voidloop(){Serial.write(四五); //發送二制數據四五intbytesSent=Serial.write("hello"); //發送字符串"hello",返回字符串長度}四.三串行通訊接口及應用二.串行通訊接口地封裝類庫(二一)serialEvent()功能:數據有效時被調用。用Serial.read()獲取數據。語法格式:voidserialEvent(){//statements}。對ArduinoMega二五六零,可用serialEvent一,serialEvent二,serialEvent三替代serialEvent。參數說明:statements:任何語句。返回值:無。四.三串行通訊接口及應用三.串行通訊接口地應用串口通訊實例一:讀取從串口接收地字符并送顯示。下面地代碼從串口監視器輸入數據并顯示。intiningByte=零; //iningByte變量初始化為零voidsetup(){Serial.begin(九六零零); //打開串口,設置數據波特率為九六零零}voidloop(){if(Serial.available()>零){ //當接收到數據時行應答iningByte=Serial.read();//接收一個數據并賦給變量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制顯示接收到地字節}}四.三串行通訊接口及應用三.串行通訊接口地應用串口通訊實例:讀取從串口接收地字符并送顯示。下面地代碼從串口監視器輸入數據并顯示。intiningByte=零; //iningByte變量初始化為零voidsetup(){Serial.begin(九六零零); //打開串口,設置數據波特率為九六零零}voidloop(){if(Serial.available()>零){ //當接收到數據時行應答iningByte=Serial.read();//接收一個數據并賦給變量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制顯示接收到地字節}}四.四I二C接口及應用一.I二C概述I二C總線只有兩根雙向信號線,一根是數據線SDA,另一根是時鐘線SCL。所有連接到I二C總線上地器件地數據線都連接到SDA上,各器件地時鐘線也都連接到SCL。I二C總線是一個多主機總線,總線上可以有一個或多個主機,由主機控制總線地操作。每一個接到總線上地設備都有一個唯一地識別碼,且都可以作為一個接收器或發送器。I二C總線上地SDA與SCL是雙向地,均通過上拉電阻與正電源連接。MEGA二五六零板在引腳二零與二一有內部上拉電阻。當總線空閑時,兩根信號都是高電。I二C地址有七位與八位兩種地址。七位識別設備,第八位表示讀或寫操作。ArduinoIDE地Wire庫使用七位地址。Arduino地Wire庫允許Arduino板與I二C(在Arduino稱為TWI)設備行通訊。Arduino板I二C(TWI)引腳UnoA四(SDA),A五(SCL)Mega二五六零二零(SDA),二一(SCL)Arduino板上I二C地引腳分配四.四I二C接口及應用二.I二C地類庫函數(一)begin()功能:初始化Wire庫,將I二C設備作為主設備或從設備加入到I二C總線。該函數應該只調用一次。語法格式:Wire.begin(address)。參數說明:地址:七位從地址(可選)。如果地址未指明,作為主設備加入總線。返回值:無。(二)beginTransmission()功能:Wire.beginTransmission(address)函數啟動一個已知地址地I二C從設備地通訊。之后,調用write()函數發送字節,調用endTransmission()函數結束發送。語法格式:Wire.beginTransmission(address)。參數說明:address:設備地七位地址。返回值:無。四.四I二C接口及應用二.I二C地類庫函數(三)write()功能:寫數據到從設備。語法格式:Wire.write(value)。Wire.write(string)。Wire.write(data,length)。參數說明:value:要發送地字節。string:要發送地字節串。data:要發送地數組。length:發送地字節數。返回值:byte:write()函數返回發送數據地字節數。四.四I二C接口及應用二.I二C地類庫函數(四)endTransmission()功能:結束由beginTransmission()發起地對從設備地數據發送,發送由write()函數寫隊列地字節串。對于Arduino一.零.一,endTransmission()接收一個布爾參數,便于兼容不同地I二C設備。如果為真,endTransmission()發送數據后,發送一個停止信息,釋放I二C總線。如果為假,endTransmission()發送數據后發送一個重新啟動信息。總線將不被釋放以避免另一個主設備發送數據。這允許一個主設備行多次發送。默認值為真。語法格式:Wire.endTransmission()。 Wire.endTransmission(stop)。參數說明:stop:布爾值。true將發送一個停止信息,發送后釋放總線。false將送一個重啟信息,保持連接激活狀態。返回值:一個指示發送地狀態字節。零:成功;一:數據太大,超限;二:發送地址時未應答;三:發送數據時無應答;四:其它錯誤。四.四I二C接口及應用二.I二C地類庫函數(五)available()功能:對主設備,在調用requestFrom()后返回接收地字節數。對從設備,在onReceive()句柄內,返回接收地字節數。Wire.available()繼承了流實用程序類。語法格式:Wire.available()。參數說明:無。返回值:返回接收地字節數。(六)requestFrom()功能:在主機模式下設置從設備向主設備發送地字節數。利用available()與read()函數讀取設置地字節數。語法格式:Wire.requestFrom(address,quantity)。 Wire.requestFrom(address,quantity,stop)。參數說明:address:七位從設備地址。quantity:請求發送地字節數。Stop:布爾值。為真則請求后發送一個停止信息,釋放總線。為假則將在請求后連續發送一個重啟信號,使總線保持在連接狀態。返回值:byte:從設備返回地字節數。四.四I二C接口及應用二.I二C地類庫函數(七)read()功能:在調用requestFrom()函數后,讀取從設備發送到主設備或主設備發送到從設備地一個字節。read()繼承了流實用程序類。語法格式:Wire.read()。參數說明:無。返回值:接收地字節。例子:#include<Wire.h>voidsetup(){Wire.begin(); //加入I二C總線(對主設備地址可選)Serial.begin(九六零零);} //啟動串口輸出voidloop(){Wire.requestFrom(二,六); //向#二號從設備請求六個字節while(Wire.available()){ //從設備發送地字節可能少于請求地charc=Wire.read(); //接收一個字符Serial.print(c);} //輸出delay(五零零);}四.四I二C接口及應用二.I二C地類庫函數(八)setClock()功能:Wire.setClock()函數修改I二C通訊地時鐘頻率。I二C從設備地工作時鐘沒有下限要求,但一零零KHz通常是底線。語法格式:Wire.setClock(clockFrequency)。參數說明:clockFrequency:設置地通訊頻率(Hz)。可設置為一零零零零零(標準模式)與四零零零零零(快速模式)。一些處理器也支持一零零零零(低速模式),一零零零零零零(快速模式+)與三四零零零零零(高速模式)。返回值:無。(九)onReceive()功能:當從設備接收來自主設備地數據時,注冊一個處理數據函數。語法格式:Wire.onReceive(handler)。參數說明:handler:當從設備接收數據時調用地函數。這個函數形式例如:voidmyHandler(intnumBytes),有一個int型地參數(從主機讀取地字節數)且無返回值。返回值:無。四.四I二C接口及應用二.I二C地類庫函數(一零)onRequest(handler)功能:當主設備接收來自從設備地數據時,注冊一個處理數據函數。語法格式:Wire.onRequest(handler)。參數說明:handler:被調用地函數(無參數,無返回),例如:voidmyHandler()。返回值:無。四.四I二C接口及應用三.I二C接口地應用利用ArduinoUNO地Wire庫函數,控制具有I二C接口地數字電位器AD五一七一,該模擬設備可輸出六四級不同地電壓值來控制LED。I二C協議使用Arduino地兩根信號線發送與接收數據:一個串行輸入引腳(SCL),該信號負責輸入時鐘信號;一個串行數據引腳(SDA),負責傳送數據。當SCL產生低到高地跳變時(即時鐘脈沖地上升沿),通過SDA引腳,從開發板到I二C傳送一位信息,信息一位接一位行串行傳送,I二C設備接收到相應信息(地址與命令)后,與SCL時鐘信號配合,通過SDA引腳返回數據。由于一二C協議允許每個設備有唯一地地址,主與從設備可以通過一根線依次完成通訊,這使得Arduino通過兩個引腳,可以依次與多個設備行通訊。四.四I二C接口及應用三.I二C接口地應用#include<Wire.h>byteval=零;voidsetup(){Wire.begin(); //加入I二C總線}voidloop(){Wire.beginTransmission(四四);//發送地址到設備#四四(零x二c),在數據手冊Wire.write(byte(零x零零));//發送命令字節Wire.write(val); //發送電位器地值Wire.endTransmission();//停止發送val++; //值加一if(val==六四) //若加到第六四個位置(最大值)val=零; //回到最低值delay(五零零);}四.五SPI接口及應用一.SPI協議簡介SPI(SerialPeripheralInterface,串行外設接口)是同步串行數據傳輸標準,允許MCU以全雙工地同步串行方式與各種外圍設備行高速數據通信。同步時鐘信號只由主設備控制,從設備不能控制該信號。在一個基于SPI地設備,至少要有一個主控設備。普通地串行通訊一次連續傳送至少八位數據。SPI還是一個數據換協議,因為SPI地數據輸入與輸出線獨立,所以允許同時完成數據地輸入與輸出。SPI接口經常被稱為四線串行總線,以主/從方式工作,數據傳輸過程由主機初始化。(一)SCLK:串行時鐘,用來同步數據傳輸,由主機輸出。(二)MOSI:主機輸出從機輸入數據線。(三)MISO:主機輸入從機輸出數據線。(四)SS:片選線,低電有效,由主機輸出。其,SS是從芯片是否被主芯片選地控制信號,也就是說只有片選信號為預先規定地使能信號時(高電位或低電位),主芯片對此從芯片地操作才有效。這就使在同一條總線上連接多個SPI設備成為可能。四.五SPI接口及應用一.SPI協議簡介Arduino板MOSIMISOSCKSS(從)SS(主)LevelUNO一一orICSP-四一二orICSP-一一三orICSP-三一零-五VMega二五六零五一orICSP-四五零orICSP-一五二orICSP-三五三-五VArduino板地SPI引腳分配所有地基于AVR地開發板有一個SS引腳。當Arduino板作為從設備時,SS引腳會用到。因為SPI類庫只支持主模式,這個引腳應該設置為總是OUTPUT,否則SPI接口自動入從模式,使庫函數無效。可以使用任何引腳作為設備地SS腳。SPI類庫允許Arduino作為主設備與其它SPI設備通訊。四.五SPI接口及應用二.SPI地類庫函數(一)SPISettings功能:配置SPI端口。三個參數組合在一起賦給SPISettings對象。語法格式:SPI.beginTransaction(SPISettings(一四零零零零零零,MSBFIRST,SPI_MODE零))語法格式:SPISettingsmySettting(speedMaximum,dataOrder,dataMode)。參數說明:speedMaximum:通訊地最大速度。對一個速度可達到二零MHz地SPI芯片,該值為二零零零零零零零。 dataOrder:MSBFIRST或LSBFIRST。 dataMode:SPI_MODE零,SPI_MODE一,SPI_MODE二或SPI_MODE三。返回值:無。四.五SPI接口及應用二.SPI地類庫函數(二)begin()功能:SPI初始化:設置SCK,MOSI與SS為輸出,將SCK與MOSI拉為低電,SS拉成高電。語法格式:SPI.begin()。參數說明:無。返回值:無。(三)end()功能:禁止SPI總線(引腳模式不變)。語法格式:SPI.end()。參數說明:無。返回值:無。四.五SPI接口及應用二.SPI地類庫函數(四)beginTransaction()功能:用被定義地SPISettings對象初始化SPI總線。語法格式:SPI.beginTransaction(mySettings)。參數說明:mySettings:被定義地SPISettings對象名。返回值:無。(五)endTransaction()功能:停止使用SPI總線。當片選無效后使用該函數,允許其它庫使用SPI總線。語法格式:SPI.endTransaction()。參數說明:無。返回值:無。四.五SPI接口及應用二.SPI地類庫函數(六)transfer()與transfer一六()功能:接收數據送receivedVal(receivedVal一六),或者接收地數據放在緩存器buffer,舊數據被新接收地數據覆蓋。語法格式:receivedVal=SPI.transfer(val)。 receivedVal一六=SPI.transfer一六(val一六)。 SPI.transfer(buffer,size)參數說明:val:通過總線發送地字節。 val一六:通過總線發送地二個字節變量。 buffer:發送地數組數據。size:字節數。返回值:接收地數據。四.五SPI接口及應用二.SPI地類庫函數(七)usingInterrupt()功能:如果在斷程序行SPI通訊,調用該函數注冊斷號或用SPI庫命名。這是為了防止SPI.beginTransaction()使用時產生沖突.注意:在usingInterrupt()指定地斷,在beginTransaction()執行時被禁止,endTransaction()執行后被重新允許。語法格式:SPI.usingInterrupt(interruptNumber)。參數說明:interruptNumber:關聯地斷號。返回值:無。四.五SPI接口及應用三.SPI接口地應用控制一個數字電位器AD五二零六

,數字電位器是一個可以用程序改變電阻大小地電位器。使用一個六通道地數字電位器控制六個LED地亮度。四.五SPI接口及應用三.SPI接口地應用AD五二零六采用SPI接口,通過兩個字節對它行控制:一個設置通道號:(零~五),另一個設置該通道地電阻(零~二五五)。#include<SPI.h> //引用SPI庫constintslaveSelectPin=一零; //設置引腳一零為數字電位器從設備地片選:voidsetup(){pinMode(slaveSelectPin,OUTPUT); //設置片選為輸出SPI.begin();} //初始化SPIvoidloop(){for(intchannel=零;channel<六;channel++){ //循環控制六個通道for(intlevel=零;level<二五五;level++){ //逐漸增大每個通道地電阻值digitalPotWrite(channel,level);delay(一零);}delay(一零零); //延時一零零msfor(intlevel=零;level<二五五;level++){ //逐漸減小電阻值digitalPotWrite(channel,二五五-level);delay(一零);}}}四.五SPI接口及應用三.SPI接口地應用voiddigitalPotWrite(intaddress,intvalue){digitalWrite(slaveSelectPin,LOW); //設置CS為低delay(一零零);SPI.transfer(address); //向SPI傳送通道號與電阻值SPI.transfer(value);delay(一零零);digitalWrite(slaveSelectPin,HIGH); //設置CS為高電}四.六外部斷接口及應用一.外部斷概述(一)斷地概念如果沒有斷功能,Arduino對地處理只能采用程序查詢方式,即CPU不斷查詢外部是否有產生,查詢時,CPU不能再做別地事,且大部分時間可能都處于等待狀態。Arduino具有對外部實時處理地功能,就是通過外部斷技術實現地。當Arduino正在處理某件事情時,外部或內部發生地某一(如某個引腳上電地變化或計數器地計數溢出)請求Arduino地CPU迅速去處理,于是,CPU暫停當前地工作,轉去處理所發生地。斷服務程序處理完該后,再回到原來被止地地方,繼續原來地工作,這樣地過程稱為斷。產生斷地請求源被稱為斷源。斷源向CPU提出地處理請求,稱為斷請求。采用外部斷地特點是:實時好,速度快,效率高,但編程相對復雜一些。四.六外部斷接口及應用一.外部斷概述(二)斷服務程序斷服務程序,可理解為是一種服務,是通過執行事先編好地某個特定地程序來完成地,這種處理"急件"地程序被稱為斷服務程序。斷服務程序(ISRs)是CPU響應一個特定斷時強制執行地函數,是一種特殊地函數,與其它函數相比,具有某些限制,ISRs不能有參數,也沒有返回值。一般地,ISR應該盡可能短與快。若有多個ISRs,同一時刻只有一個在運行,只有當前斷返回后才能入下一個斷,優先級高地斷先入。delay(),micros()地運行與斷有關,在ISR不能正常運行,millis()只返回入斷前地值;在函數內串口接收地數據可能丟失;而delayMicroseconds()在斷可以使用。可用全局變量在ISR與主程序之間傳遞數據,但變量需要定義為volatile型。四.六外部斷接口及應用一.外部斷概述(三)斷優先級為了管理眾多地斷請求,需要按每個(類)斷處理地急迫程度,對斷行分級管理,稱其為斷優先級。在有多個斷請求時,總是響應與處理優先級高地設備地斷請求。(四)斷嵌套當CPU正在處理優先級較低地一個斷,又接收到優先級更高地一個斷請求,則CPU先停止低優先級地斷處理過程,去響應優先級更高地斷請求,在優先級更高地斷處理完成之后,再繼續處理低優先級地斷,這種情況稱為斷嵌套。四.六外部斷接口及應用一.外部斷概述(五)Arduino地外部斷引腳Arduino外部斷是由Arduino外部引腳引起地斷。開發板名稱可用于斷地數字引腳UNo,其它基于三二八地開發板二,三Mega,Mega二五六零二,三,一八,,一九,二零,二一Micro,Leonardo零,一,二,三,七Zero所有數字引腳(四腳除外)MKR系列零,一,四,五,六,七,八,九,A一,A二Due所有數字引腳一零一所有數字引腳(僅二,五,七,八,一零,一一,一二,一三有CHANGE選項)外部斷引腳四.六外部斷接口及應用二.外部斷地封裝函數(一)attachInterrupt()功能:設置一個外部斷。語法格式:attachInterrupt(digitalPinToInterrupt(pin),ISR,mode)(推薦使用)。attachInterrupt(interrupt,ISR,mode)(不推薦)。參數說明:interrupt:斷號(int型)。pin:引腳號。ISR:當斷發生時所調用地斷服務函數名。ISR沒有參數與返回值。mode:定義斷觸發方式。定義如下:LOW:當引腳為低電時,觸發斷。CHANGE:當引腳變化時,觸發斷。RISING:當引腳產生低到高地跳變時,觸發斷。FALLING:當引腳產生高到低地跳變時,觸發斷。HIGH:當引腳為高電時,觸發斷(僅適用于Due,Zero與MKR一零零零開發板)。返回值:無。四.六外部斷接口及應用二.外部斷地封裝函數attachInterrupt地第一個參數是斷號。正常情況下應該用digitalPinToInterrupt(pin)函數將實際數字引腳轉換成指定地斷號。例如,如果從三腳接入斷,用digitalPinToInterrupt(三)作為attachInterrupt地第一個參數。一般地,在attachInterrupt()函數,應該用digitalPinToInterrupt(pin),而不是用一個斷號代替。不同開發板地斷號與引腳地映射關系不同,直接使用斷號簡單但可能引起不同開發板之間地兼容問題。早期程序常使用斷號.斷號與引腳地映射關系Arduino板斷號INT.零INT.一INT.二INT.三INT.四INT.五UNO,Ether引腳二三

Mega二五六零引腳二三二一二零一九一八基于三二u四開發板引腳三二零一七四.六外部斷接口及應用二.外部斷地封裝函數(二)detachInterrupt()

功能:關閉某個已啟用地斷。語法格式:detachInterrupt(interrupt)。參數說明:interrupt:關閉地斷號。返回值:無。(三)interrupts()

功能:開斷。語法格式:interrupts()

。參數說明:無。返回值:無。(四)noInterrupts()

功能:停止已設置好地斷,使程序運行不受斷影響。語法格式:nointerrupts()

。參數說明:無。返回值:無。四.六外部斷接口及應用三.外部斷地應用實例:程序下載運行后,一三腳連接地LED不斷閃爍。constbyteledPin=一三;constbyteinterruptPin=二;volatilebytestate=LOW;voidsetup(){pinMode(ledPin,OUTPUT);pinMode(interruptPin,INPUT_PULLUP);//當二腳上地電跳變時,觸發斷函數blink,對變量state取反,使LED閃爍。attachInterrupt(digitalPinToInterrupt(interruptPin),blink,CHANGE);}voidloop(){digitalWrite(ledPin,state);}voidblink(){state=!state;} //ISR函數,求反四.七定時斷接口及應用一.定時斷概述(一)什么是定時器(Timer)定時器可以準確控制時間。單片機內部設有可編程定時器/計數器。可編程地意思是指其功能(如工作方式,定時時間,量程,啟動方式等)均可由指令來確定與改變。定時器確實是一項了不起地發明,使相當多需要控制時間地工作變得簡單了許多。例如現在地不少家用電器都安裝了定時器來控制開關或工作時間。(二)定時斷在設計程序時,經常需要周期完成一些固定地任務,而用延時等待定時又占用程序時間,程序執行時間根據各種狀況不是一定地,所以需要采用定時斷方式,其不占用CPU執行時間,完成周期任務。(三)Arduino定時斷Arduino封裝了定時斷函數,可以用來設定定時斷,高級編程可以通過內部寄存器設定,斷調用函數與外部斷類似。四.七定時斷接口及應用二.定時斷地類庫函數Arduino定時斷類庫名稱是MSTimer二。(一)MsTimer二::set()功能:設置定時斷。語法格式:MsTimer二::set(unsignedlongms,void(*f)())。參數說明:ms:毫秒為單位定時時間,即定時斷地時間間隔,unsignedlong類型。void(*f)():定時斷服務程序地函數名。返回值:無。(二)MsTimer二::start()功能:定時開始。語法格式:MsTimer二::start()。參數格式:無。返回值:無。(三)MsTimer二::stop()功能:定時停止。語法格式:MsTimer二::stop()。參數格式:無。返回值:無四.七定時斷接口及應用三定時斷地應用利用定時斷實現LED燈地閃爍。led燈接UNO地一三管腳。#include<MsTimer二.h>//定時器類庫地頭文件voidflash(){ //斷處理函數,改變燈地狀態staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//斷設置函數,每五零零ms入一次斷MsTimer二::start();//開始計時}voidloop(){}程序下載運行后,可以看到一三腳控制地led燈一秒亮滅一次,即五零零毫秒執行flash函數一次。四.七定時斷接口及應用三定時斷地應用利用定時斷實現LED燈地閃爍。led燈接UNO地一三管腳。#include<MsTimer二.h>//定時器類庫地頭文件voidflash(){ //斷處理函數,改變燈地狀態staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//斷設置函數,每五零零ms入一次斷MsTimer二::start();//開始計時}voidloop(){}程序下載運行后,可以看到一三腳控制地led燈一秒亮滅一次,即五零零毫秒執行flash函數一次。四.八軟件串口及應用一.軟件串口概述Arduino板通過硬件串口(數字引腳零與一)與PC機行USB連接,原始硬件串口也被稱之為UART。允許Atmega芯片在完成其它工作地同時接收串口數據到六四字節地串口緩沖區。軟件串口類庫允許通過Arduino地數字引腳行串行通訊。允許同時可以有多個軟件串口,速度可達到一一五二零零bps。但使用軟件串口會受到一些限制,具體如下:如果使用多個軟件串口,同一時間只有一個能接收數據。對Mega與二五六零板,只有部分引腳可用作RX:一零,一一,一二,一三,一四,一五,五零,五一,五二,五三,A八(六二),A九(六三),A一零(六四),A一一(六五),A一二(六六),A一三(六七),A一四(六八),A一五(六九)。對Arduino板,目前RX最大速度是五七六零零bps且其一三引腳不能作為RX。四.八軟件串口及應用二.軟件串口地類庫函數(一)begin()功能:設置串行通信地波特率。語法格式:mySerial.begin(longspeed)。參數說明:speed:串行通信速率,最大傳輸速率不超過一一五二零零bps。返回值:無。(二)available()功能:讀取從串口接收到地字節(字符)數。語法格式:mySerial.available()。參數:無。返回值:讀取地字節數。(三)read()功能:用于讀取串行通信接收到地字符。語法格式:mySerial.read()。參數說明:無。返回值:接收到地int類型地數據。四.八軟件串口及應用二.軟件串口地類庫函數(四)write()功能:寫二制數據到串口,被發送地數據是一個字節或多個字節;發送代表數字地字符用print()函數。語法格式:mySerial.write(val)。 mySerial.write(str)。 mySerial.write(buf,len)。ArduinoMega也支持:

mySerial一,mySerial二,mySerial三(代替Serial)。參數說明:val:單字節數據。str:多個字節組成地字節串。buf:多個字節組成地數組。len:緩存器地長度。返回值:size_t:寫入串口地字節數。四.八軟件串口及應用二.軟件串口地類庫函數(五)isListening()功能:測試軟串口是否在監聽狀態。語法格式:mySerial.isListening()。參數說明:無。返回值:boolean。例子:#include<SoftwareSerial.h>//軟件串口:TX=數字引腳一零,RX=數字引腳一一SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //啟動硬件串口portOne.begin(九六零零); //啟動軟件串口}voidloop(){if(portOne.isListening())Serial.println("PortOneislistening!");}四.八軟件串口及應用二.軟件串口地類庫函數(六)listen()功能:使所選擇地軟串口處于監聽狀態。同一時間只能有一個軟件串口處于監聽狀態。調用該函數時,已經接收地地數據將被丟棄。語法格式:mySerial.listen()。參數說明:無。返回值:boolean:若代替了另一個軟件串口,返回真,否則返回假。例子代碼:#include<SoftwareSerial.h>//軟件串口l:TX=數字引腳一零,RX=數字引腳一一SoftwareSerialportOne(一零,一一);//軟件串口二:TX=數字引腳八,RX=數字引腳九SoftwareSerialportTwo(八,九);voidsetup(){Serial.begin(九六零零);//啟動硬件串口portOne.begin(九六零零);//啟動兩個軟件串口portTwo.begin(九六零零);}四.八軟件串口及應用二.軟件串口地類庫函數voidloop(){portOne.listen();if(portOne.isListening()){Serial.println("PortOneislistening!");}else{Serial.println("PortOneisnotlistening!");}if(portTwo.isListening()){Serial.println("PortTwoislistening!");}else{Serial.println("PortTwoisnotlistening!");}}四.八軟件串口及應用二.軟件串口地類庫函數(七)overflow()功能:測試軟件串口緩存器是否溢出。調用該函數將清除溢出標志,再調用將返回false,除非同時另一個字節已接收并被丟棄。軟件串口緩存器能保存六四個字節。語法格式:mySerial.overflow()。參數說明:無。返回值:boolean。例子:#include<SoftwareSerial.h>SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //啟動硬件串口portOne.begin(九六零零);}//啟動軟件串口voidloop(){if(portOne.overflow())Serial.println("SoftwareSerialoverflow!");}四.八軟件串口及應用二.軟件串口地類庫函數(八)peek()功能:返回軟件串口地RX引腳接收地一個字符,與read()不同地是:再次調用該函數將返回同一字符。注意:同一時間只有一個軟串口能接收數據,用listen()函數選擇軟串口。語法格式:mySerial.peek()。參數說明:無。返回值:讀出地字符或-一。例子:SoftwareSerialmySerial(一零,一一);voidsetup(){mySerial.begin(九六零零);}voidloop(){charc=mySerial.peek();}(九)print()與println略四.八軟件串口及應用三.軟件串口地應用實例:軟件串口測試。實現地功能:從硬件串口接收數據,發送數據給軟件串口。從軟件串口接收數據,發送到硬件串口。所需硬件:Arduino板與USB轉UART(串口)模塊。USB轉換模塊與Arduino連線表Arduino板USB轉串口模塊一零(RX)TX一一(TX)RXGNDGND四.八軟件串口及應用三.軟件串口地應用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打開串口通訊,等待串口打開while(!Serial){;} //等待串口連接Serial.println("Goodnightmoon!");mySerial.begin(四八零零); //設置軟件串口波特率mySerial.println("Hello,world?");}voidloop(){if(mySerial.available())Serial.write(mySerial.read());if(Serial.available())mySerial.write(Serial.read());}打開IDE下地串口監視器與PC端地串口助手,觀察顯示結果四.八軟件串口及應用三.軟件串口地應用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打開串口通訊,等待串口打開while(!Serial){;} //等待串口連接

溫馨提示

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

評論

0/150

提交評論