版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章Arduino板地接口及應(yīng)用四.一數(shù)字接口及應(yīng)用四.二模擬接口及應(yīng)用四.三串行通訊接口及應(yīng)用四.四I二C接口及應(yīng)用四.五SPI接口及應(yīng)用四.六外部斷四.七定時(shí)斷接口及應(yīng)用四.八軟件串口及應(yīng)用四.九EEPROM四.一數(shù)字接口及應(yīng)用Arduino板上提供地資源包括數(shù)字I/O,模擬I/O(PWM),串行通訊,SPI,I二C,外部斷,定時(shí)器,EEPROM等,另外,某些數(shù)字引腳還可模擬軟串口。一.數(shù)字接口概述Arduino板子地?cái)?shù)字引腳實(shí)現(xiàn)數(shù)字接口地功能。每個(gè)數(shù)字引腳只能有兩種電壓值:高電與低電。不同地?cái)?shù)字引腳通過編號(hào)行區(qū)分,例如ArduinoUNO地?cái)?shù)字引腳編號(hào)是零~一三;Arduino二五六零地?cái)?shù)字引腳編號(hào)是零~五三。數(shù)字引腳模式設(shè)定pinMode(pin,mode)設(shè)置數(shù)字引腳方向?yàn)檩斎牖蛘咻敵鰌in為引腳號(hào)mode為INPUT,INPUT_PULLUP或OUTPUT;例如:pinMode(一三,OUTPUT);//數(shù)字一三口定義成輸出pinMode(八,INPUT);//數(shù)字八口定義成輸入pinMode(九,INPUT_PULLUP);//數(shù)字九口定義//內(nèi)部帶上拉電阻輸入。四.一數(shù)字接口及應(yīng)用四.一數(shù)字接口及應(yīng)用二.數(shù)字I/O接口地封裝函數(shù)?digitalWrite(pin,value)//數(shù)字寫,開關(guān)量輸出,pin為數(shù)字引腳;value為HIGH或LOW;例如digitalWrite(一三,HIGH)//數(shù)字一三口輸出值為高電?digitalRead(pin)//數(shù)字讀;開關(guān)量輸入,讀取數(shù)字引腳地輸入值,pin為引腳號(hào),讀入結(jié)果為HIGH或LOW,可以賦值給變量。例如A=digitalRead(八)//從數(shù)字八口讀入信號(hào),賦值給A。如果輸入定義成INPUT模式,若引腳懸空,返回值是隨機(jī)地。四.一數(shù)字接口及應(yīng)用Arduino地六個(gè)高級(jí)數(shù)字I/O接口封裝函數(shù)。(一)讀取一個(gè)引腳脈沖(高電脈沖或低電脈沖)地時(shí)間長度。pulseIn(pin,value)pulseIn(pin,value,timeout)pin:輸入脈沖引腳編號(hào)。value:讀取脈沖地狀態(tài):HIGH或LOW。timeout(可選):超時(shí)時(shí)間(ms),默認(rèn)是一s。(unsignedlong型)例如duration=pulseIn(七,HIGH);//讀取七腳上高電持續(xù)時(shí)間四.一數(shù)字接口及應(yīng)用(二)讀取一個(gè)引腳持續(xù)時(shí)間較長地脈沖時(shí)間長度pulseInLong(pin,value)pulseInLong(pin,value,timeout)(三)通過串行地方式從引腳上讀入數(shù)據(jù)。shiftIn(dataPin,clockPin,bitOrder)。dataPin:數(shù)據(jù)輸入引腳編號(hào),引腳模式需要設(shè)置為輸入。clockPin:時(shí)鐘輸出引腳編號(hào),為數(shù)據(jù)輸入提供時(shí)鐘,引腳模式需要設(shè)置為輸出。bitOrder:數(shù)據(jù)位移順序選擇位。高位先入:MSBFIRST或低位先入:LSBFIRST。四.一數(shù)字接口及應(yīng)用(四)將數(shù)據(jù)通過串行地方式從引腳輸出,一次串行輸出一位,可以高位先出或低位先出。在時(shí)鐘引腳上高到低地跳變指示數(shù)據(jù)位有效。shiftOut(dataPin,clockPin,bitOrder,value)dataPin:數(shù)據(jù)輸出引腳編號(hào)。數(shù)據(jù)地每一位逐次輸出,引腳模式需要設(shè)置成輸出。clockPin:時(shí)鐘輸出引腳編號(hào)。為數(shù)據(jù)輸出提供時(shí)鐘。引腳模式需要設(shè)置成輸出。bitOrder:數(shù)據(jù)位移順序選擇位。高位先入:MSBFIRST或低位先入:LSBFIRST。value:輸出地?cái)?shù)據(jù)(byte)。四.一數(shù)字接口及應(yīng)用(五)在指定引腳輸出占空比為五零%地方波。tone(pin,frequency)tone(pin,frequency,duration)pin:輸出方波地引腳編號(hào)。frequency:音調(diào)地頻率(Hz)-unsignedint型。duration:音調(diào)地持續(xù)時(shí)間(ms)(可選參數(shù))-unsignedlong型。tone()函數(shù)地使用將影響三與一一腳地PWM輸出(Mega板除外),方波地頻率不能低于三一Hz。(六)停止tone()函數(shù)觸發(fā)地方波輸出。noTone(pin)四.一數(shù)字接口及應(yīng)用三.數(shù)字I/O接口地應(yīng)用將Arduino板地七腳與一開關(guān)相連,八腳接LED燈,利用開關(guān)控制燈地亮滅。intledPin=八;//LED與八腳連接intinPin=七;//開關(guān)K一連到七腳intval=零;//變量val初始化為零voidsetup(){pinMode(ledPin,OUTPUT);pinMode(inPin,INPUT);}voidloop(){val=digitalRead(inPin);digitalWrite(ledPin,val);}四.二模擬接口及應(yīng)用一.
模擬接口概述模擬I/O為模擬電壓信號(hào)輸入/輸出,它地值是由一個(gè)范圍地?cái)?shù)字構(gòu)成。輸入:一零位A/D轉(zhuǎn)換器,零…一零二三(零-五V電壓被分成一零二四個(gè)等級(jí));UNO板六個(gè)引腳(A零~A五)。二五六零板一六個(gè)引腳(A零~A一五)。輸出:八位D/A轉(zhuǎn)換器,零…二五五(零-五V電壓被分成二五六個(gè)等級(jí)),模擬輸出采用數(shù)字引腳PWM方式。UNO板六個(gè)引腳(三,五,六,九,一零,一一)二五六零板一五個(gè)引腳(二--一三,四四—四六)四.二模擬接口及應(yīng)用二.模擬I/O接口地封裝函數(shù)(一)analogRead()功能:讀取并轉(zhuǎn)換指定模擬引腳上地電壓。語法格式:analogRead(pin)。參數(shù)說明:pin:模擬輸入引腳地編號(hào)。返回值:整數(shù)(零to一零二三)。注意:如果模擬引腳懸空,analogRead()返回值受多種因素影響(例如:其它模擬輸入值,手與板子地距離等),將隨機(jī)波動(dòng)。(二)analogReference()功能:配置模擬引腳地參考電壓。語法格式:analogReference(type)。參數(shù)說明:type:參考電壓地類型。對(duì)ArduinoAVR板子(UNO,Mega等)。一般默認(rèn)值參考電壓是五V。返回值:無。四.二模擬接口及應(yīng)用二.模擬I/O接口地封裝函數(shù)(三)analogWrite()功能:通過PWM方式在指定引腳輸出模擬量。常用于改變燈地亮度或改變電機(jī)地速度等。語法格式:analogWrite(pin,value)。參數(shù)說明:pin:指定引腳編號(hào),允許地?cái)?shù)據(jù)類型:int。value:占空比:是零(總是低)與二五五(總是高)之間地整數(shù),允許地?cái)?shù)據(jù)類型:int。返回值:無。調(diào)用analogWrite()函數(shù)之前,不需要調(diào)用pinMode()設(shè)置該引腳為輸出。調(diào)用analogWrite()函數(shù)后,直到對(duì)相同引腳有新地調(diào)用之前,引腳會(huì)一直輸出一個(gè)穩(wěn)定地指定占空比地波形。PWM信號(hào)地頻率約為四九零Hz。四.二模擬接口及應(yīng)用三.模擬I/O接口地應(yīng)用應(yīng)用實(shí)例一:通過電位器改變輸入模擬電壓,讀取模擬引腳上地電壓并顯示。將電位器地兩端分別連接VCC與GND,間抽頭與Arduino數(shù)字引腳相連。程序代碼如下:intanalogPin=三;//電位器地間引腳接A三intval=零;//定義一個(gè)變量valvoidsetup(){Serial.begin(九六零零);//設(shè)置串口波特率}voidloop(){val=analogRead(analogPin);//讀模擬量Serial.println(val);//在串口監(jiān)視器顯示}四.二模擬接口及應(yīng)用三.模擬I/O接口地應(yīng)用應(yīng)用實(shí)例二:讀取電位器地值并輸出控制燈地亮度。intledPin=九;//LED燈連接到九腳intanalogPin=三;//電位器連到三腳intval=零;//定義一個(gè)變量voidsetup(){}voidloop(){val=analogRead(analogPin);//讀輸入引腳值范圍:零到一零二三analogWrite(ledPin,val/四);//輸出數(shù)據(jù)地范圍:零到二五五}四.三串行通訊接口及應(yīng)用一.Arduino串行通訊接口概述UNO板有一個(gè)串口:Serial,通過數(shù)字引腳零(RX)與一(TX)與計(jì)算機(jī)地USB口行串口通訊。所以,數(shù)字引腳零與一若用于通訊,不能同時(shí)作為數(shù)字輸入與輸出引腳。可以用ArduinoIDE環(huán)境下內(nèi)嵌地串口監(jiān)視器與Arduino板通信。點(diǎn)擊工具欄上地串口監(jiān)視器按鈕,選擇與程序用begin()設(shè)定地相同地波特率。在引腳TX/RX上地串口通訊是TTL電,不能直接與RS二三二串口連接,否則開發(fā)板可能被燒壞。二五六零板有四個(gè)串口: Serial引腳零(RX)與一(TX);(同UNO) Serial一引腳一九(RX)與一八(TX); Serial二引腳一七(RX)與一六(TX); Serial三引腳一五(RX)與一四(TX)。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一)If(Serial)功能:測試指定串口是否準(zhǔn)備好。語法格式:if(Serial):適合所有Arduino板
;if(Serial一):適合ArduinoLeonardo板;if(Serial一),if(Serial二),if(Serial三):適合ArduinoMega板。參數(shù)說明:無。返回值:bool:若指定串口準(zhǔn)備好,返回真,否則返回假。例如:voidsetup(){Serial.begin(九六零零);//初始化串口,設(shè)值波特率為九六零零,等待串口打開while(!Serial){//等待串口連接。}}voidloop(){}四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(二)available()功能:讀取從串口接收到地字節(jié)(字符)數(shù)。數(shù)據(jù)已經(jīng)接收并存儲(chǔ)在串口緩沖區(qū)里(保持六四字節(jié))。available()繼承了流實(shí)用程序類。語法格式:Serial.available()。對(duì)ArduinoMega板:Serial一.available(),Serial二.available()與Serial三.available()。參數(shù):無。返回值:讀取地字節(jié)數(shù)。(三)availableForWrite()功能:不阻塞寫操作,讀取寫到串行緩沖區(qū)地字節(jié)(字符)數(shù)。語法格式:Serial.availableForWrite()。對(duì)ArduinoMega板:Serial一.availableForWrite(),Serial二.availableForWrite()與Serial三.availableForWrite()。參數(shù)說明:無。返回值:寫入緩沖區(qū)地字節(jié)數(shù)。}四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫四.begin()功能:設(shè)置串口通訊波特率:位/秒(baud),與計(jì)算機(jī)通訊時(shí),使用以下波特率:三零零,六零零,一二零零,二四零零,四八零零,九六零零,四四零零,一九二零零,二八八零零,三八四零零,七六零零或一一五二零零。也可設(shè)置其它波特率。第二個(gè)參數(shù)配置數(shù)據(jù)位數(shù),奇偶位與停止位。默認(rèn)是八個(gè)數(shù)據(jù)位,無奇偶位,一個(gè)停止位。語法格式:Serial.begin(speed)。 Serial.begin(speed,config)。下面地函數(shù)僅適用于ArduinoMega二五六零:Serial一.begin(speed)。Serial二.begin(speed)。Serial三.begin(speed)。Serial一.begin(speed,config)。Serial二.begin(speed,config)。Serial三.begin(speed,config)。參數(shù)說明:speed:位數(shù)/秒(long型);config:設(shè)置數(shù)據(jù)位,奇偶位與停止位。有效值如下:其:N-無校驗(yàn);E-偶校驗(yàn);O-奇校驗(yàn)。返回值:無。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫例子代碼如下:適用于ArduinoMega二五六零地例子代碼://ArduinoMega板地四個(gè)串口:Serial,Serial一,Serial二與Serial三,設(shè)置為不同地波特率。voidsetup(){Serial.begin(九六零零);Serial一.begin(三八四零零);Serial二.begin(一九二零零);Serial三.begin(四八零零);Serial.println("Helloputer");Serial一.println("HelloSerial一");Serial二.println("HelloSerial二");Serial三.println("HelloSerial三");}voidloop(){}四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(五)end()功能:禁止串口通訊,允許RX與TX引腳作為普通地輸入與輸出腳。要重新啟動(dòng)串口,調(diào)用
Serial.begin()。語法格式:Serial.end()。對(duì)ArduinoMega二五六零:Serial一.end(),Serial二.end()與Serial三.end()。參數(shù)說明:無。返回值:無。(六)find()功能:從串口緩沖區(qū)讀取已知長度地目地?cái)?shù)據(jù)。若已讀取目地串,返回真。若超時(shí),返回假。Serial.find繼承了流實(shí)用程序類。語法格式:Serial.find(target)。參數(shù)說明:target:讀取地目地串。返回值:bool。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(七)findUntil()功能:從串口緩沖區(qū)讀取已知長度地目地?cái)?shù)據(jù),讀取到終止串停止。若已讀取目地串返回真,若超時(shí)返回假。Serial.find繼承了流實(shí)用程序類。語法格式:Serial.findUntil(target,terminal)。參數(shù)說明:target:讀取地字符串;
terminal
:結(jié)束串。返回值:bool。(八)flush()功能:等待發(fā)送地串行數(shù)據(jù)地傳輸完成。語法格式:Serial.flush()。對(duì)ArduinoMega二五六零:Serial一.flush(),Serial二.flush()與Serial三.flush()。參數(shù)說明:無。返回值:無。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(九)parseFloat()功能:該函數(shù)從串行緩沖區(qū)返回第一個(gè)有效浮點(diǎn)數(shù),跳過非數(shù)字字符(或負(fù)號(hào))。parseFloat()函數(shù)終止于第一個(gè)非浮點(diǎn)數(shù)字符。Serial.parseFloat()繼承了流實(shí)用程序類。語法格式:Serial.parseFloat()。參數(shù)說明:無。返回值:有效浮點(diǎn)數(shù)(float)。(一零)parseInt()功能:在串口輸入流尋找下一個(gè)有效整數(shù)。非數(shù)字地字符或負(fù)號(hào)被忽略。Serial.parseInt()繼承了流實(shí)用程序類。在設(shè)定地時(shí)間范圍內(nèi),若讀取不到任何字符或讀取地不是數(shù)字,停止解析,若超時(shí),返回零。語法格式:Serial.parseInt()與Serial.parseInt(charskipChar)。對(duì)ArduinoMega二五六零:Serial一.parseInt(),Serial二.parseInt()與Serial三.parseInt()。參數(shù)說明:skipChar:要忽略掉地字符,例如千分器。返回值:下一個(gè)有效整數(shù)(long型)。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一一)peek()功能:讀取串口輸入數(shù)據(jù)地下一個(gè)字節(jié)或字符,但內(nèi)部串口緩沖器地內(nèi)容不變。即:對(duì)該函數(shù)地連續(xù)調(diào)用將返回同樣地字符。Serial.peek()繼承了流實(shí)用程序類。語法格式:Serial.peek()。對(duì)ArduinoMega二五六零:Serial一.peek(),Serial二.peek()與Serial三.peek()。參數(shù)說明:無。返回值:串口輸入數(shù)據(jù)地第一個(gè)有效字節(jié)(int型)。若沒有任何數(shù)據(jù)則返回-一。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一二)print()功能:將數(shù)據(jù)送串口顯示。每一位數(shù)字按一個(gè)ASCII字符顯示,浮點(diǎn)數(shù)類似于數(shù)字顯示,默認(rèn)保留小數(shù)點(diǎn)后面二位。語法格式:Serial.print(val)。 Serial.print(val,format)。參數(shù)說明:val:顯示地內(nèi)容(任何數(shù)據(jù)類型)。format:指明數(shù)字地制(整數(shù)),小數(shù)點(diǎn)后面數(shù)據(jù)位數(shù)(浮點(diǎn)數(shù))。返回值:size_t:顯示地字節(jié)數(shù)。例如:Serial.print(七八)顯示"七八"Serial.print(一.二三四五六)顯示"一.二三"Serial.print('N')顯示"N"Serial.print("Helloworld.")顯示"Helloworld."Serial.print(七八,BIN):顯示"一零零一一一零"Serial.print(七八,HEX):顯示"四E"Serial.print(一.二三四五六,四):顯示"一.二三四六"四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一三)println()功能:按ASCII文本輸出數(shù)據(jù)到串口,后接一個(gè)回車換行(ASCII一三,或'\r')與(ASCII一零,或'\n')。輸出格式同Serial.print()。語法格式:Serial.println(val)。Serial.println(val,format)。參數(shù)說明:val:輸出顯示地內(nèi)容(任何數(shù)據(jù)類型);format:指明數(shù)字地制(整數(shù)),小數(shù)點(diǎn)后面數(shù)據(jù)位數(shù)(浮點(diǎn)數(shù))。返回值:size_t:輸出地字節(jié)數(shù)。(一四)read()功能:讀串口數(shù)據(jù),Serial.read繼承了流實(shí)用程序類。語法格式:Serial.read()。適用于ArduinoMega二五六零地有:Serial一.read();Serial二.read();Serial三.read()。參數(shù)說明:無。返回值:串行輸入數(shù)據(jù)地第一個(gè)字節(jié)(int型)。若沒有數(shù)據(jù)返回-一。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一五)readBytes()功能:讀輸入地串口字符到緩沖區(qū)。若確定長度地?cái)?shù)據(jù)讀取完畢或超時(shí)則結(jié)束。Serial.readBytes繼承了流實(shí)用程序類。語法格式:Serial.readBytes(buffer,length)。參數(shù)說明:buffer:存入數(shù)據(jù)地緩沖區(qū)(char[]或byte[]型);length:讀取地字節(jié)數(shù)。返回值:size_t:存入buffer地字節(jié)數(shù)。返回零:無數(shù)據(jù)。(一六)readBytesUntil()功能:從串行緩沖區(qū)讀數(shù)據(jù)到一個(gè)數(shù)組。若確定長度地?cái)?shù)據(jù)讀取完畢或超時(shí)則結(jié)束。函數(shù)返回結(jié)束符之前地所有字符。結(jié)束符本身不返回。readBytesUntil()繼承了流實(shí)用程序類。語法格式:Serial.readBytesUntil(character,buffer,length)。參數(shù)說明:character:搜索地結(jié)束字符(char型),buffer:存入數(shù)據(jù)地緩沖區(qū)(char[]或byte[]型);length:讀取地字節(jié)數(shù)(int型)。返回值:size_t:存入buffer地字節(jié)數(shù)。返回零:無數(shù)據(jù)。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(一七)readString()功能:從串口緩沖區(qū)讀字符到字符串。超時(shí)結(jié)束。語法格式:Serial.readString()。參數(shù)說明:無。返回值:字符串。(一八)readStringUntil()功能:從串口緩沖區(qū)讀字符到字符串。超時(shí)結(jié)束。語法格式:Serial.readStringUntil(terminator)。參數(shù)說明:terminator:搜索地結(jié)束字符(char型)。返回值:從串口緩沖區(qū)讀取地結(jié)束符之前地整個(gè)字符串。(一九)setTimeout()功能:調(diào)用serial.readBytesUntil()與serial.readBytes()時(shí),設(shè)置串口操作地超時(shí)時(shí)間(ms),默認(rèn)是一零零零ms。Serial.setTimeout()繼承了流實(shí)用程序類。語法格式:Serial.setTimeout(time)。參數(shù)說明:time:超時(shí)時(shí)間(long型)。返回值:無。四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(二零)write()功能:寫二制數(shù)據(jù)到串口,被發(fā)送地?cái)?shù)據(jù)是一個(gè)字節(jié)或多個(gè)字節(jié);發(fā)送字符用print()函數(shù)。語法格式:Serial.write(val)。Serial.write(str)。Serial.write(buf,len)。對(duì)ArduinoMega二五六零,可用Serial一,Serial二,Serial三替代Serial。參數(shù)說明:val:單字節(jié)數(shù)據(jù);str:多個(gè)字節(jié)組成地字節(jié)串;buf:多個(gè)字節(jié)組成地?cái)?shù)組。返回值:size_t:寫入串口地字節(jié)數(shù)。例子:voidsetup(){Serial.begin(九六零零);}voidloop(){Serial.write(四五); //發(fā)送二制數(shù)據(jù)四五intbytesSent=Serial.write("hello"); //發(fā)送字符串"hello",返回字符串長度}四.三串行通訊接口及應(yīng)用二.串行通訊接口地封裝類庫(二一)serialEvent()功能:數(shù)據(jù)有效時(shí)被調(diào)用。用Serial.read()獲取數(shù)據(jù)。語法格式:voidserialEvent(){//statements}。對(duì)ArduinoMega二五六零,可用serialEvent一,serialEvent二,serialEvent三替代serialEvent。參數(shù)說明:statements:任何語句。返回值:無。四.三串行通訊接口及應(yīng)用三.串行通訊接口地應(yīng)用串口通訊實(shí)例一:讀取從串口接收地字符并送顯示。下面地代碼從串口監(jiān)視器輸入數(shù)據(jù)并顯示。intiningByte=零; //iningByte變量初始化為零voidsetup(){Serial.begin(九六零零); //打開串口,設(shè)置數(shù)據(jù)波特率為九六零零}voidloop(){if(Serial.available()>零){ //當(dāng)接收到數(shù)據(jù)時(shí)行應(yīng)答iningByte=Serial.read();//接收一個(gè)數(shù)據(jù)并賦給變量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制顯示接收到地字節(jié)}}四.三串行通訊接口及應(yīng)用三.串行通訊接口地應(yīng)用串口通訊實(shí)例:讀取從串口接收地字符并送顯示。下面地代碼從串口監(jiān)視器輸入數(shù)據(jù)并顯示。intiningByte=零; //iningByte變量初始化為零voidsetup(){Serial.begin(九六零零); //打開串口,設(shè)置數(shù)據(jù)波特率為九六零零}voidloop(){if(Serial.available()>零){ //當(dāng)接收到數(shù)據(jù)時(shí)行應(yīng)答iningByte=Serial.read();//接收一個(gè)數(shù)據(jù)并賦給變量Serial.print("Ireceived:");Serial.println(iningByte,DEC);//按十制顯示接收到地字節(jié)}}四.四I二C接口及應(yīng)用一.I二C概述I二C總線只有兩根雙向信號(hào)線,一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。所有連接到I二C總線上地器件地?cái)?shù)據(jù)線都連接到SDA上,各器件地時(shí)鐘線也都連接到SCL。I二C總線是一個(gè)多主機(jī)總線,總線上可以有一個(gè)或多個(gè)主機(jī),由主機(jī)控制總線地操作。每一個(gè)接到總線上地設(shè)備都有一個(gè)唯一地識(shí)別碼,且都可以作為一個(gè)接收器或發(fā)送器。I二C總線上地SDA與SCL是雙向地,均通過上拉電阻與正電源連接。MEGA二五六零板在引腳二零與二一有內(nèi)部上拉電阻。當(dāng)總線空閑時(shí),兩根信號(hào)都是高電。I二C地址有七位與八位兩種地址。七位識(shí)別設(shè)備,第八位表示讀或?qū)懖僮?。ArduinoIDE地Wire庫使用七位地址。Arduino地Wire庫允許Arduino板與I二C(在Arduino稱為TWI)設(shè)備行通訊。Arduino板I二C(TWI)引腳UnoA四(SDA),A五(SCL)Mega二五六零二零(SDA),二一(SCL)Arduino板上I二C地引腳分配四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(一)begin()功能:初始化Wire庫,將I二C設(shè)備作為主設(shè)備或從設(shè)備加入到I二C總線。該函數(shù)應(yīng)該只調(diào)用一次。語法格式:Wire.begin(address)。參數(shù)說明:地址:七位從地址(可選)。如果地址未指明,作為主設(shè)備加入總線。返回值:無。(二)beginTransmission()功能:Wire.beginTransmission(address)函數(shù)啟動(dòng)一個(gè)已知地址地I二C從設(shè)備地通訊。之后,調(diào)用write()函數(shù)發(fā)送字節(jié),調(diào)用endTransmission()函數(shù)結(jié)束發(fā)送。語法格式:Wire.beginTransmission(address)。參數(shù)說明:address:設(shè)備地七位地址。返回值:無。四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(三)write()功能:寫數(shù)據(jù)到從設(shè)備。語法格式:Wire.write(value)。Wire.write(string)。Wire.write(data,length)。參數(shù)說明:value:要發(fā)送地字節(jié)。string:要發(fā)送地字節(jié)串。data:要發(fā)送地?cái)?shù)組。length:發(fā)送地字節(jié)數(shù)。返回值:byte:write()函數(shù)返回發(fā)送數(shù)據(jù)地字節(jié)數(shù)。四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(四)endTransmission()功能:結(jié)束由beginTransmission()發(fā)起地對(duì)從設(shè)備地?cái)?shù)據(jù)發(fā)送,發(fā)送由write()函數(shù)寫隊(duì)列地字節(jié)串。對(duì)于Arduino一.零.一,endTransmission()接收一個(gè)布爾參數(shù),便于兼容不同地I二C設(shè)備。如果為真,endTransmission()發(fā)送數(shù)據(jù)后,發(fā)送一個(gè)停止信息,釋放I二C總線。如果為假,endTransmission()發(fā)送數(shù)據(jù)后發(fā)送一個(gè)重新啟動(dòng)信息??偩€將不被釋放以避免另一個(gè)主設(shè)備發(fā)送數(shù)據(jù)。這允許一個(gè)主設(shè)備行多次發(fā)送。默認(rèn)值為真。語法格式:Wire.endTransmission()。 Wire.endTransmission(stop)。參數(shù)說明:stop:布爾值。true將發(fā)送一個(gè)停止信息,發(fā)送后釋放總線。false將送一個(gè)重啟信息,保持連接激活狀態(tài)。返回值:一個(gè)指示發(fā)送地狀態(tài)字節(jié)。零:成功;一:數(shù)據(jù)太大,超限;二:發(fā)送地址時(shí)未應(yīng)答;三:發(fā)送數(shù)據(jù)時(shí)無應(yīng)答;四:其它錯(cuò)誤。四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(五)available()功能:對(duì)主設(shè)備,在調(diào)用requestFrom()后返回接收地字節(jié)數(shù)。對(duì)從設(shè)備,在onReceive()句柄內(nèi),返回接收地字節(jié)數(shù)。Wire.available()繼承了流實(shí)用程序類。語法格式:Wire.available()。參數(shù)說明:無。返回值:返回接收地字節(jié)數(shù)。(六)requestFrom()功能:在主機(jī)模式下設(shè)置從設(shè)備向主設(shè)備發(fā)送地字節(jié)數(shù)。利用available()與read()函數(shù)讀取設(shè)置地字節(jié)數(shù)。語法格式:Wire.requestFrom(address,quantity)。 Wire.requestFrom(address,quantity,stop)。參數(shù)說明:address:七位從設(shè)備地址。quantity:請(qǐng)求發(fā)送地字節(jié)數(shù)。Stop:布爾值。為真則請(qǐng)求后發(fā)送一個(gè)停止信息,釋放總線。為假則將在請(qǐng)求后連續(xù)發(fā)送一個(gè)重啟信號(hào),使總線保持在連接狀態(tài)。返回值:byte:從設(shè)備返回地字節(jié)數(shù)。四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(七)read()功能:在調(diào)用requestFrom()函數(shù)后,讀取從設(shè)備發(fā)送到主設(shè)備或主設(shè)備發(fā)送到從設(shè)備地一個(gè)字節(jié)。read()繼承了流實(shí)用程序類。語法格式:Wire.read()。參數(shù)說明:無。返回值:接收地字節(jié)。例子:#include<Wire.h>voidsetup(){Wire.begin(); //加入I二C總線(對(duì)主設(shè)備地址可選)Serial.begin(九六零零);} //啟動(dòng)串口輸出voidloop(){Wire.requestFrom(二,六); //向#二號(hào)從設(shè)備請(qǐng)求六個(gè)字節(jié)while(Wire.available()){ //從設(shè)備發(fā)送地字節(jié)可能少于請(qǐng)求地charc=Wire.read(); //接收一個(gè)字符Serial.print(c);} //輸出delay(五零零);}四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(八)setClock()功能:Wire.setClock()函數(shù)修改I二C通訊地時(shí)鐘頻率。I二C從設(shè)備地工作時(shí)鐘沒有下限要求,但一零零KHz通常是底線。語法格式:Wire.setClock(clockFrequency)。參數(shù)說明:clockFrequency:設(shè)置地通訊頻率(Hz)??稍O(shè)置為一零零零零零(標(biāo)準(zhǔn)模式)與四零零零零零(快速模式)。一些處理器也支持一零零零零(低速模式),一零零零零零零(快速模式+)與三四零零零零零(高速模式)。返回值:無。(九)onReceive()功能:當(dāng)從設(shè)備接收來自主設(shè)備地?cái)?shù)據(jù)時(shí),注冊(cè)一個(gè)處理數(shù)據(jù)函數(shù)。語法格式:Wire.onReceive(handler)。參數(shù)說明:handler:當(dāng)從設(shè)備接收數(shù)據(jù)時(shí)調(diào)用地函數(shù)。這個(gè)函數(shù)形式例如:voidmyHandler(intnumBytes),有一個(gè)int型地參數(shù)(從主機(jī)讀取地字節(jié)數(shù))且無返回值。返回值:無。四.四I二C接口及應(yīng)用二.I二C地類庫函數(shù)(一零)onRequest(handler)功能:當(dāng)主設(shè)備接收來自從設(shè)備地?cái)?shù)據(jù)時(shí),注冊(cè)一個(gè)處理數(shù)據(jù)函數(shù)。語法格式:Wire.onRequest(handler)。參數(shù)說明:handler:被調(diào)用地函數(shù)(無參數(shù),無返回),例如:voidmyHandler()。返回值:無。四.四I二C接口及應(yīng)用三.I二C接口地應(yīng)用利用ArduinoUNO地Wire庫函數(shù),控制具有I二C接口地?cái)?shù)字電位器AD五一七一,該模擬設(shè)備可輸出六四級(jí)不同地電壓值來控制LED。I二C協(xié)議使用Arduino地兩根信號(hào)線發(fā)送與接收數(shù)據(jù):一個(gè)串行輸入引腳(SCL),該信號(hào)負(fù)責(zé)輸入時(shí)鐘信號(hào);一個(gè)串行數(shù)據(jù)引腳(SDA),負(fù)責(zé)傳送數(shù)據(jù)。當(dāng)SCL產(chǎn)生低到高地跳變時(shí)(即時(shí)鐘脈沖地上升沿),通過SDA引腳,從開發(fā)板到I二C傳送一位信息,信息一位接一位行串行傳送,I二C設(shè)備接收到相應(yīng)信息(地址與命令)后,與SCL時(shí)鐘信號(hào)配合,通過SDA引腳返回?cái)?shù)據(jù)。由于一二C協(xié)議允許每個(gè)設(shè)備有唯一地地址,主與從設(shè)備可以通過一根線依次完成通訊,這使得Arduino通過兩個(gè)引腳,可以依次與多個(gè)設(shè)備行通訊。四.四I二C接口及應(yīng)用三.I二C接口地應(yīng)用#include<Wire.h>byteval=零;voidsetup(){Wire.begin(); //加入I二C總線}voidloop(){Wire.beginTransmission(四四);//發(fā)送地址到設(shè)備#四四(零x二c),在數(shù)據(jù)手冊(cè)Wire.write(byte(零x零零));//發(fā)送命令字節(jié)Wire.write(val); //發(fā)送電位器地值Wire.endTransmission();//停止發(fā)送val++; //值加一if(val==六四) //若加到第六四個(gè)位置(最大值)val=零; //回到最低值delay(五零零);}四.五SPI接口及應(yīng)用一.SPI協(xié)議簡介SPI(SerialPeripheralInterface,串行外設(shè)接口)是同步串行數(shù)據(jù)傳輸標(biāo)準(zhǔn),允許MCU以全雙工地同步串行方式與各種外圍設(shè)備行高速數(shù)據(jù)通信。同步時(shí)鐘信號(hào)只由主設(shè)備控制,從設(shè)備不能控制該信號(hào)。在一個(gè)基于SPI地設(shè)備,至少要有一個(gè)主控設(shè)備。普通地串行通訊一次連續(xù)傳送至少八位數(shù)據(jù)。SPI還是一個(gè)數(shù)據(jù)換協(xié)議,因?yàn)镾PI地?cái)?shù)據(jù)輸入與輸出線獨(dú)立,所以允許同時(shí)完成數(shù)據(jù)地輸入與輸出。SPI接口經(jīng)常被稱為四線串行總線,以主/從方式工作,數(shù)據(jù)傳輸過程由主機(jī)初始化。(一)SCLK:串行時(shí)鐘,用來同步數(shù)據(jù)傳輸,由主機(jī)輸出。(二)MOSI:主機(jī)輸出從機(jī)輸入數(shù)據(jù)線。(三)MISO:主機(jī)輸入從機(jī)輸出數(shù)據(jù)線。(四)SS:片選線,低電有效,由主機(jī)輸出。其,SS是從芯片是否被主芯片選地控制信號(hào),也就是說只有片選信號(hào)為預(yù)先規(guī)定地使能信號(hào)時(shí)(高電位或低電位),主芯片對(duì)此從芯片地操作才有效。這就使在同一條總線上連接多個(gè)SPI設(shè)備成為可能。四.五SPI接口及應(yīng)用一.SPI協(xié)議簡介Arduino板MOSIMISOSCKSS(從)SS(主)LevelUNO一一orICSP-四一二orICSP-一一三orICSP-三一零-五VMega二五六零五一orICSP-四五零orICSP-一五二orICSP-三五三-五VArduino板地SPI引腳分配所有地基于AVR地開發(fā)板有一個(gè)SS引腳。當(dāng)Arduino板作為從設(shè)備時(shí),SS引腳會(huì)用到。因?yàn)镾PI類庫只支持主模式,這個(gè)引腳應(yīng)該設(shè)置為總是OUTPUT,否則SPI接口自動(dòng)入從模式,使庫函數(shù)無效??梢允褂萌魏我_作為設(shè)備地SS腳。SPI類庫允許Arduino作為主設(shè)備與其它SPI設(shè)備通訊。四.五SPI接口及應(yīng)用二.SPI地類庫函數(shù)(一)SPISettings功能:配置SPI端口。三個(gè)參數(shù)組合在一起賦給SPISettings對(duì)象。語法格式:SPI.beginTransaction(SPISettings(一四零零零零零零,MSBFIRST,SPI_MODE零))語法格式:SPISettingsmySettting(speedMaximum,dataOrder,dataMode)。參數(shù)說明:speedMaximum:通訊地最大速度。對(duì)一個(gè)速度可達(dá)到二零MHz地SPI芯片,該值為二零零零零零零零。 dataOrder:MSBFIRST或LSBFIRST。 dataMode:SPI_MODE零,SPI_MODE一,SPI_MODE二或SPI_MODE三。返回值:無。四.五SPI接口及應(yīng)用二.SPI地類庫函數(shù)(二)begin()功能:SPI初始化:設(shè)置SCK,MOSI與SS為輸出,將SCK與MOSI拉為低電,SS拉成高電。語法格式:SPI.begin()。參數(shù)說明:無。返回值:無。(三)end()功能:禁止SPI總線(引腳模式不變)。語法格式:SPI.end()。參數(shù)說明:無。返回值:無。四.五SPI接口及應(yīng)用二.SPI地類庫函數(shù)(四)beginTransaction()功能:用被定義地SPISettings對(duì)象初始化SPI總線。語法格式:SPI.beginTransaction(mySettings)。參數(shù)說明:mySettings:被定義地SPISettings對(duì)象名。返回值:無。(五)endTransaction()功能:停止使用SPI總線。當(dāng)片選無效后使用該函數(shù),允許其它庫使用SPI總線。語法格式:SPI.endTransaction()。參數(shù)說明:無。返回值:無。四.五SPI接口及應(yīng)用二.SPI地類庫函數(shù)(六)transfer()與transfer一六()功能:接收數(shù)據(jù)送receivedVal(receivedVal一六),或者接收地?cái)?shù)據(jù)放在緩存器buffer,舊數(shù)據(jù)被新接收地?cái)?shù)據(jù)覆蓋。語法格式:receivedVal=SPI.transfer(val)。 receivedVal一六=SPI.transfer一六(val一六)。 SPI.transfer(buffer,size)參數(shù)說明:val:通過總線發(fā)送地字節(jié)。 val一六:通過總線發(fā)送地二個(gè)字節(jié)變量。 buffer:發(fā)送地?cái)?shù)組數(shù)據(jù)。size:字節(jié)數(shù)。返回值:接收地?cái)?shù)據(jù)。四.五SPI接口及應(yīng)用二.SPI地類庫函數(shù)(七)usingInterrupt()功能:如果在斷程序行SPI通訊,調(diào)用該函數(shù)注冊(cè)斷號(hào)或用SPI庫命名。這是為了防止SPI.beginTransaction()使用時(shí)產(chǎn)生沖突.注意:在usingInterrupt()指定地?cái)?在beginTransaction()執(zhí)行時(shí)被禁止,endTransaction()執(zhí)行后被重新允許。語法格式:SPI.usingInterrupt(interruptNumber)。參數(shù)說明:interruptNumber:關(guān)聯(lián)地?cái)嗵?hào)。返回值:無。四.五SPI接口及應(yīng)用三.SPI接口地應(yīng)用控制一個(gè)數(shù)字電位器AD五二零六
,數(shù)字電位器是一個(gè)可以用程序改變電阻大小地電位器。使用一個(gè)六通道地?cái)?shù)字電位器控制六個(gè)LED地亮度。四.五SPI接口及應(yīng)用三.SPI接口地應(yīng)用AD五二零六采用SPI接口,通過兩個(gè)字節(jié)對(duì)它行控制:一個(gè)設(shè)置通道號(hào):(零~五),另一個(gè)設(shè)置該通道地電阻(零~二五五)。#include<SPI.h> //引用SPI庫constintslaveSelectPin=一零; //設(shè)置引腳一零為數(shù)字電位器從設(shè)備地片選:voidsetup(){pinMode(slaveSelectPin,OUTPUT); //設(shè)置片選為輸出SPI.begin();} //初始化SPIvoidloop(){for(intchannel=零;channel<六;channel++){ //循環(huán)控制六個(gè)通道for(intlevel=零;level<二五五;level++){ //逐漸增大每個(gè)通道地電阻值digitalPotWrite(channel,level);delay(一零);}delay(一零零); //延時(shí)一零零msfor(intlevel=零;level<二五五;level++){ //逐漸減小電阻值digitalPotWrite(channel,二五五-level);delay(一零);}}}四.五SPI接口及應(yīng)用三.SPI接口地應(yīng)用voiddigitalPotWrite(intaddress,intvalue){digitalWrite(slaveSelectPin,LOW); //設(shè)置CS為低delay(一零零);SPI.transfer(address); //向SPI傳送通道號(hào)與電阻值SPI.transfer(value);delay(一零零);digitalWrite(slaveSelectPin,HIGH); //設(shè)置CS為高電}四.六外部斷接口及應(yīng)用一.外部斷概述(一)斷地概念如果沒有斷功能,Arduino對(duì)地處理只能采用程序查詢方式,即CPU不斷查詢外部是否有產(chǎn)生,查詢時(shí),CPU不能再做別地事,且大部分時(shí)間可能都處于等待狀態(tài)。Arduino具有對(duì)外部實(shí)時(shí)處理地功能,就是通過外部斷技術(shù)實(shí)現(xiàn)地。當(dāng)Arduino正在處理某件事情時(shí),外部或內(nèi)部發(fā)生地某一(如某個(gè)引腳上電地變化或計(jì)數(shù)器地計(jì)數(shù)溢出)請(qǐng)求Arduino地CPU迅速去處理,于是,CPU暫停當(dāng)前地工作,轉(zhuǎn)去處理所發(fā)生地。斷服務(wù)程序處理完該后,再回到原來被止地地方,繼續(xù)原來地工作,這樣地過程稱為斷。產(chǎn)生斷地請(qǐng)求源被稱為斷源。斷源向CPU提出地處理請(qǐng)求,稱為斷請(qǐng)求。采用外部斷地特點(diǎn)是:實(shí)時(shí)好,速度快,效率高,但編程相對(duì)復(fù)雜一些。四.六外部斷接口及應(yīng)用一.外部斷概述(二)斷服務(wù)程序斷服務(wù)程序,可理解為是一種服務(wù),是通過執(zhí)行事先編好地某個(gè)特定地程序來完成地,這種處理"急件"地程序被稱為斷服務(wù)程序。斷服務(wù)程序(ISRs)是CPU響應(yīng)一個(gè)特定斷時(shí)強(qiáng)制執(zhí)行地函數(shù),是一種特殊地函數(shù),與其它函數(shù)相比,具有某些限制,ISRs不能有參數(shù),也沒有返回值。一般地,ISR應(yīng)該盡可能短與快。若有多個(gè)ISRs,同一時(shí)刻只有一個(gè)在運(yùn)行,只有當(dāng)前斷返回后才能入下一個(gè)斷,優(yōu)先級(jí)高地?cái)嘞热搿elay(),micros()地運(yùn)行與斷有關(guān),在ISR不能正常運(yùn)行,millis()只返回入斷前地值;在函數(shù)內(nèi)串口接收地?cái)?shù)據(jù)可能丟失;而delayMicroseconds()在斷可以使用??捎萌肿兞吭贗SR與主程序之間傳遞數(shù)據(jù),但變量需要定義為volatile型。四.六外部斷接口及應(yīng)用一.外部斷概述(三)斷優(yōu)先級(jí)為了管理眾多地?cái)嗾?qǐng)求,需要按每個(gè)(類)斷處理地急迫程度,對(duì)斷行分級(jí)管理,稱其為斷優(yōu)先級(jí)。在有多個(gè)斷請(qǐng)求時(shí),總是響應(yīng)與處理優(yōu)先級(jí)高地設(shè)備地?cái)嗾?qǐng)求。(四)斷嵌套當(dāng)CPU正在處理優(yōu)先級(jí)較低地一個(gè)斷,又接收到優(yōu)先級(jí)更高地一個(gè)斷請(qǐng)求,則CPU先停止低優(yōu)先級(jí)地?cái)嗵幚磉^程,去響應(yīng)優(yōu)先級(jí)更高地?cái)嗾?qǐng)求,在優(yōu)先級(jí)更高地?cái)嗵幚硗瓿芍?再繼續(xù)處理低優(yōu)先級(jí)地?cái)?這種情況稱為斷嵌套。四.六外部斷接口及應(yīng)用一.外部斷概述(五)Arduino地外部斷引腳Arduino外部斷是由Arduino外部引腳引起地?cái)唷i_發(fā)板名稱可用于斷地?cái)?shù)字引腳UNo,其它基于三二八地開發(fā)板二,三Mega,Mega二五六零二,三,一八,,一九,二零,二一Micro,Leonardo零,一,二,三,七Zero所有數(shù)字引腳(四腳除外)MKR系列零,一,四,五,六,七,八,九,A一,A二Due所有數(shù)字引腳一零一所有數(shù)字引腳(僅二,五,七,八,一零,一一,一二,一三有CHANGE選項(xiàng))外部斷引腳四.六外部斷接口及應(yīng)用二.外部斷地封裝函數(shù)(一)attachInterrupt()功能:設(shè)置一個(gè)外部斷。語法格式:attachInterrupt(digitalPinToInterrupt(pin),ISR,mode)(推薦使用)。attachInterrupt(interrupt,ISR,mode)(不推薦)。參數(shù)說明:interrupt:斷號(hào)(int型)。pin:引腳號(hào)。ISR:當(dāng)斷發(fā)生時(shí)所調(diào)用地?cái)喾?wù)函數(shù)名。ISR沒有參數(shù)與返回值。mode:定義斷觸發(fā)方式。定義如下:LOW:當(dāng)引腳為低電時(shí),觸發(fā)斷。CHANGE:當(dāng)引腳變化時(shí),觸發(fā)斷。RISING:當(dāng)引腳產(chǎn)生低到高地跳變時(shí),觸發(fā)斷。FALLING:當(dāng)引腳產(chǎn)生高到低地跳變時(shí),觸發(fā)斷。HIGH:當(dāng)引腳為高電時(shí),觸發(fā)斷(僅適用于Due,Zero與MKR一零零零開發(fā)板)。返回值:無。四.六外部斷接口及應(yīng)用二.外部斷地封裝函數(shù)attachInterrupt地第一個(gè)參數(shù)是斷號(hào)。正常情況下應(yīng)該用digitalPinToInterrupt(pin)函數(shù)將實(shí)際數(shù)字引腳轉(zhuǎn)換成指定地?cái)嗵?hào)。例如,如果從三腳接入斷,用digitalPinToInterrupt(三)作為attachInterrupt地第一個(gè)參數(shù)。一般地,在attachInterrupt()函數(shù),應(yīng)該用digitalPinToInterrupt(pin),而不是用一個(gè)斷號(hào)代替。不同開發(fā)板地?cái)嗵?hào)與引腳地映射關(guān)系不同,直接使用斷號(hào)簡單但可能引起不同開發(fā)板之間地兼容問題。早期程序常使用斷號(hào).斷號(hào)與引腳地映射關(guān)系A(chǔ)rduino板斷號(hào)INT.零INT.一INT.二INT.三INT.四INT.五UNO,Ether引腳二三
Mega二五六零引腳二三二一二零一九一八基于三二u四開發(fā)板引腳三二零一七四.六外部斷接口及應(yīng)用二.外部斷地封裝函數(shù)(二)detachInterrupt()
功能:關(guān)閉某個(gè)已啟用地?cái)?。語法格式:detachInterrupt(interrupt)。參數(shù)說明:interrupt:關(guān)閉地?cái)嗵?hào)。返回值:無。(三)interrupts()
功能:開斷。語法格式:interrupts()
。參數(shù)說明:無。返回值:無。(四)noInterrupts()
功能:停止已設(shè)置好地?cái)?使程序運(yùn)行不受斷影響。語法格式:nointerrupts()
。參數(shù)說明:無。返回值:無。四.六外部斷接口及應(yīng)用三.外部斷地應(yīng)用實(shí)例:程序下載運(yùn)行后,一三腳連接地LED不斷閃爍。constbyteledPin=一三;constbyteinterruptPin=二;volatilebytestate=LOW;voidsetup(){pinMode(ledPin,OUTPUT);pinMode(interruptPin,INPUT_PULLUP);//當(dāng)二腳上地電跳變時(shí),觸發(fā)斷函數(shù)blink,對(duì)變量state取反,使LED閃爍。attachInterrupt(digitalPinToInterrupt(interruptPin),blink,CHANGE);}voidloop(){digitalWrite(ledPin,state);}voidblink(){state=!state;} //ISR函數(shù),求反四.七定時(shí)斷接口及應(yīng)用一.定時(shí)斷概述(一)什么是定時(shí)器(Timer)定時(shí)器可以準(zhǔn)確控制時(shí)間。單片機(jī)內(nèi)部設(shè)有可編程定時(shí)器/計(jì)數(shù)器。可編程地意思是指其功能(如工作方式,定時(shí)時(shí)間,量程,啟動(dòng)方式等)均可由指令來確定與改變。定時(shí)器確實(shí)是一項(xiàng)了不起地發(fā)明,使相當(dāng)多需要控制時(shí)間地工作變得簡單了許多。例如現(xiàn)在地不少家用電器都安裝了定時(shí)器來控制開關(guān)或工作時(shí)間。(二)定時(shí)斷在設(shè)計(jì)程序時(shí),經(jīng)常需要周期完成一些固定地任務(wù),而用延時(shí)等待定時(shí)又占用程序時(shí)間,程序執(zhí)行時(shí)間根據(jù)各種狀況不是一定地,所以需要采用定時(shí)斷方式,其不占用CPU執(zhí)行時(shí)間,完成周期任務(wù)。(三)Arduino定時(shí)斷Arduino封裝了定時(shí)斷函數(shù),可以用來設(shè)定定時(shí)斷,高級(jí)編程可以通過內(nèi)部寄存器設(shè)定,斷調(diào)用函數(shù)與外部斷類似。四.七定時(shí)斷接口及應(yīng)用二.定時(shí)斷地類庫函數(shù)Arduino定時(shí)斷類庫名稱是MSTimer二。(一)MsTimer二::set()功能:設(shè)置定時(shí)斷。語法格式:MsTimer二::set(unsignedlongms,void(*f)())。參數(shù)說明:ms:毫秒為單位定時(shí)時(shí)間,即定時(shí)斷地時(shí)間間隔,unsignedlong類型。void(*f)():定時(shí)斷服務(wù)程序地函數(shù)名。返回值:無。(二)MsTimer二::start()功能:定時(shí)開始。語法格式:MsTimer二::start()。參數(shù)格式:無。返回值:無。(三)MsTimer二::stop()功能:定時(shí)停止。語法格式:MsTimer二::stop()。參數(shù)格式:無。返回值:無四.七定時(shí)斷接口及應(yīng)用三定時(shí)斷地應(yīng)用利用定時(shí)斷實(shí)現(xiàn)LED燈地閃爍。led燈接UNO地一三管腳。#include<MsTimer二.h>//定時(shí)器類庫地頭文件voidflash(){ //斷處理函數(shù),改變燈地狀態(tài)staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//斷設(shè)置函數(shù),每五零零ms入一次斷MsTimer二::start();//開始計(jì)時(shí)}voidloop(){}程序下載運(yùn)行后,可以看到一三腳控制地led燈一秒亮滅一次,即五零零毫秒執(zhí)行flash函數(shù)一次。四.七定時(shí)斷接口及應(yīng)用三定時(shí)斷地應(yīng)用利用定時(shí)斷實(shí)現(xiàn)LED燈地閃爍。led燈接UNO地一三管腳。#include<MsTimer二.h>//定時(shí)器類庫地頭文件voidflash(){ //斷處理函數(shù),改變燈地狀態(tài)staticbooleanoutput=HIGH;digitalWrite(一三,output);output=!output;}voidsetup(){pinMode(一三,OUTPUT);MsTimer二::set(五零零,flash);//斷設(shè)置函數(shù),每五零零ms入一次斷MsTimer二::start();//開始計(jì)時(shí)}voidloop(){}程序下載運(yùn)行后,可以看到一三腳控制地led燈一秒亮滅一次,即五零零毫秒執(zhí)行flash函數(shù)一次。四.八軟件串口及應(yīng)用一.軟件串口概述Arduino板通過硬件串口(數(shù)字引腳零與一)與PC機(jī)行USB連接,原始硬件串口也被稱之為UART。允許Atmega芯片在完成其它工作地同時(shí)接收串口數(shù)據(jù)到六四字節(jié)地串口緩沖區(qū)。軟件串口類庫允許通過Arduino地?cái)?shù)字引腳行串行通訊。允許同時(shí)可以有多個(gè)軟件串口,速度可達(dá)到一一五二零零bps。但使用軟件串口會(huì)受到一些限制,具體如下:如果使用多個(gè)軟件串口,同一時(shí)間只有一個(gè)能接收數(shù)據(jù)。對(duì)Mega與二五六零板,只有部分引腳可用作RX:一零,一一,一二,一三,一四,一五,五零,五一,五二,五三,A八(六二),A九(六三),A一零(六四),A一一(六五),A一二(六六),A一三(六七),A一四(六八),A一五(六九)。對(duì)Arduino板,目前RX最大速度是五七六零零bps且其一三引腳不能作為RX。四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(一)begin()功能:設(shè)置串行通信地波特率。語法格式:mySerial.begin(longspeed)。參數(shù)說明:speed:串行通信速率,最大傳輸速率不超過一一五二零零bps。返回值:無。(二)available()功能:讀取從串口接收到地字節(jié)(字符)數(shù)。語法格式:mySerial.available()。參數(shù):無。返回值:讀取地字節(jié)數(shù)。(三)read()功能:用于讀取串行通信接收到地字符。語法格式:mySerial.read()。參數(shù)說明:無。返回值:接收到地int類型地?cái)?shù)據(jù)。四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(四)write()功能:寫二制數(shù)據(jù)到串口,被發(fā)送地?cái)?shù)據(jù)是一個(gè)字節(jié)或多個(gè)字節(jié);發(fā)送代表數(shù)字地字符用print()函數(shù)。語法格式:mySerial.write(val)。 mySerial.write(str)。 mySerial.write(buf,len)。ArduinoMega也支持:
mySerial一,mySerial二,mySerial三(代替Serial)。參數(shù)說明:val:單字節(jié)數(shù)據(jù)。str:多個(gè)字節(jié)組成地字節(jié)串。buf:多個(gè)字節(jié)組成地?cái)?shù)組。len:緩存器地長度。返回值:size_t:寫入串口地字節(jié)數(shù)。四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(五)isListening()功能:測試軟串口是否在監(jiān)聽狀態(tài)。語法格式:mySerial.isListening()。參數(shù)說明:無。返回值:boolean。例子:#include<SoftwareSerial.h>//軟件串口:TX=數(shù)字引腳一零,RX=數(shù)字引腳一一SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //啟動(dòng)硬件串口portOne.begin(九六零零); //啟動(dòng)軟件串口}voidloop(){if(portOne.isListening())Serial.println("PortOneislistening!");}四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(六)listen()功能:使所選擇地軟串口處于監(jiān)聽狀態(tài)。同一時(shí)間只能有一個(gè)軟件串口處于監(jiān)聽狀態(tài)。調(diào)用該函數(shù)時(shí),已經(jīng)接收地地?cái)?shù)據(jù)將被丟棄。語法格式:mySerial.listen()。參數(shù)說明:無。返回值:boolean:若代替了另一個(gè)軟件串口,返回真,否則返回假。例子代碼:#include<SoftwareSerial.h>//軟件串口l:TX=數(shù)字引腳一零,RX=數(shù)字引腳一一SoftwareSerialportOne(一零,一一);//軟件串口二:TX=數(shù)字引腳八,RX=數(shù)字引腳九SoftwareSerialportTwo(八,九);voidsetup(){Serial.begin(九六零零);//啟動(dòng)硬件串口portOne.begin(九六零零);//啟動(dòng)兩個(gè)軟件串口portTwo.begin(九六零零);}四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)voidloop(){portOne.listen();if(portOne.isListening()){Serial.println("PortOneislistening!");}else{Serial.println("PortOneisnotlistening!");}if(portTwo.isListening()){Serial.println("PortTwoislistening!");}else{Serial.println("PortTwoisnotlistening!");}}四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(七)overflow()功能:測試軟件串口緩存器是否溢出。調(diào)用該函數(shù)將清除溢出標(biāo)志,再調(diào)用將返回false,除非同時(shí)另一個(gè)字節(jié)已接收并被丟棄。軟件串口緩存器能保存六四個(gè)字節(jié)。語法格式:mySerial.overflow()。參數(shù)說明:無。返回值:boolean。例子:#include<SoftwareSerial.h>SoftwareSerialportOne(一零,一一);voidsetup(){Serial.begin(九六零零); //啟動(dòng)硬件串口portOne.begin(九六零零);}//啟動(dòng)軟件串口voidloop(){if(portOne.overflow())Serial.println("SoftwareSerialoverflow!");}四.八軟件串口及應(yīng)用二.軟件串口地類庫函數(shù)(八)peek()功能:返回軟件串口地RX引腳接收地一個(gè)字符,與read()不同地是:再次調(diào)用該函數(shù)將返回同一字符。注意:同一時(shí)間只有一個(gè)軟串口能接收數(shù)據(jù),用listen()函數(shù)選擇軟串口。語法格式:mySerial.peek()。參數(shù)說明:無。返回值:讀出地字符或-一。例子:SoftwareSerialmySerial(一零,一一);voidsetup(){mySerial.begin(九六零零);}voidloop(){charc=mySerial.peek();}(九)print()與println略四.八軟件串口及應(yīng)用三.軟件串口地應(yīng)用實(shí)例:軟件串口測試。實(shí)現(xiàn)地功能:從硬件串口接收數(shù)據(jù),發(fā)送數(shù)據(jù)給軟件串口。從軟件串口接收數(shù)據(jù),發(fā)送到硬件串口。所需硬件:Arduino板與USB轉(zhuǎn)UART(串口)模塊。USB轉(zhuǎn)換模塊與Arduino連線表Arduino板USB轉(zhuǎn)串口模塊一零(RX)TX一一(TX)RXGNDGND四.八軟件串口及應(yīng)用三.軟件串口地應(yīng)用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打開串口通訊,等待串口打開while(!Serial){;} //等待串口連接Serial.println("Goodnightmoon!");mySerial.begin(四八零零); //設(shè)置軟件串口波特率mySerial.println("Hello,world?");}voidloop(){if(mySerial.available())Serial.write(mySerial.read());if(Serial.available())mySerial.write(Serial.read());}打開IDE下地串口監(jiān)視器與PC端地串口助手,觀察顯示結(jié)果四.八軟件串口及應(yīng)用三.軟件串口地應(yīng)用#include<SoftwareSerial.h>SoftwareSerialmySerial(一零,一一); //RX,TXvoidsetup(){Serial.begin(五七六零零); //打開串口通訊,等待串口打開while(!Serial){;} //等待串口連接
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)期學(xué)習(xí)總結(jié)模板
- 合伙開礦合同
- 2025年舟山b2貨運(yùn)資格證考試題庫
- 《正壓式呼吸器》課件
- 2025年揭陽交通運(yùn)輸從業(yè)資格證怎樣考試
- 2025年烏魯木齊貨運(yùn)從業(yè)資格證考試題庫答案解析大全
- 2025年江西貨運(yùn)從業(yè)資格證考試題目答案及解析
- 2025年蘭州貨運(yùn)從業(yè)資格證考試模擬考試題及答案
- 2025年錫林郭勒盟貨運(yùn)考試題庫
- 《壩上草原風(fēng)光》課件
- 數(shù)字化推動(dòng)下的小學(xué)語文智慧課堂教學(xué)策略
- 異物取出術(shù)知情同意書
- 中國風(fēng)水墨花景演講PPT模板
- 醫(yī)院職工停薪留職申請(qǐng)書2篇
- 腳手架搭設(shè)與使用風(fēng)險(xiǎn)分析及管控措施
- 經(jīng)纖維支氣管鏡氣管插管
- 初中英語??几腻e(cuò)練習(xí)題(共十八類100題附參考答案-解析)
- 爐膛熱力計(jì)算
- 深圳高鐵總部項(xiàng)目遴選方案
- AQ-C1-19 安全教育記錄表(三級(jí))
- 五年級(jí)閱讀指導(dǎo)課(課堂PPT)
評(píng)論
0/150
提交評(píng)論