37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒於本人手頭積累了一些傳感器和模塊,依照實踐(動手試試)出真知的理念,以學習和交流為目的,這里准備逐一做做實驗,不管能否成功,都會記錄下來---小小的進步或是搞不掂的問題,希望能夠拋磚引玉。
【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗四十七:七段LED數碼管模塊Seven Segment Display
七段數碼管為常用顯示數字的電子元件。因為借由七個發光二極管以不同組合來顯示數字,所以稱為七段數碼管,而七划旁的點為它的“第八划”。一般的七段數碼管擁有八個發光二極管用以顯示十進制0至9的數字,也可以顯示英文字母,包括十六進制和二十進制中的英文A至F(b,d,i為小寫,其他為大寫)。現時大部份的七段數碼管會以斜體顯示。
控制原理
七段數碼管分為共陽極及共陰極,共陽極的七段數碼管的正極(或陽極)為八個發光二極管的共有正極,其他接點為獨立發光二極管的負極(或陰極),使用者只需把正極接電,不同的負極接地就能控制七段數碼管顯示不同的數字。共陰極的七段數碼管與共陽極的只是接駁方法相反而已。七段數碼管已可以特定的集成電路控制,只要向集成電路輸入4-bit的二進制數字訊號就能控制七段數碼管顯示;市面上更有 8421-BCD 代碼直接轉為七划管控制電平的 IC,方便配合單片機使用。
驅動方式
直流驅動------是指每個數碼管的每一個段碼都由一個單片機的I/O端口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動。優點是編程簡單,顯示亮度高,缺點是占用I/O端口多。
動態顯示驅動------是將所有數碼管通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示。將所有數碼管的8個顯示筆划"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是那個數碼管會顯示出字形,取決於單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。
LED數碼管簡易測試方法
一個質量保證的LED數碼管,其外觀應該是做工精細、發光顏色均勻、無局部變色及無漏光等。對於不清楚性能好壞、產品型號及管腳排列的數碼管,可采用下面介紹的簡便方法進行檢測。
1.干電池檢測法。
如圖所示,取兩節普通1.5V干電池串聯(3V)起來,並串聯一個100Ω、1/8W的限流電阻器,以防止過電流燒壞被測LED數碼管。將3V干電池的負極引線(兩根引線均可接上小號鱷魚夾)接在被測數碼管的公共陰極上,正極引線依次移動接觸各筆段電極(a~h腳)。當正極引線接觸到某一筆段電極時,對應筆段就發光顯示。用這種方法可以快速測出數碼管是否有斷筆(某一筆段不能顯示)或連筆(某些筆段連在一起),並且可相對比較出不同的筆段發光強弱是否一致。若檢測共陽極數碼管,只需將電池的正、負極引線對調一下,方法同上。
如果將圖中被測數碼管的各筆段電極(a~h腳)全部短接起來,再接通測試用干電池,則可使被測數碼管實現全筆段發光。對於質量保證的數碼管,其發光顏色應該均勻,並且無筆段殘缺及局部變色等。
如果不清楚被測數碼管的結構類型(是共陽極還是共陰極)和引腳排序,可從被測數碼管的左邊第1腳開始,逆時針方向依次逐腳測試各引腳,使各筆段分別發光,即可測繪出該數碼管的引腳排列和內部接線。測試時注意,只要某一筆段發光,就說明被測的兩個引腳中有一個是公共腳,假定某一腳是公共腳不動,變動另一測試腳,如果另一個筆段發光,說明假定正確。這樣根據公共腳所接電源的極性,可判斷出被測數碼管是共陽極還是共陰極。顯然,公共腳如果接電池正極,則被測數碼管為共陽極;公共腳如果接電池負極,則被測數碼管應為共陰極。接下來測試剩余各引腳,即可很快確定出所對應的筆段來。
2.萬用表檢測法。
這里以MF50型指針式萬用表為例,說明具體檢測方法:首先,按照圖所示,將指針式萬用表撥至“R×10k”電阻擋。由於LED數碼管內部的發光二極管正向導通電壓一般≥1.8V,所以萬用表的電阻檔應置於內部電池電壓是15V(或9V)的“R×10k”擋,而不應置於內部電池電壓是1.5V的 “R×100”或“R×1k”擋,否則無法正常測量發光二極管的正、反向電阻。然后,進行檢測。在測圖5(b)所示的共陰極數碼管時,萬用表紅表筆(注意:紅表筆接表內電池負極、黑表筆接表內電池正極)應接數碼管的“-”公共端,黑表筆則分別去接各筆段電極(a~h腳);對於共陽極的數碼管,黑表筆應接數碼管的“+”公共端,紅表筆則分別去接a~h腳。正常情況下,萬用表的指針應該偏轉(一般示數在100kΩ以內),說明對應筆段的發光二極管導通,同時對應筆段會發光。若測到某個管腳時,萬用表指針不偏轉,所對應的筆段也不發光,則說明被測筆段的發光二極管已經開路損壞。與干電池檢測法一樣,采用萬用表檢測法也可對不清楚結構類型和引腳排序的數碼管進行快速檢測。
LED數碼管使用常識
1.LED數碼管一般要通過專門的譯碼驅動電路,才能正常顯示字符。由於LED數碼管的品種和類型繁多,所以在實際使用時應注意根據電路的不同選擇不同類型的管子。例如,共陰極的LED數碼管,只能接入輸出為高電平的譯碼驅動電路;共陽極的LED數碼管,只能接入輸出為低電平的譯碼驅動電路。動態掃描顯示電路的輸出端,只能接多位動態LED數碼管。
2.各廠家或同一廠家生產的不同型號的LED數碼管,即使封裝尺寸完全相同,其性能和引腳排列有可能大相徑庭。反過來,功能和引腳排列相同的LED數碼管,外形尺寸往往有大有小。所以選用或代換LED數碼管時,只能以它的型號為根據。表3給出了國產BS×××系列LED數碼管與國內外其他同類產品的直接代換型號,可供參考。
3.LED數碼管屬於電流控制型器件,它的發光亮度與工作電流成正比。實際使用時,每段筆划的工作電流取5~15mA(指普通小型管),這樣既可保證亮度適中,延長使用壽命,又不會損壞數碼管。如果在大電流下長期使用,容易使數碼管亮度衰退,降低使用壽命,過大的電流(指超過內部發光二極管所允許的極限值)還會燒毀數碼管。為了防止過大電流燒壞數碼管,在電路中使用時一定要注意給它串聯上合適的限流電阻器。
4.使用LED數碼管時必須注意區分普通亮度數碼管和高亮度數碼管。通常情況下,用高亮度數碼管可以代換現有設備上的普通亮度數碼管,但反過來不能用普通亮度數碼管代換高亮度數碼管。這是因為普通亮度數碼管的發光強度IV≥0.15mcd(毫坎),而高亮度數碼管的發光強度IV≥5mcd,兩者相差懸殊,並且普通亮度數碼管每個筆段的工作電流≥5mA,而高亮度數碼管在大約1mA的工作電流下即可發光。
5.在挑選國產BS×××系列LED數碼管時,應注意產品型號標注的末位編號,以便與譯碼驅動電路等相匹配。通常產品末位數字是偶數的,為共陽極數碼管,如BS206、BS244等;若產品末位數字是奇數,則為共陰極數碼管,如BS205、BS325等。但也有個別產品例外,應注意區分。型號后綴字母 “R”,表示發紅光;后綴字母“G”,表示發綠光;后綴字母“OR”,表示發橙光。
6.小型LED數碼管為一次性產品,即使其中一個筆段的發光二極管在使用中損壞,也只能更換新管。曾見某圖書介紹修復數碼管內部損壞發光二極管的方法,筆者親自動手實踐,發現根本行不通,只會是徒勞的。因為采用環氧樹脂灌封的全密封產品,外殼根本無法打開,強行用刀切割,隨着面板的四分五裂,里面的電路和光導材料早已被破壞得面目全非了。
7.LED數碼管除了常用的“8”字形數碼管以外,較常見的還有圖6所示的“±1”數字管、“N”形管和“米”字管等。其中,“±1”數字管能夠顯示 “+1”和“-1”,以及小數點“.”。“N”形管除了具有“8”字形數碼管的功能外,還能夠顯示字母“N”等。“米”字管功能最全,除顯示數學運算符號 “+”、“-”、“×”、“÷”之外,還可顯示A~Z共26個英文字母,常用作單位符號顯示。
8. LED數碼管的顯示面在出廠時貼有保護膜,在使用時可以撕下來。不要用尖硬物去碰觸顯示面,以免造成划痕等物理損傷,影響顯示效果。焊接小型LED數碼管宜用20W左右的小功率電烙鐵,焊接時間一般不要超過3s,以免燙壞器件本身或線路板。
一位盆友送我的8個數碼管
實驗 接線
在該電路中,七段數碼管的引腳連接到Arduino引腳2-9,如下表所示。公共引腳(引腳3和引腳8)連接到VCC,dp沒有連接,因為此實驗未使用dp。
/* 【Arduino】168種傳感器模塊系列實驗(47) 實驗四十七:七段LED數碼管模塊 之一 在這個實驗中,我們將只需逐段點亮和熄滅關閉LED,來熟悉七段數碼管的工作原理 使用共陽數碼管 */ void setup() { pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(8,OUTPUT); } void loop() { for(int i=2;i<9;i++) { digitalWrite(i,HIGH); delay(600); } for(int i=2;i<9;i++) { digitalWrite(i,LOW); delay(600); } delay(1000); }
/* 【Arduino】168種傳感器模塊系列實驗(47) 實驗四十七:七段LED數碼管模塊 之二 */ #include <reg52.h> #define LONG 50000 #define SHORT 10000 //先定義字形碼,table數組中裝下了自形0到9 unsigned int table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //延時函數 void delay(int i) { while(i--) { } } void main() { int i = 0; while(1) { for(i = 0; i < 10; i++) { P0 = table; delay(LONG); } } }
/* 【Arduino】168種傳感器模塊系列實驗(47) 實驗四十七:七段LED數碼管模塊 之三 */ int pinDigitron = 2; //管腳D2連接到數碼管的A腳,D3連B... D9連h void setup() { for(int x=0; x<8; x++) pinMode(pinDigitron+x, OUTPUT); //設置各腳為輸出狀態 } //在數碼管中顯示數字的函數 void displayDigit(unsigned char digit) { //定義一個數組表:不同數字的abcdefgh各段的取值 unsigned char abcdefgh[][8] = { {1,1,1,1,1,1,0,0}, //0 {0,1,1,0,0,0,0,0}, //1 {1,1,0,1,1,0,1,0}, //2 {1,1,1,1,0,0,1,0}, //3 {0,1,1,0,0,1,1,0}, //4 {1,0,1,1,0,1,1,0}, //5 {1,0,1,1,1,1,1,0}, //6 {1,1,1,0,0,0,0,0}, //7 {1,1,1,1,1,1,1,0}, //8 {1,1,1,1,0,1,1,0}, //9 {1,1,1,0,1,1,1,0}, //A {0,0,1,1,1,1,1,0}, //b {1,0,0,1,1,1,0,0}, //C {0,1,1,1,1,0,1,0}, //d {1,0,0,1,1,1,1,0}, //E {1,0,0,0,1,1,1,0}, //F }; if ( digit >= 16 ) return; for (unsigned char x=0; x<8; x++) digitalWrite( pinDigitron + x, abcdefgh[digit][x] ); } void loop() { //在數碼管中顯示0-9,A-F各個數字 for (int x=0; x<16; x++) { displayDigit(x); //調用displayDigit()子函數,顯示數字 delay(1000); //等待1000毫秒 } }
/* 【Arduino】66種傳感器模塊系列實驗(47) 實驗四十七:七段LED數碼管模塊 之四 */ const int a = 7; //a連接到數字引腳7 const int b = 6; // b連接到數字引腳6 const int c = 5; //c 連接到數字引腳5 const int d = 11; //d連接到數字引腳11 const int e = 10; //e 連接到數字引腳 10 const int f = 8; //f 連接到數字引腳 8 const int g = 9; //g 連接到數字引腳 9 const int dp = 4; //dp 連接到數字引腳 4 void setup() { //從4到11循環,並將它們全部初始化為 輸出 for (int thisPin = 4; thisPin <= 11; thisPin++) { pinMode(thisPin, OUTPUT); } digitalWrite(dp, LOW); //從4到11循環,並將它們全部輸出 } /*********以下為數碼管 1-f 的顯示函數*********/ void digital_1(void) //顯示 1 函數 { digitalWrite(c, HIGH); //數碼管c段為高電平 digitalWrite(b, HIGH); //數碼管b段為高電平 for (int j = 7; j <= 11; j++) //數碼管其余段為低電平 digitalWrite(j, LOW); } void digital_2(void) { digitalWrite(b, HIGH); digitalWrite(a, HIGH); for (int j = 9; j <= 11; j++) digitalWrite(j, HIGH); digitalWrite(c, LOW); digitalWrite(f, LOW); } void digital_3(void) { unsigned char j; digitalWrite(g, HIGH); digitalWrite(d, HIGH); for (j = 5; j <= 7; j++) digitalWrite(j, HIGH); digitalWrite(f, LOW); digitalWrite(e, LOW); } void digital_4(void) { digitalWrite(c, HIGH); digitalWrite(b, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(a, LOW); digitalWrite(e, LOW); digitalWrite(d, LOW); } void digital_5(void) { unsigned char j; for (j = 7; j <= 9; j++) digitalWrite(j, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(b, LOW); digitalWrite(e, LOW); } void digital_6(void) { unsigned char j; for (j = 7; j <= 11; j++) digitalWrite(j, HIGH); digitalWrite(c, HIGH); digitalWrite(b, LOW); } void digital_7(void) { unsigned char j; for (j = 5; j <= 7; j++) digitalWrite(j, HIGH); for (j = 8; j <= 11; j++) digitalWrite(j, LOW); } void digital_8(void) { unsigned char j; for (j = 5; j <= 11; j++) digitalWrite(j, HIGH); } void digital_9(void) { unsigned char j; for (j = 5; j <= 9; j++) digitalWrite(j, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); } void digital_A(void) { unsigned char j; for (j = 5; j <= 10; j++) digitalWrite(j, HIGH); digitalWrite(d, LOW); } void digital_b(void) { unsigned char j; for (j = 7; j <= 11; j++) digitalWrite(j, HIGH); digitalWrite(a, LOW); digitalWrite(b, LOW); } void digital_C(void) { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); } void digital_d(void) { unsigned char j; digitalWrite(a, LOW); digitalWrite(f, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(j, HIGH); for (j = 9; j <= 11; j++) digitalWrite(j, HIGH); } void digital_E(void) { unsigned char j; digitalWrite(b, LOW); digitalWrite(c, LOW); for (j = 7; j <= 11; j++) digitalWrite(j, HIGH); } void digital_F(void) { unsigned char j; digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); for (j = 7; j <= 10; j++) digitalWrite(j, HIGH); } void loop() { digital_1();//顯示1 delay(1000);//延時1秒 digital_2();//顯示2 delay(1000); digital_3();//顯示3 delay(1000); digital_4();//顯示4 delay(1000); digital_5();//顯示5 delay(1000); digital_6();//顯示6 delay(1000); digital_7();//顯示7 delay(1000); digital_8();//顯示8 delay(1000); digital_9();//顯示9 delay(1000); digital_A();//顯示a delay(1000); digital_b();//顯示b delay(1000); digital_C();//顯示c delay(1000); digital_d();//顯示d delay(1000); digital_E();//顯示e delay(1000); digital_F();//顯示f delay(1000); }