![創(chuàng)客教育實(shí)驗(yàn)教程openjumper套件開發(fā)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/4dda57b6-7e95-4c1d-a269-7da7de96e048/4dda57b6-7e95-4c1d-a269-7da7de96e0481.gif)
![創(chuàng)客教育實(shí)驗(yàn)教程openjumper套件開發(fā)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/4dda57b6-7e95-4c1d-a269-7da7de96e048/4dda57b6-7e95-4c1d-a269-7da7de96e0482.gif)
![創(chuàng)客教育實(shí)驗(yàn)教程openjumper套件開發(fā)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/4dda57b6-7e95-4c1d-a269-7da7de96e048/4dda57b6-7e95-4c1d-a269-7da7de96e0483.gif)
![創(chuàng)客教育實(shí)驗(yàn)教程openjumper套件開發(fā)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/4dda57b6-7e95-4c1d-a269-7da7de96e048/4dda57b6-7e95-4c1d-a269-7da7de96e0484.gif)
![創(chuàng)客教育實(shí)驗(yàn)教程openjumper套件開發(fā)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/4dda57b6-7e95-4c1d-a269-7da7de96e048/4dda57b6-7e95-4c1d-a269-7da7de96e0485.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、OPENJUMPER GO 套件入門開發(fā)實(shí)驗(yàn)一:LED_BlinkHello World 是所有編程語言的第一課,不過在Arduino 中,我們的Hello World 叫做Blink。Arduino 提供了很多示例代碼,使用這些示例代碼,我們可以很輕松的開始我們的 Arduino 學(xué)習(xí)之旅。如圖 1-34,你可以在文件菜單>示例>01.Basics>Blink 找到我們要使用的例程,單擊便可打開。打開后你可以看到以下代碼:/*BlinkTurns on an LED on for one second, then off for one second, repeatedly
2、. This example code is in the public domain.*/ 在大多數(shù) Arduino板上 13 號(hào)引腳都連接了一個(gè)標(biāo)有“L”的 LED 燈/ 我們給 13 號(hào)引腳設(shè)置一個(gè)別名“l(fā)ed”O(jiān)PENJUMPER GO 套件入門開發(fā)這些代碼的具體含義,我們會(huì)在下一章進(jìn)行講解。在編譯或制器型號(hào)。該程序前,我們需要先在工具菜單>板卡中選擇你正在使用的 Arduino控接著在工具菜單>串口 中選擇你Arduino器對應(yīng)的串口。在 Windows 系統(tǒng)中,串int led = 13;/ 在板子啟動(dòng)或者復(fù)位重啟后, setup 部分的程序只會(huì)運(yùn)行一次void set
3、up()/ 將“l(fā)ed”引腳設(shè)置為輸出狀態(tài)pinMed, OUTPUT);/setup 部分程序運(yùn)行完后,loop 部分的程序會(huì)不斷重復(fù)運(yùn)行void loop()digitalWrite(led, HIGH);/ 點(diǎn)亮 LED delay(1000);/ 等待一秒鐘digitalWrite(led, LOW);/通過將引腳電平拉低,關(guān)閉 LED delay(1000);/等待一秒鐘OPENJUMPER GO 套件入門開發(fā)口名稱為“COM”加數(shù)字編號(hào),如 COM3。選擇串口時(shí),你需要查看設(shè)備管理器中你的 Arduino對應(yīng)的串。圖 1- 1 選擇串口在 Mac或者 linux 中,串口名稱一般為
4、 /dev/tty.usbmodem 加數(shù)字編號(hào)或OS/dev/cu.usbmodem 加數(shù)字編號(hào)。圖 1- 2 Mac OS 下串口選擇板卡和串口設(shè)置完成后,你可以在 IDE 的右下角看到當(dāng)前設(shè)置的 Arduino及對應(yīng)串口。器型號(hào),OPENJUMPER GO 套件入門開發(fā)接著點(diǎn)擊校驗(yàn)(Verify)按鍵,IDE 會(huì)自動(dòng)檢測程序是否正確,如果程序沒有錯(cuò)誤,調(diào)試提示區(qū)會(huì)依次顯示“編譯程序中”、“編譯完畢”。編譯完成后,你將看到如圖的提示信息。編譯提示“1,084 字節(jié)”為當(dāng)前程序編譯后的大小,括號(hào)中“最大 32,256 字節(jié)”指當(dāng)前器可使用的 Flash 程序空間大小。如果程序有誤,調(diào)試提示區(qū)
5、會(huì)顯示錯(cuò)誤相關(guān)提示。點(diǎn)擊(Upload)按鍵,調(diào)試提示區(qū)會(huì)顯示“編譯程序中”,很快該提示會(huì)變成“中”,此時(shí) Arduino器上標(biāo)有 TX、RX 的兩個(gè) LED 會(huì)快速閃爍,這說明你的程序正在被寫入 Arduino器中。當(dāng)顯示“完畢”時(shí),你會(huì)看到如圖的提示:提示此時(shí),你就可以看到該段程序的效果了板子上的標(biāo)有 L 的 LED 在按你設(shè)定的程序閃爍了。若過程出現(xiàn)其他問題,你可以查閱本書附錄獲取解決方案。接下來我們用面包板和杜邦線將 LED 元件點(diǎn)亮。這里順便提一下什么是發(fā)光二極管發(fā)光二極管簡稱為 LED。由鎵(Ga)與砷(AS)、磷(P)的化合物制成的二極管,當(dāng)電子與空穴復(fù)合時(shí)能輻射出可見光,因而可
6、以用來制成發(fā)光二極管,在電路及儀器中作為指示燈,或者組成文字或數(shù)字顯示。磷砷化鎵二極管 發(fā)紅光,磷化鎵二極管發(fā)綠光,碳化硅二極管發(fā)黃光。它是半導(dǎo)體二極管的一種,可以把電能轉(zhuǎn)化成光能;常簡寫為 LED。發(fā)光 二極管與普通二極管一樣是由一個(gè) PN 結(jié)組成,也具有單向?qū)щ娦?。?dāng)給發(fā)光 二極管加上正向電壓后,從分別與P 區(qū)注入到 N 區(qū)的空穴和由 N 區(qū)注入到 P 區(qū)的電子, 在 PN 結(jié)附近數(shù)微米內(nèi)N 區(qū)的電子和 P 區(qū)的空穴復(fù)合,產(chǎn)生自發(fā)輻射的熒光。不同的半導(dǎo)體材料中電子和空穴所處的能量狀態(tài)不同。當(dāng)電子和空穴復(fù)OPENJUMPER GO 套件入門開發(fā)合時(shí)出的能量多少不同,出的能量越多,則發(fā)出的光的
7、波長越短。常 用的是發(fā)紅光、綠光或黃光的二極管。LED 的工作原理:發(fā)光二極管的反向擊穿電壓約5 伏。它的正向伏安特性曲線很陡,使用時(shí) 必須串聯(lián)限流電阻以通過管子的電流。限流電阻 R 可用下式計(jì)算:R(EVF)I ;式中 E 為電源電壓,VF 為 LED 的正向壓降,I 為 LED 的一般工作電流。發(fā)光二 極管的工作電壓一般為 1.52.0V,其工作電流一般為 1020mA。所以在 5v 的數(shù)字邏輯電路中,可使用 220的電阻作為限流電阻。3、Led 燈的內(nèi)部結(jié)構(gòu)與連線發(fā)光二極管的兩根引線中較長的一根為正極,應(yīng)連接電源正極。有的發(fā)光二極管的兩根引線一樣長,但管殼上有一凸起的小舌,靠近小舌的引線
8、是正極。如示:下圖所Led 燈有兩種連線方法:當(dāng) led 燈的陽極通過限流電阻與板子上的數(shù)字I/O 口相連,led 截止,數(shù)字口輸出高電,led 導(dǎo)通,發(fā)光二極管發(fā)出亮光;數(shù)字口輸出低 電發(fā)光二極管熄滅。如圖:當(dāng) led 燈的陰極與板子上的數(shù)字 I/O 口相連時(shí),數(shù)字口輸出高電平,led 截 止,發(fā)光二極管熄滅;數(shù)字口輸出低電平,led 燈導(dǎo)通,發(fā)光二極管點(diǎn)亮。OPENJUMPER GO 套件入門開發(fā)本實(shí)驗(yàn)選擇了接線方法Shield 擴(kuò)展板上的第 13 個(gè)1 連接發(fā)光二極管,將 220電阻的一端插在 Prototype digital I/O 口,電阻的另一端插在面包板上, 電阻和發(fā)光二極管通
9、過導(dǎo)線相連,發(fā)光二極管的負(fù)端插在面包板上與 GND 相連。一般情況:LED 的長引腳是正極,LED 內(nèi)部電極體積小的是正極(部分紅色 LED 相反)。LED 的電流流向是從正極流向負(fù)極。圖 2.1-4 實(shí)物圖需要 1 個(gè)電阻和 1 個(gè) LED,電阻的阻值范圍是 200 歐姆2K,阻值越大,LED 狀態(tài)下,阻值越大越好。具體連接如圖:亮度越低,選擇標(biāo)準(zhǔn)是在亮度基本相同的一個(gè) led 燈的閃爍實(shí)驗(yàn)(1) 實(shí)驗(yàn)器件Led 燈:1 個(gè)OPENJUMPER GO 套件入門開發(fā)220 的電阻:1 個(gè)多彩面包板實(shí)驗(yàn)跳線:若干(2) 實(shí)驗(yàn)連線按照 Arduino 使用介紹將板、板子、面包板連接好,線插好。最
10、后,按照圖將發(fā)光 管連接到數(shù)字的第 13 引腳。這樣我們就完成了實(shí)驗(yàn)的連 線部分。(3) 實(shí)驗(yàn)原理先設(shè)置數(shù)字 13 引腳為高電平點(diǎn)亮 led 燈,然后延時(shí) 1s,接著設(shè)置數(shù)字 13 引 腳為低電平熄滅 led 燈,再延時(shí) 1s。這樣使 led 燈亮 1s、滅 1s,在規(guī)視上就形 成閃爍狀態(tài)。如果想讓 led 快速閃爍,可以將延時(shí)時(shí)間設(shè)置的小一些,但不能 過小,過小的話人眼就識(shí)別不出來了,看上去就像 led 燈一直在亮著;如果想 讓 led 慢一點(diǎn)閃爍,可以將延時(shí)時(shí)間設(shè)置的大一些,但也不能過大,過大的話 就沒有閃爍的效果了。(4) 程序代碼程序代碼如下:int ledPin=13; /設(shè)定voi
11、d setup()LED 的數(shù)字 IO腳pinMedPin,OUTPUT);/設(shè)定數(shù)字IO 口的模式,OUTPUT 為輸出void loop()digitalWrite(ledPin,HIGH); /設(shè)定 PIN13 腳為 HIGH = 5V 左右delay(1000); /設(shè)定延時(shí)時(shí)間,1000 = 1 秒digitalWrite(ledPin,LOW); /設(shè)定 PIN13 腳為 LOW = 0V delay(1000); /設(shè)定延時(shí)時(shí)間,1000 = 1 秒Arduino 語法是以 setup()開頭,loop()作 為主體的一個(gè)程序極架。setup()是用來初始化發(fā)量,管腳模式,調(diào)用庫
12、函數(shù)等 等,此函數(shù)只運(yùn)行一次。本程序在 setup()中用數(shù)字 IO 口輸入輸出模式定義函 數(shù) pinMode(pin,mode),將數(shù)字的第 13 引腳設(shè)置為輸出模 式。loop()函數(shù)是一個(gè)循環(huán)函數(shù),函數(shù)內(nèi)的語句周而復(fù)始的循環(huán)執(zhí)行,本程序 在 loop()中先用 數(shù)字 IO 口輸出電平定義函數(shù) digitalWrite(pin, value),將數(shù)字 13 口定義為高電平,點(diǎn)亮 led 燈;接著調(diào)用延時(shí)函數(shù) delay(ms)(ms)延 時(shí) 1000ms,讓發(fā)光二極管亮1s;再用數(shù)字 IO 口輸出電平定義函數(shù) digitalWrite(pin, value),將數(shù)字 13 口定義為低電平,
13、熄滅 led 燈;接著再調(diào)用 延時(shí)函數(shù) delay(ms)(ms)延時(shí) 1000ms,讓發(fā)光二極管熄滅 1s。因?yàn)?loop()函數(shù)是一個(gè)循環(huán)函數(shù),所以這個(gè)過程會(huì)不斷的循環(huán)。程序代碼:const int ledPin = 13; / 定義 led 連接的引腳/ led 狀態(tài),亮或者滅,可以修改最后一次的 led 狀態(tài)int ledState = LOW;long previousMillis = 0; /long interval = 1000; / 間隔閃爍的時(shí)間長度void setup()OPENJUMPER GO 套件入門開發(fā)pinMedPin, OUTPUT); / 初始化引腳輸出模式
14、void loop()unsigned long currentMillis = millis();if (currentMillis - previousMillis > interval)previousMillis = currentMillis; / 保存當(dāng)前值,方便下次再次和當(dāng)前時(shí)間比較if (ledState = LOW) / 如果 led 熄滅就把它點(diǎn)亮,反之ledState = HIGH; elseledState = LOW;digitalWrite(ledPin, ledState);第二種閃爍 LED 的方法是用定時(shí)器,這里一段某的中的說明,因?yàn)楣P者也十分贊同并受益
15、,學(xué)習(xí)單片機(jī)和學(xué)習(xí)企業(yè)管理有很多相似的地方!同樣是閃爍 LED 的程序,結(jié)果一樣,但是方法卻不同,到底差別在哪里呢?舉例說明一下:上一個(gè)程序是 CPU工作,這個(gè)程序是 CPU 和定時(shí)器一起工作。一個(gè)人工作和2 個(gè)人協(xié)調(diào)工作的效率是明顯不同的。這個(gè)是他們最大的區(qū)別。單片機(jī)硬件功能越少,說明這個(gè)團(tuán)隊(duì)的可以工作的人越少,反正單片機(jī)功能越多,意味著團(tuán)隊(duì)比較強(qiáng)大。那么同樣一件事情,當(dāng)然是團(tuán)隊(duì)更大的完成的更快、更好,效率更高。但是有個(gè)前提,必須會(huì)管理團(tuán)隊(duì)才可以,不然就是一盤散沙。學(xué)習(xí)單片機(jī)應(yīng)用就是管理一個(gè)團(tuán)隊(duì),把不同的功能融合起來完個(gè)部門工作。顯,想完成成一個(gè)大個(gè)工程,必須分工明確、得力,CPU 就是 C
16、EO,負(fù)責(zé)協(xié)調(diào)各簡單的說,第一個(gè)程序就是一個(gè)人工作,即是又是員工,那么很明的功能,精力是有限的,所以只能處理簡單的功能。第二個(gè)程序有一個(gè)老板和一個(gè)員工,員工負(fù)責(zé)定時(shí)提醒什么時(shí)候做什么事情,相當(dāng)于。只需要在需要的時(shí)候發(fā)出指令,下面的事情由員工老操作,這樣效率就大大提高了。后面會(huì)學(xué)習(xí)到的硬件功能,也就是團(tuán)隊(duì)變得越來越大了,管理的難度也會(huì)隨之增加。在此之前需要把單獨(dú)的功能都學(xué)會(huì)并 能熟練應(yīng)用。LED 什么時(shí)候熄滅什么時(shí)候點(diǎn)亮?只取決于時(shí)間,這個(gè)時(shí)間是定時(shí)器產(chǎn)生 的,單片機(jī)電源引腳加上正確電壓后它就開始工作,不受其他程序影響。CPU 只需要當(dāng)前的時(shí)間并且對比時(shí)間數(shù)據(jù),是否到了 1 秒鐘?如果時(shí)間到,判
17、斷當(dāng)前 LED 的狀態(tài),如 果點(diǎn)亮的就把它熄滅,反之熄滅狀態(tài)則點(diǎn)亮。OPENJUMPER GO 套件入門開發(fā)實(shí)驗(yàn)二:流水燈const int ledCount = 8; / led 總共的個(gè)數(shù)int ledPins = 0,1,2,3,4,5,6,7,; / 對應(yīng)的 led 引腳void setup()for (int thisLed = 0; thisLed < ledCount; thisLed+)OPENJUMPER GO 套件入門開發(fā)edPinsthisLed, OUTPUT); / 循環(huán)設(shè)置,把對應(yīng)的 led 都設(shè)置成輸出pinMvoid loop()for (int num
18、= 0; num < 8; num+) / 熄滅所有 led,不同的電路連接也會(huì)得到點(diǎn)亮所有 leddigitalWrite(ledPinsnum, HIGH);for (int num = 0; num < 8; num+)digitalWrite(ledPinsnum, LOW); / 循環(huán)順序點(diǎn)亮led 然后等待 200ms 后熄滅delay(200); digitalWrite(ledPinsnum, HIGH);首先熄滅所有 LED,然后點(diǎn)亮第 1 個(gè),等待 200ms 熄滅第一個(gè),然后 點(diǎn)亮第 2個(gè),等待 200ms,熄滅第 2 個(gè),依此循環(huán),直到 8 個(gè) LED 都點(diǎn)
19、亮熄滅。周而復(fù)始。8 位 LED 組合能顯示特別多的信息,用戶需要更具實(shí)際需求LED 亮滅。下面 接著講解程序部分,上面的程序不管是 1 位 LED 還是 8 位 LED,都有一個(gè)共同特點(diǎn):都是 輸出功能,在 程序里面初始化的時(shí)候端口的狀態(tài)都應(yīng)該設(shè)置為輸出,這 種 輸出功能是用于其他的設(shè)備。OPENJUMPER GO 套件入門開發(fā)實(shí)驗(yàn)三:指示燈在 8 位 LED 的基礎(chǔ)上加了一個(gè)電位器,電位器的 2 端分別連接到 VCC 和 GND,中間滑動(dòng)端子連接到 A0,轉(zhuǎn)動(dòng)電位器,A0 端的電壓從集這個(gè)變化的電壓信號(hào),然后由單片機(jī)處理后并反映到0VCC 之間變化, 通過單片機(jī)采8 位 LED,當(dāng)電壓最
20、低的時(shí)候LED 全部熄滅,電壓最高的時(shí)候 LED 全部點(diǎn)亮,通過直觀現(xiàn)象反應(yīng)電位器的位置 狀態(tài)。程序部分如下:const int analogPin = A0;/ 模擬輸入/ led 個(gè)數(shù)const int ledCount = 8;int ledPins = 0,1,2, 3, 4, 5, 6, 7, ;/ 對應(yīng)的 led 引腳void setup() for (int thisLed = 0; thisLed < ledCount; thisLed+) pinMedPinsthisLed, OUTPUT); /初始化 8 個(gè)LED 為輸出模式void loop() OPENJUMPE
21、R GO 套件入門開發(fā)電位器的值int sensorReading = analogRead(analogPin);/int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);/ 把對應(yīng)的值轉(zhuǎn)化成 0-最大led 個(gè)數(shù)for (int thisLed = 0; thisLed < ledCount; thisLed+) /遍歷到每個(gè) LEDif (thisLed < ledLevel) digitalWrite(ledPinsthisLed, HIGH);else digitalWrite(ledPinsthisLed, LOW
22、);這里用到 map()函數(shù),簡單的說這個(gè)是數(shù)值變換函數(shù),map 的愿意是地圖,實(shí)際的尺寸 和地圖上的有一個(gè)比例系數(shù),通過這個(gè)函數(shù)會(huì)自動(dòng)計(jì)算比例系數(shù),不用再做復(fù)雜的數(shù)學(xué) 公式。 int LEDLevel = map(sensorReading, 0, 1023, 0, LEDCount); 解讀這個(gè)語句的意思:等號(hào)左邊定義一個(gè) int 變量用來指示 LED 點(diǎn)亮的個(gè)數(shù), ensorReading 是的 A0的模擬量值,這個(gè)值的范圍是 0-1023,因?yàn)?arduino 使用的是 10bitADC。10 位精度的最大值是 2 的 10 次方,1024,在單片機(jī)中是從 0 開始數(shù)而不是 1, 所以
23、最大是1023 。LEDCount 是自定義的 LED 個(gè)數(shù),這里數(shù)值是 8,如果你想用 10 個(gè)或 者LED 來指示電位器狀態(tài),只需要改變預(yù)定義的值。系統(tǒng)會(huì)自動(dòng)計(jì)算比例系數(shù),這樣性反應(yīng)電位器位置變化。這個(gè)函數(shù)在以后的應(yīng)用中非常普遍。20 個(gè)就能線OPENJUMPER GO 套件入門開發(fā)OPENJUMPER GO 套件入門開發(fā)實(shí)驗(yàn)四:串口輸出按鈕狀態(tài)按鍵有很多種類,英文 switch,就是開關(guān),日常生活中經(jīng)常能見到,外觀多種多樣,原理就只一種,一個(gè)按鍵只有 2 種狀態(tài),開或關(guān),和數(shù)字電平1 或者0 一樣的。與arduino 連接的電路圖和實(shí)物圖如下圖。析按鍵部分程序:int pushButto
24、n = 2; /按鈕連接到 2 號(hào)口OPENJUMPER GO 套件入門開發(fā)int led = 13;void setup()Serial.begin(9600); /初始化串口波特率為 9600pinMode(pushButton, INPUT);pinMed, OUTPUT); /把 led 引腳設(shè)置為輸出void loop()輸入引腳的值/int buttonState = digitalRead(pushButton);的數(shù)值且傳遞到給 LED 狀態(tài)digitalWrite(led, buttonState); /Serial.println(buttonState); / 打印結(jié)果到
25、串口/延遲 10 毫秒delay(10);初始化函數(shù)中有一個(gè)語句 Serial.begin(9600); 這個(gè)語句的目的是初始化串口的參數(shù),arduino 內(nèi)部規(guī)定只改變波特率參數(shù),其他的參數(shù)使用通用數(shù)值。如果你需要 和其他的單片機(jī)串口通訊,波特率要一致才可以正常工作,否則會(huì)出現(xiàn)亂碼甚至不能通訊。pinMode(pushButton, INPUT); 設(shè)置端口為輸入模式,用于端口電平。這個(gè)程序的功能是按鍵的電平狀態(tài),然后實(shí)時(shí)的反應(yīng)到LED 并且傳輸?shù)诫娔X串口上。箭頭指向的按鈕是打開 arduino 自帶的串口調(diào)試功能。也可以使用第的調(diào)試軟件,只要參數(shù)設(shè)置一致就可以正確的和電腦通信。在上面的電路
26、圖中我們可以看到一個(gè)電阻連接到按鈕的一腳,這是一個(gè)上拉電阻。在數(shù)字電路中,上拉電阻(英語:Pull-upOPENJUMPER GO 套件入門開發(fā)resistors)是當(dāng)某輸入端口未連接設(shè)備或處于高阻抗的情況下,一種用于保證輸入信號(hào)為預(yù)期邏輯電平的電阻元,在上拉電阻所連接的導(dǎo)線上,如果外部組件未啟用,上拉電阻將“微弱地”將輸 入電壓信號(hào)“拉高”。當(dāng)外部組件未連接時(shí),對輸入端來說,外部“看上去”就是高阻抗的。這時(shí),通過上拉電阻可以將輸入端口處的電壓拉高到高電平。如果外部組件啟用,它將取消上拉電阻所設(shè)置的高電平。通過這樣,上拉電阻可以使引腳即使在未連接外部組件的時(shí)候也能保持確定的邏輯電平。另外的上拉
27、功能則是內(nèi)部上拉,arduino uno R3使用的內(nèi)部其實(shí)有上拉的功能,我們可以使用內(nèi)部的上拉功能替代外部上拉。硬件連接將會(huì)非常簡單。代碼如下:void setup()Serial.begin(9600);/初始化串口并且設(shè)置波特率為 9600pinMode(2, INPUT_PULLUP); /使能 pin2 為輸入,并啟用內(nèi)部上拉功能。pinMode(13, OUTPUT);void loop()int sensorVal = digitalRead(2);/按鍵狀態(tài)值Serial.println(sensorVal);OPENJUMPER GO 套件入門開發(fā)if (sensorVal
28、= HIGH) /按鍵的狀態(tài)digitalWrite(13, LOW); /如果為高電平則點(diǎn)亮 LEDelse digitalWrite(13, HIGH);實(shí)驗(yàn)五:按鍵去抖動(dòng)上面我們已經(jīng)介紹了如何用程序去按鍵的狀態(tài),但到目前為止,我們還不能真正的應(yīng)用按鍵,因?yàn)閱纹瑱C(jī)的速度非常高,us(微秒)級(jí)別,按鍵 屬于機(jī)械結(jié)構(gòu),由于材質(zhì)的不同,按鍵按下和的瞬間,會(huì)出現(xiàn)機(jī)械抖動(dòng),過了抖動(dòng)期才是穩(wěn)定期。這個(gè)很容易理解,一個(gè)人在跑步很快的時(shí)候由于慣性并不能馬上停下來,需要慢慢直到停止。這 種 機(jī)械抖動(dòng)會(huì)對單片機(jī)的識(shí)別造成很大的困擾,實(shí)際上只按了一次按鍵, 單片機(jī)可能檢測的 2次或者,而且次數(shù)是不能確定的,這個(gè)
29、結(jié)果當(dāng)然不是所需要的,既 然存在抖動(dòng),就需要找到一種去除抖動(dòng)的方法,第法是在按鍵 2 端并聯(lián)一個(gè)適當(dāng)?shù)碾?容來消除這些抖動(dòng),但是不同的按鍵需要試驗(yàn)不同的電容參數(shù),那么實(shí)驗(yàn)、研發(fā)過程會(huì)變得 復(fù)雜,效果也不樂觀。所以現(xiàn)在大多采取第二種方法:軟件去抖動(dòng)。上圖看出按鍵按下和松開的瞬間出現(xiàn)機(jī)械抖動(dòng),這個(gè)抖動(dòng)時(shí)間很短,一般 1015ms。不 同按鍵抖動(dòng)頻率和時(shí)間也不同,但對于單片機(jī)卻能非常容易檢測到抖動(dòng)。 但這個(gè)檢測結(jié)果并不最終需要的,實(shí)際上只進(jìn)行一次按鍵操作,但有可能執(zhí)行了多次按 鍵結(jié)果,這就是抖動(dòng)造成的,所以大多數(shù)實(shí)際使用中都使用了按鍵去抖功能。 軟件去抖原理: 1、檢測到按鍵按下后進(jìn)行 1015ms
30、 延時(shí),用于跳過這個(gè)抖動(dòng)時(shí)間段。 2、 延時(shí)后再次檢測按鍵狀態(tài),如果沒有檢測到按鍵按下說明是抖動(dòng)或者干擾造成的,如果 仍舊檢測到按鍵按下,可以認(rèn)為是有效的按鍵狀態(tài),單片機(jī)再進(jìn)行相應(yīng)的操作。 3、 同樣的按鍵后也要進(jìn)行去抖延時(shí),延時(shí)后檢測按鍵是否真正程序部分:const int buttonPin = 2; / 按鍵位置。/ led 位置const int ledPin = 13;/ 當(dāng)前 led 狀態(tài)int ledState = HIGH;OPENJUMPER GO 套件入門開發(fā)的當(dāng)前按鍵狀態(tài)的按鍵狀態(tài)int buttonState;/int lastButtonState = LOW; /
31、上次long lastDebounceTime = 0; / 上次按鍵觸發(fā)時(shí)間/ 去抖時(shí)間,根據(jù)實(shí)際情況調(diào)整long debounceDelay = 50;void setup()pinMode(buttonPin, INPUT); /初始化按鍵edPin, OUTPUT);/初始化 led 的狀態(tài)pinMdigitalWrite(ledPin, ledState); / 初始化 led 的狀態(tài)void loop()按鍵狀態(tài)賦值到一個(gè)變量int reading = digitalRead(buttonPin); /if (reading != lastButtonState) / 如果按鍵狀態(tài)
32、與上一次不同,說明是由于抖動(dòng)還是按鍵按下造成的lastDebounceTime = millis();if (millis() - lastDebounceTime) > debounceDelay)/ 等過了去抖時(shí)間,再次去檢測按鍵的狀態(tài)if (reading != buttonState) / 如果按鍵仍然保持上次的狀態(tài),我們認(rèn)為這個(gè)按鍵按下是真實(shí)有效的buttonState = reading;if (buttonState = HIGH)ledState = !ledState; / 按下按鍵改變當(dāng)前的led 狀態(tài)digitalWrite(ledPin, ledState); /
33、 把 led 的最終結(jié)果到對應(yīng)的引腳lastButtonState = reading; / 保存當(dāng)前值,一邊下一個(gè)循環(huán)檢測的時(shí)候使用OPENJUMPER GO 套件入門開發(fā)使用軟 件去抖動(dòng)之后,按鍵才能穩(wěn)定有效的工作,才真正達(dá)到了實(shí)際應(yīng)用的效果。實(shí)驗(yàn)六:電位器LED 閃爍頻率這個(gè)實(shí)驗(yàn)利用旋轉(zhuǎn)電位器,電位器中間滑動(dòng)端接A0,另外 2 端接 VCC 和 GND,通過旋轉(zhuǎn)電位器,滑動(dòng)端可以得 到 0-VCC 的變化電壓。程序的思路是模擬數(shù)值 0-1023 之間,把這個(gè)值作為延時(shí)函數(shù)的輸入?yún)?shù),延時(shí)LED 的閃爍快慢。的范圍是0-1023ms,通過改變電位器的位置,代碼部分:int sensorPi
34、n = A0;/ 模擬輸入引腳/ led 指示燈引腳int ledPin = 13;int sensorValue = 0; /模擬輸入數(shù)值變量void setup()edPin, OUTPUT);/配置引腳為輸出模式pinMOPENJUMPER GO 套件入門開發(fā)void loop()電位器電壓值sensorValue = analogRead(sensorPin); /digitalWrite(ledPin, HIGH); /點(diǎn)亮 LEDdelay(sensorValue); /延遲一個(gè)時(shí)間,這個(gè)時(shí)間的值是電位器讀到的值digitalWrite(ledPin, LOW); /熄滅 LED/
35、延遲一個(gè)時(shí)間,這個(gè)時(shí)間的值是電位器讀到的值delay(sensorValue);實(shí)驗(yàn)七:PWM 調(diào)光PWM 是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制。它是利用微處理 器的數(shù)字輸出來對模擬電路進(jìn)行的一種非常有效的技術(shù),廣泛應(yīng)用于測量,通信,功率與變換等許多領(lǐng)域。一種模擬方式,根據(jù)相應(yīng)載荷的變化來調(diào)制晶體管 柵極或基極的偏置,來實(shí)現(xiàn)開關(guān)穩(wěn)壓電源輸出晶 體管或晶體管導(dǎo)通時(shí)間的改變,這 種方式能使電源的輸出電壓在工作條件變化時(shí)保持恒定。這里用軟件模擬最簡單的 PWM,頻率不變, 脈沖高電平寬度可以調(diào)節(jié),實(shí)際是調(diào)節(jié) 做功時(shí)間,從而達(dá)到調(diào)節(jié)電壓、電流或者功率等參數(shù)。PWM
36、 在一些情況下可以替代 DAC(數(shù)模轉(zhuǎn)換)功能。所以在 arduino 里面使用函數(shù)analogWrite(); 寫模擬量,arduino 的 PWM 是 8 位,換算成數(shù)字量是 0255 。PWM 使用內(nèi)部自帶的 PWM 發(fā)生器功能,只有在主板上標(biāo)有 PWM 的端口才能使用這個(gè)功能,否則 此函數(shù)寫無效。UNO 的 PWM 端口是 3、5、6、9、10、11 。如下:基本的硬件連接OPENJUMPER GO 套件入門開發(fā)程序部分:int led = 9;/ led 引腳定義,這里需要使用有 PWM 功能的引腳int brightness = 0; / led 亮度int fadeAmount
37、= 5; / 調(diào)節(jié)的單步間隔void setup()pinMed, OUTPUT); / led 引腳定義位輸出void loop()analogWrite(led, brightness); / 設(shè)置了 led 的亮度brightness = brightness + fadeAmount; / 下一個(gè)循環(huán)調(diào)整led 亮度OPENJUMPER GO 套件入門開發(fā)if (brightness = 0 | brightness = 255) / 到最大值后反向調(diào)整fadeAmount = -fadeAmount;delay(30); / 等待 30ms程序功能:從 0 循環(huán)增大 PWM 數(shù)值,到
38、 255 后再循環(huán)減小到 0,如此循環(huán),LED 狀態(tài) 漸漸變亮然后漸漸變暗直到熄滅,然后反復(fù)循環(huán),就像呼吸的狀態(tài)一樣,電器上面的呼吸燈 就是這種方法實(shí)現(xiàn)的。通過把之前學(xué)習(xí)過的 ADC 轉(zhuǎn)換、PWM 調(diào)光功能結(jié)合起來,可以實(shí) 現(xiàn)呼吸燈效果。實(shí)驗(yàn)八:EEPROMEEPROM,非易失性器。單片機(jī)發(fā)展的起始階段,程序的存貯器都是用高壓編程 的,擦除的時(shí)候需要用紫外線長時(shí)間照射。RAM 在掉電后數(shù)據(jù)也丟失了,那個(gè)時(shí)候沒有發(fā) 明EEPROM,所以制造出的設(shè)備都是一樣的,用戶不能根據(jù)的習(xí)慣改變一些使用參數(shù), 只能用廠家設(shè)置?,F(xiàn)在不同了,這種低價(jià)格的復(fù)擦寫功能,EEPROM 就是比普通 FLASH(器到處都有
39、,比如電腦硬盤,SD 卡都有 反單片機(jī)而言)擦寫次數(shù)的一種器,這里面 的數(shù)據(jù)需要經(jīng)常改變,并且要求掉電后不能丟失。現(xiàn)在主流的單片機(jī)都集成EEPROM 功能,只需要通過簡單的指令就可以對其操作。Arduino 內(nèi)部單片機(jī)也同樣有個(gè)功能,下面的樣例不需要連接外部模塊,僅僅靠串口通訊來實(shí)現(xiàn)這個(gè)功能。程序部分:#include <EEPROM.h>了這int address = 0; /設(shè)置byte value;EEPROM 的地址void setup()/初始化串口波特率為 9600Serial.begin(9600);value = EEPROM.read(address);/取出數(shù)據(jù)
40、Serial.print("power on times:"); /顯示開機(jī)次數(shù)/十進(jìn)制顯示數(shù)值/輸出回車換行/對應(yīng)的開機(jī)次數(shù)加 1Serial.print(value, DEC);Serial.println(); value = value + 1;EEPROM.write(address, value);/然后void loop()OPENJUMPER GO 套件入門開發(fā)程序功能用于記憶開關(guān)機(jī)的次數(shù),這里最大值 255,如果沒有 EEPROM 功 能,是沒有辦法記憶開機(jī)次數(shù)的。加入 EEPROM 之后,每次開機(jī)的時(shí)候先把上次的開機(jī)次 數(shù)從EEPROM 讀出來,然后數(shù)值
41、加一,再到 EEPROM,由于單片機(jī)掉電后 EEPROM 的內(nèi)容是保持不變的,這樣就保存了對應(yīng)數(shù)據(jù)。這個(gè)功能非常實(shí)用。Arduino 里面程序集成了相關(guān)函數(shù),只用 2 個(gè)語句就實(shí)現(xiàn)讀寫功能。 EEPROM.read();EEPROM.write(); ,這個(gè)里面有 2 個(gè)參數(shù),第一個(gè)是地址,第二個(gè)是要寫的 數(shù)據(jù)。打個(gè)比方我需要把放到書桌第三個(gè)抽屜里面,就是數(shù)據(jù),書桌的第三個(gè)抽屜就是地址,同樣我需要使用的時(shí)候,就必須到書桌的第三個(gè)抽屜里面再拿出來,如果你 去第一個(gè)或者第二個(gè)抽屜去找,是找不到你放的的,因?yàn)榈刂凡粚Α?程序?qū)嶒?yàn)現(xiàn)象:每次復(fù)位或者開機(jī)后,串口打印出的數(shù)字都是上一次數(shù)值加一,通過這種方
42、式可以方便的看到開機(jī)的次數(shù),如果在時(shí)間內(nèi)統(tǒng)計(jì)次數(shù),可以了解用戶的使用設(shè)備 的頻率。比如你設(shè)計(jì)了一個(gè),當(dāng)開關(guān)次數(shù)超過 1 萬次的時(shí)候則認(rèn)為這個(gè)的開關(guān)達(dá)到極限,不能再繼續(xù)使用,如果繼續(xù)使用可能會(huì)導(dǎo)致很多安全問題。此時(shí)就可以利用這個(gè) EEPROM 記憶功能,當(dāng)開關(guān)次數(shù)達(dá)到 1 萬次后把一些必要的信息反映到顯示屏或者直接切 斷功能等等,用于確保設(shè)備的安全使用。實(shí)驗(yàn)九:串口通訊串口通訊是應(yīng)用非常廣的通訊方式,即便是各種高速通訊接口盛行的今天,串口通訊仍然占有重要的地位。串口通訊適合低速傳輸,通過 RS485 電平轉(zhuǎn)換可以實(shí)現(xiàn)遠(yuǎn)距離傳輸。方式和應(yīng)用相對簡單,適合各種單片機(jī)之間、單片機(jī)與模塊、模塊與模塊直接
43、通訊?,F(xiàn)在主流的 usb、wifi、網(wǎng)口通訊因?yàn)槠湫詢r(jià)比并不適合集成到單片機(jī)內(nèi)部。串口主要的參數(shù)就是波特率,通訊設(shè)備 2 端的波特率相同才能正確通訊。波特率的常用 范圍是 1200115200,更高的波特率對硬件的要求比較高,如果硬件不穩(wěn)定會(huì)造成通訊失敗, 丟包等現(xiàn)象。收發(fā)數(shù)據(jù)的頻率需要取決波特率參數(shù),串口數(shù)據(jù)是順序的,一個(gè)數(shù)據(jù)完成 才能下一個(gè)數(shù)據(jù),速率不對等則會(huì)造成丟包、堵塞。Arduino 串口通訊硬件部分只集成到主板上,測試主板的串口是否正常,最簡單的方式 是主板能否程序,因?yàn)槌绦蚴峭ㄟ^該串口的。UNO 只有 1 個(gè)硬件的串口,如果需 要多個(gè)串口功能則需要使用 arduino 提供的模擬
44、串口樣例。OPENJUMPER GO 套件入門開發(fā)實(shí)驗(yàn)?zāi)繕?biāo):用串口輸出 OPENJUMPER 到屏幕中。代碼部分:void setup()Serial.begin(9600); /初始化串口波特率為 9600void loop()Serial.println("openjumper");delay(1000); /延遲一秒實(shí)驗(yàn)十:數(shù)碼管數(shù)碼管是最常用的顯示器件之一,有使用方法簡單、價(jià)格低廉、亮度高長等優(yōu)點(diǎn)。實(shí)際上就是 8 個(gè) LED 燈用 8 字形的透明陽數(shù)碼管。封裝一起做成的,我們套件中配的是一位共OPENJUMPER GO 套件入門開發(fā)共陽數(shù)碼管是指將所有發(fā)光二極管的陽
45、極接到一起形成公共陽極(COM)的數(shù) 碼管。共陽數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共 PWR 接到電源輸入 PWR 上,當(dāng)某一字段發(fā)光二極管為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的高電,相應(yīng)字段就不亮。下圖為共陰數(shù)碼管。硬件的連接方法:將限流電阻的一端插到數(shù)字 I/O 中,另一端與數(shù)碼管的字段引腳相連,剩下的 六個(gè)字段和一個(gè)小數(shù)點(diǎn)依次按照返種方法接。將公共極 COM 如果是共陽極的就 接到+5V,如果是共陰極的就接到 GND。限流電阻的阻值是 220 歐姆。按照 Arduino將g 段通過限流電阻與數(shù)字的板、面包板連接好,線插好。按數(shù)碼管癿接法 將數(shù)碼管9 引腳相連,f 段 通過限流電阻與數(shù)字 8 引腳相連
46、,共陽極與 5V 插口相連,同樣的接法 a、b 分 別接 7、6 引腳,e、d 分別接 10、11 引腳,第二個(gè)共陽極可以不接,c、DP 分 別接 5、4 引腳,連線完畢。OPENJUMPER GO 套件入門開發(fā)代碼部分:/共陽數(shù)碼管,顯示 0-9 數(shù)字int ledCount = 8;const unsigned char code10 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f;/共陰段碼int ledPins = 0,1,2,3,4,5,6,7,; / 對應(yīng)的 led 引腳void setup()for (in
47、t thisLed = 0; thisLed < ledCount; thisLed+)pinMedPinsthisLed, OUTPUT);/設(shè)置引腳都為輸出狀態(tài)void deal(unsigned char value)/ 數(shù)據(jù)處理,把需要處理的 byte 數(shù)據(jù)寫到對應(yīng)的引腳端口。for (int i = 0; i < 8; i+)digitalWrite(ledPinsi, !bitRead(value, i); /按位取反OPENJUMPER GO 套件入門開發(fā)void loop()for (int i = 0; i < 10; i+)/ 循環(huán)顯示 0-9 數(shù)字dea
48、l(codei); /對應(yīng)的段碼值/延遲一秒delay(1000);實(shí)驗(yàn)十一:74HC59574HC595 是一個(gè) 8 位串行輸入、平行輸出的位移緩存器:平行輸出為三態(tài)輸出。在SCK 的上升沿,單行數(shù)據(jù)由 SDL 輸人到內(nèi)部的 8 位位移緩存器,并由 Q7'輸出,而平行輸出則是在LCK 的上升沿將在 8 位位移緩存器的數(shù)據(jù)存人到 8 位平行輸出緩存器。當(dāng)串行數(shù)據(jù)輸人端 OE 的信號(hào)為低使能時(shí),平行輸出端的輸出值等于平行輸出緩存器所存儲(chǔ)的值。而當(dāng) OE 為高電位,也就是輸出關(guān)閉時(shí),平行輸出端會(huì)維持在高阻抗?fàn)顟B(tài)。這里我們用 它來8 個(gè)LED 小燈。要是單純的用 Arduino8 個(gè)小燈的話
49、需要用 8 個(gè) I/O 口,我們用 74HC595 的目的就是減少I/O 口的使用數(shù)量。用了 74HC595以后,我們可以用 3 個(gè)數(shù)字 I/O 口硬件的連接如下圖所示:8 個(gè) LED 小燈。!OPENJUMPER GO 套件入門開發(fā)代碼部分:const int ON = HIGH; const int OFF = LOW;int latchPin = 5; /定義 D5 接 595 的腳位 12 int clockPin = 4; /定義D4 接 595 的腳位 11 int dataPin = 2; /定義 D2 接 595 的腳位 14/595 的腳位 16 接 5VDC/595 的腳位
50、 8 接 GNDint ledState = 0; void setup()pinMatchPin, OUTPUT);/引腳都為輸出模式pinMode(clockPin, OUTPUT);pinMode(dataPin, OUTPUT);void loop()int delayTime = 100;for (int i = 0; i < 256; i+)updateLEDs(i); delay(delayTime);void updateLEDs(int value)digitalWrite(latchPin, LOW);shiftOut(dataPin, clockPin, MSBFI
51、RST, value); digitalWrite(latchPin, HIGH);void updateLEDsLong(int value)digitalWrite(latchPin, LOW); for (int i = 0; i < 8; i+)int bit = value & B10000000; value = value << 1;if (bit = 128)digitalWrite(dataPin, HIGH);elseOPENJUMPER GO 套件入門開發(fā)digitalWrite(dataPin, LOW);digitalWrite(clockP
52、in, HIGH); delay(1); digitalWrite(clockPin, LOW);digitalWrite(latchPin, HIGH);int bits = B00000001, B00000010, B00000100, B00001000, B00010000, B00100000,B01000000, B10000000;int masks = B11111110, B11111101, B11111011, B11110111, B11101111, B11011111,B10111111, B01111111;void changeLED(int led, int
53、 state)ledState = ledState & masksled; if (state = ON)ledState = ledState | bitsled;updateLEDs(ledState);上傳程序后,我們可以看到 8 個(gè) LED 依次閃爍,實(shí)現(xiàn)了多個(gè) LED 口的。實(shí)驗(yàn)十二:8*8LED 點(diǎn)陣點(diǎn)陣屏在生活中經(jīng)??吹剑诌叺呐?,機(jī)場的候機(jī)屏等等,在這款套件中,配置了一塊 1588BS 8*8 的點(diǎn)陣顯示屏,這一節(jié)顯示器。教大家如何使用Genuino101 驅(qū)動(dòng)這塊點(diǎn)陣Step1:首先需要將硬件與 101 連接起來,點(diǎn)整顯示器的原理圖如下。OPENJUMPER GO 套件入門開發(fā)從正面看,16 個(gè)引腳的編號(hào)如下圖,與原理圖中的PIN 是相互對應(yīng)的。接下來我們需要在輸入電流的引腳上串聯(lián) 220 歐姆電阻,起到限流的作用,如下圖。OPENJUMPER GO 套件入門開發(fā)從 101 的 1 號(hào)引腳依次往下連接到點(diǎn)陣顯示器的 PIN 中,如下如OPENJUMPER GO 套件入門開發(fā)代碼部分:/the pin to control ROWconst int row1 = 2; / the number of the row pin 9 const int row2 = 3; / the number of the ro
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版數(shù)學(xué)七年級(jí)上冊4.3.2《 角的比較與運(yùn)算》聽評課記錄
- 魯教版地理七年級(jí)下冊8.1《自然特征與農(nóng)業(yè)》聽課評課記錄
- 小學(xué)二年級(jí)上冊乘法口算題
- 蘇教版三年級(jí)數(shù)學(xué)上冊口算練習(xí)試題全套
- 集團(tuán)公司戰(zhàn)略合作框架協(xié)議書范本
- 藥店?duì)I業(yè)員聘用合同范本
- 2025年度虛擬現(xiàn)實(shí)游戲配音音效音樂委托協(xié)議
- 2025年度二零二五年度健身工作室門面店轉(zhuǎn)讓合同
- 大連市物業(yè)管理委托合同
- 2025年度咖啡連鎖品牌檔口轉(zhuǎn)讓及運(yùn)營管理合同
- 現(xiàn)代漢語詞匯學(xué)精選課件
- PCB行業(yè)安全生產(chǎn)常見隱患及防范措施課件
- 上海音樂學(xué)院 樂理試題
- SAP中國客戶名單
- DB32∕T 186-2015 建筑消防設(shè)施檢測技術(shù)規(guī)程
- 2022年福建泉州中考英語真題【含答案】
- 汽車座椅骨架的焊接夾具畢業(yè)設(shè)計(jì)說明書(共23頁)
- 露天礦山職業(yè)危害預(yù)先危險(xiǎn)分析表
- 淺談固定資產(chǎn)的審計(jì)
- WZCK-20系列微機(jī)直流監(jiān)控裝置使用說明書(v1.02)
- 模糊推理方法
評論
0/150
提交評論