Arduino基礎入門篇22—74HC595擴充套件IO
Arduino開發板的普通IO引腳是有限的,必要時要對IO口進行擴充套件,才能滿足外部裝置對IO口的需求。本篇介紹74HC595晶片,使用它來擴充套件Arduino的IO口,用3個IO來控制8路LED燈。
1. 74HC595介紹
74HC595晶片是一個序列輸入,並行輸出裝置。其內部包括一個8位移位暫存器、一個儲存器以及三態輸出閘電路,其中移位暫存器和儲存器都有相互獨立的時鐘。

74HC595晶片
1. 引腳說明
74HC595晶片引腳定義說明如下所示:

管腳定義
-
VCC、GND為晶片供電管腳,工作電壓5V。
-
Q0~Q7這8個引腳是晶片的輸出引腳。
-
DS引腳為序列輸入引腳。我們需要將資料一位一位的寫入該引腳。
-
STCP引腳為鎖存引腳。當移位暫存器的8位資料全部傳輸完畢後,通過控制此引腳將資料複製到鎖存器準備並行輸出。
-
SHCP引腳為時鐘引腳。通過控制此引腳將資料寫入移位暫存器。
-
OE引腳為輸出使能。其作用是控制鎖存器裡的資料是否最終輸出到Q0-Q7輸出引腳上。低電平時輸出,高電平時不輸出,本實驗直接接在GND使其一直保持低電平輸出資料。
-
MR是用來重置內部暫存器的引腳。低電平時重置內部暫存器。本實驗直接連線在VCC上一直保持高電平。
-
Q7S引腳為序列輸出引腳,專門用於晶片級聯。
2. 操作說明
根據74HC595引腳說明,有三個重要的引腳:資料引腳(data)、鎖存引腳(latch)、時鐘引腳(clock)。
74HC595操作步驟 | 操作說明 |
---|---|
latch = LOW | 只有為low時才可以輸入資料 |
data | 通過data傳輸資料第一位,HIGH/LOW |
clock = HIGH | 資料鎖存 |
clock = LOW | 準備下一個 |
data… | 繼續上面步驟,直到傳輸完成 |
clock = HIGH | 儲存全部的資料 |
clock = LOW | 禁止資料再進行傳輸 |
latch = HIGH | 並行送出資料 |
2. 實驗材料
- Uno R3開發板
- 配套USB資料線
- 麵包板及配套連線線
- 74HC595晶片
- 8個220Ω限流電阻
- 8個LED發光二極體
3. 實驗步驟
1. 根據原理圖搭建電路。
8個LED發光二極體的負極接開發板GND,正極分別接入220Ω限流電阻,電阻另一端分別接入74HC595晶片的Q0~Q7輸出引腳。
74HC595的VCC、MR引腳接入開發板5V,OE、GND引腳接入開發板的GND。DS、SHCP、STCP這三個控制引腳分別接入開發板的8、9、10數字引腳。
實驗原理圖如下圖所示:

實驗原理圖
實物連線圖如下圖所示:

實物連線圖
2. 新建sketch,拷貝如下程式碼替換自動生成的程式碼並進行儲存。
/* Shift 74HC595擴充套件IO,序列驅動8路LED燈 */ int latchPin = 10;//鎖存引腳 int clockPin = 9; //時鐘引腳 int dataPin = 8; //資料引腳 void setup () { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); //讓三個腳都是輸出狀態 } void loop() { for (int data = 0; data < 255; data++) { digitalWrite(latchPin, LOW); //將ST_CP口上加低電平讓晶片準備好接收資料 shiftOut(dataPin, clockPin, LSBFIRST, data); digitalWrite(latchPin, HIGH); //將ST_CP這個針腳恢復到高電平 delay(1000); //暫停1秒鐘觀看顯示效果 } }
3. 連線開發板,設定好對應埠號和開發板型別,進行程式下載。

程式下載
4. 實驗現象
8個LED燈移位進行亮滅顯示。

實驗現象
5. 函式介紹
shiftOut()
- 描述:將資料在時鐘引腳脈衝控制下按位移出寫入到數字引腳。
- 函式原型:
shiftOut(dataPin, clockPin, bitOrder, value) - 引數:
- dataPin: 資料輸入引腳。
- clockPin: 時鐘引腳。
- bitOrder: 移位順序。MSBFIRST(高位在前)、LSBFIRST(低位在前)。
- value: 需要移位的資料。
- 返回值:沒有。
6. 實驗分析
程式中將74HC595三個控制引腳設定為輸出模式,然後使用shiftOut()函式將資料進行移位寫入74HC595的移位暫存器,然後通過控制鎖存引腳將資料進行鎖存輸出。shiftOut()函式的value引數是一個位元組長度,即每執行一次會將一個位元組(最大值255)進行移位輸出。如果移位的資料大於一個位元組,需要執行兩次shiftOut()函式,例如:
//Do this for MSBFIRST serial int data = 500; // shift out highbyte shiftOut(dataPin, clock, MSBFIRST, (data >> 8)); // shift out lowbyte shiftOut(dataPin, clock, MSBFIRST, data); // Or do this for LSBFIRST serial data = 500; // shift out lowbyte shiftOut(dataPin, clock, LSBFIRST, data); // shift out highbyte shiftOut(dataPin, clock, LSBFIRST, (data >> 8));