IC 74HC595 là một IC thanh ghi dịch có 16 chân bao gồm một chân chốt loại D cùng với một thanh ghi dịch bên trong chip. Nó nhận dữ liệu đầu vào nối tiếp và sau đó gửi dữ liệu này ra ngoài thông qua các chân song song.
Ngoài các đầu ra song song, nó còn cung cấp một đầu ra nối tiếp, nó có các đầu vào xung nhịp riêng lẻ cho thanh ghi dịch và chân chốt D. IC này thuộc họ linh kiện logic HC được thiết kế để sử dụng trong các ứng dụng công nghệ CMOS.
74HC595 có hai thanh ghi tích hợp. Cái đầu tiên là thanh ghi dịch và cái thứ hai là thanh ghi lưu trữ. Dữ liệu được truyền nối tiếp để thay đổi từng bit thanh ghi. Nhưng nó chỉ chuyển vào thanh ghi lưu trữ khi chân chốt dữ liệu được kích ở mức cao.
Nếu bạn tìm các thanh ghi dịch dòng 595, nó có nhiều biến thể và hình dáng có sẵn trên thị trường. Nhưng tất cả đều hoạt động theo cùng một cách, chúng có cấu hình chân cắm, thông số kỹ thuật, sơ đồ chân và nguyên lý làm việc giống nhau. Nhưng hướng dẫn này sẽ tập trung hơn vào SN74HC595N với các công cụ đo texas.
Bây giờ, hãy nhìn vào sơ đồ chân. Dấu nghiêng ~ cho thấy rằng các chân này tích cực mức thấp hoặc kích hoạt ở mức logic âm. Chúng ta sẽ xem xét logic phủ định ở phần sau trong hướng dẫn này.
Liên quan đến các chân đầu ra, vì nó là một thanh ghi dịch 8-bit. SN74HC595N có tám chân đầu ra từ Q0-Q7.
Trong phần này, chúng ta thấy mô tả chân của tất cả các chân cùng với chức năng và hoạt động của chúng:
Chân 01,02,03,04,05,06,07,15 chân đầu ra
Tám chân này là chân đầu ra của thanh ghi dịch. Chúng ta nên kết nối các chân này với các thiết bị ngoại vi mà chúng ta muốn hiển thị dữ liệu ở thanh ghi lưu trữ. Các linh kiện thường được sử dụng như LED, màn hình led bảy đoạn , v.v.
Chân 08: GND
Đây là chân nối đất và được nối với mass của mạch.
Chân 09: Q7’
Nó là đầu ra dữ liệu nối tiếp không đảo ở bit thứ 8 của thanh ghi dịch, nó cũng được sử dụng để kết hợp nhiều IC. Ví dụ, nếu chúng ta cần thanh ghi dịch 16 bit, chúng ta có thể kết nối chuỗi hai IC 74HC595. Để thực hiện việc này, chỉ cần kết nối chân ~ Q7 với chân DS đầu vào nối tiếp của IC 595 thứ hai.
Hơn nữa, cung cấp cùng một tín hiệu xung nhịp cho cả hai mạch tích hợp. Bằng cách này, hai 74HC595 sẽ hoạt động như một thanh ghi dịch 16-bit. Hơn nữa, bạn có thể làm giống như trên để kết nối bao nhiêu IC tùy thích và đạt được số bit dữ liệu mong muốn.
Chân 10: ~MR
Đây là Đầu vào reset không đồng bộ tích cực mức thấp, được sử dụng để đặt lại thanh ghi dịch. Chân chốt 8 bit không bị ảnh hưởng bởi đầu vào. Việc kích tín hiệu mức thấp ở chân 10 sẽ đặt lại giá trị thanh ghi dịch.
Chân 11:SH_CP: SH_CP
Đây là chân đầu vào xung nhịp của thanh ghi dịch 74hc595. Dữ liệu được chuyển từ chân đầu vào nối tiếp sang thanh ghi dịch 8 bit ở mỗi xung cạnh lên của xung nhịp.
Chân 12:ST_CP
Đây là chân đầu vào xung nhịp tích cực mức cao của một thanh ghi lưu trữ. Sự chuyển đổi trạng thái tích cực của tín hiệu tại chân này được sử dụng để đưa dữ liệu vào các chân đầu ra.
Chân 13: ~OE: ~ OE
Chân cho phép đầu ra tích cực mức thấp. Khi chân này ở mức thấp, dữ liệu trong thanh ghi lưu trữ sẽ xuất hiện ở đầu ra. Khi kích tín hiệu mức cao, đầu ra bị ngắt ở trạng thái trở kháng cao. Tuy nhiên, đầu ra nối tiếp không bị ảnh hưởng gì cả. Đối với các trạng thái bình thường, nó được giữ ở mức thấp.
Chân 14: DS
Đây là chân đầu vào dữ liệu nối tiếp, cấp dữ liệu đầu vào.
Chân 16:Vcc
Nguồn điện tích cực được cấp ở chân này.
Bạn có bao giờ tự hỏi, làm thế nào một kỹ sư nhúng điều khiển hàng trăm điốt phát sáng nối tiếp hoặc song song với sự trợ giúp của một bộ vi điều khiển có rất ít chân I / O đa năng? Ngoài ra, Bạn muốn điều khiển nhiều hơn 8 động cơ servo và bạn có 2-3 chân GPIO của một bộ vi điều khiển.
Bạn sẽ giải quyết vấn đề này như thế nào? Bạn điều khiển Ma trận LED có các kích thước khác nhau như 8 × 8, 16 × 16, 32 × 32 như thế nào với các chân GPIO tối thiểu của vi điều khiển? Câu trả lời đơn giản là sử dụng một thanh ghi dịch 74HC595.
Trong hầu hết các ứng dụng, bạn cần nhiều đầu ra hơn cho các đèn LED giao tiếp các thiết bị khác như led bảy đoạn, 16 đoạn, đèn flash LED, v.v. IC này rất tiện lợi để sử dụng.
Để tăng các chân đầu ra, bạn có thể giao tiếp IC này với các vi điều khiển khác nhau như Arduino Uno , PIC Microcontroller, Atmel, v.v. Bạn có thể sử dụng IC này trong việc thiết kế các dự án yêu cầu điều khiển nhiều đầu ra.
Như đã đề cập trước đó, thanh ghi dịch 74HC595 bên trong bao gồm hai thanh ghi là thanh ghi dịch và thanh ghi lưu trữ. Cả hai đều là dữ liệu 8 bit.
Cái đầu tiên chịu trách nhiệm nhận đầu vào dữ liệu khi có xung cạnh tích cực của xung nhịp và nó tiếp tục nhận dữ liệu. Nhưng dữ liệu từ thanh ghi dịch chỉ di chuyển sang thanh ghi lưu trữ khi chúng ta kích tín hiệu mức cao để chốt chân đầu vào.
Quan trọng nhất, Nếu bạn cần ghép nhiều IC với nhau thì chân 9 của IC này được kết nối với chân dữ liệu của thanh ghi IC khác.
Video này mô phỏng hoạt động của thanh ghi dịch 74HC595. Chúng ta sẽ kích các đầu vào nối tiếp khác nhau và kiểm tra đầu ra trên biểu đồ. Đầu tiên, kích đầu vào nối tiếp với dãy bit là 11110000 và xem đầu ra.
Chúng ta bật tín hiệu chốt sau 8 giây vì mỗi bit dữ liệu nối tiếp được gửi đến 74hc595 sau mỗi một giây. Do đó, tổng cộng 8 bit dữ liệu cần 8 × 1 = 8 giây để dịch theo thứ tự.
https://www.youtube.com/watch?v=kYwx-yJ_Q4I
Do đó, chúng ta có thể đưa dữ liệu vào thanh ghi đầu ra sau 8 giây khi tất cả 8 bit được chuyển. Sau đó chúng ta kích các dữ liệu đầu vào khác nhau.
Sau khi bạn đã xem video mô phỏng Proteus, chúng ta nhận được đầu ra phụ thuộc vào đầu vào dữ liệu nối tiếp ngay khi kích tín hiệu chốt sau khi truyền đủ 8 bit dữ liệu.
Trong ví dụ này, chúng ta sẽ biết cách giao tiếp giữa IC thanh ghi dịch 74HC595 với Arduino.
Trong ví dụ này, chúng ta sẽ điều khiển 8 đèn LED sử dụng thanh ghi dịch 74HC595 và Arduino. Để giao tiếp 74HC595 với Arduino, chúng ta sẽ sử dụng ba chân digital. Ba chân này lần lượt là chân xung nhịp, chân dữ liệu và chân chốt.
Như chúng ta đã đề cập trước đó, thanh ghi dịch lấy dữ liệu một bit nối tiếp ở mỗi xung tích cực mức cao của xung nhịp và thanh ghi dịch giữ một bit này.
Để gửi dữ liệu thanh ghi dịch đến thanh ghi đầu ra hoặc các chân đầu ra (Q0-Q7), chúng ta kích hoạt chân chốt bằng cách kích một xung cạnh lên. Do đó, một chân của Arduino sẽ kích tín hiệu chốt.
Bây giờ thực hiện đấu nối Arduino với thanh ghi dịch 74HC595 theo bảng này. Chúng tôi kết nối chân cho phép (~ OE) với đất để kích hoạt IC. Bởi vì nó là một chân tích cực mức thấp.
Chúng ta cũng có thể điều khiển chân này thông qua một chân digital của Arduino. Nhưng để tiết kiệm pin Arduino, tốt hơn hết là bạn nên kích tín hiệu bằng cách kết nối trực tiếp với mass.
Arduino | 74HC595 |
D11 | Xung nhịp thanh ghi đầu ra (Pin12) |
D9 | Xung nhịp thanh ghi dịch (Pin10) |
D12 | Đầu vào dữ liệu(Pin14) |
GND | Đầu ra cho phép (Pin13) |
+ 5V | Reset thanh ghi dịch (Pin10) |
+ 5V | Nguồn (Pin16) |
GND | Đất (Pin8) |
Kết nối tám chân đầu ra với đèn LED thông qua điện trở hạn chế dòng điện. Mạch này sẽ bật tất cả các đèn LED tuần tự với các độ trễ.
Code này dùng để điều khiển các đèn LED với thanh ghi dịch nối tiếp 74HC595.
#define LATCH_pin 11 // (11) ST_CP [RCK] on 74HC595 #define CLCOK_pin 9 // (9) SH_CP [SCK] on 74HC595 #define DATA_pin 12 // (12) DS [S1] on 74HC595 void clock_signal(void){ digitalWrite(CLCOK_pin, HIGH); delayMicroseconds(500); digitalWrite(CLCOK_pin, LOW); delayMicroseconds(500); } void latch_enable(void) { digitalWrite(LATCH_pin, HIGH); delayMicroseconds(500); digitalWrite(LATCH_pin, LOW); } void send_data(unsigned int data_out) { int i; unsigned hold; for (i=0 ; i<8 ; i++) { if ((data_out >> i) & (0x01)) digitalWrite(DATA_pin,HIGH); else digitalWrite(DATA_pin,LOW); clock_signal(); } latch_enable(); // Data finally submitted } void setup() { pinMode(LATCH_pin , OUTPUT); pinMode(DATA_pin , OUTPUT); pinMode(CLCOK_pin , OUTPUT); digitalWrite(LATCH_pin, LOW); // (11) ST_CP [RCK] on 74HC595 digitalWrite(CLCOK_pin, LOW); // (9) SH_CP [SCK] on 74HC595 digitalWrite(DATA_pin, LOW); // (12) DS [S1] on 74HC595 Serial.begin(9600); } void loop() { send_data(0b00000000); delay(1000); send_data(0b10000000); delay(1000); send_data(0b01000000); delay(1000); send_data(0b00100000); delay(1000); send_data(0b00010000); delay(1000); send_data(0b00001000); delay(1000); send_data(0b00000100); delay(1000); send_data(0b00000010); delay(1000); send_data(0b00000001); delay(1000); }
Đầu tiên, chúng ta cần xác định các chân GPIO của vi điều khiển Arduino mà chúng ta sẽ sử dụng làm chân dữ liệu, xung nhịp và chân chốt. Do đó, chúng tôi sử dụng #define để xác định các chân. Chúng tôi đã sử dụng các chân D12, D11 và D9 của Arduino tương ứng với DATA_pin, LATCH_pin và CLCOK_pin.
#define LATCH_pin 11 // (11) ST_CP [RCK] on 74HC595 #define CLCOK_pin 9 // (9) SH_CP [SCK] on 74HC595 #define DATA_pin 12 // (12) DS [S1] on 74HC595
Chức năng tín hiệu xung nhịp ở 74HC494
Đầu tiên, chúng ta khai báo một hàm cấp tín hiệu xung nhịp tới chân ST_CP của thanh ghi dịch 74HC595. Hàm clock_signal () tạo ra tín hiệu xung nhịp với khoảng thời gian 1ms hay có tần số 1KHz.
Vì time-on là 500 micro giây và time-off cũng là 500 micro giây. Chúng tôi đã sử dụng hàm delayMicroseconds () của trình biên dịch Arduino IDE để thêm độ trễ giữa thời gian bật và tắt của xung nhịp.
void clock_signal(void){ digitalWrite(CLCOK_pin, HIGH); delayMicroseconds(500); digitalWrite(CLCOK_pin, LOW); delayMicroseconds(500); }
Hãy nhớ rằng, chúng ta cũng có thể đạt được điều này bằng cách sử dụng bộ PWM của Arduino thông qua giao tiếp SPI. Nhưng để đơn giản hơn, chúng ta sử dụng phương pháp tạo độ trễ để tạo ra tín hiệu xung nhịp.
Như chúng ta đã thấy trước đó, chân đầu vào dữ liệu nối tiếp chuyển dữ liệu 8-bit nối tiếp tới thanh ghi dịch bên trong của 74HC595. Nhưng dữ liệu này không đưa tới các chân đầu ra trừ khi chúng ta áp dụng tín hiệu xung cạnh tích cực trên chân chốt (SH_CP).
Quy trình latch_enable () này cung cấp tín hiệu cho phép chốt. Bất cứ khi nào chúng ta muốn gửi dữ liệu đến các chân đầu ra (Q0-Q7), chúng ta sẽ gọi hàm này trong code.
void latch_enable(void) { digitalWrite(LATCH_pin, HIGH); delayMicroseconds(500); digitalWrite(LATCH_pin, LOW); }
Bây giờ chúng ta đã có tín hiệu xung nhịp và tín hiệu cho phép chốt. Việc chính còn lại bây giờ là xác định tín hiệu kích để truyền dữ liệu 8 bit nối tiếp tới DS_pin của vi mạch 74HC595. Với mục đích này, chúng tôi khai báo một hàm send_data (unsigned int data_out).
void send_data(unsigned int data_out) { int i; unsigned hold; for (i=0 ; i<8 ; i++) { if ((data_out >> i) & (0x01)) digitalWrite(DATA_pin,HIGH); else digitalWrite(DATA_pin,LOW); clock_signal(); } latch_enable(); // Data finally submitted }
Chúng tôi gọi hàm này có dữ liệu 8 bit làm tham số đầu vào như send_data (2). Chúng ta cũng có thể viết send_data (2) hoặc send_data(0b00000010), với cú pháp này có nghĩa là chúng ta truyền tham số ở định dạng nhị phân “send_data (0b00000010)”.
Bên trong hàm send_data (), chúng ta cần gửi dữ liệu 8-bit từng bit một. Vì hàm này nhận dữ liệu 8 bit ở biến data_out. Để gửi dữ liệu 8 bit này theo thứ tự, chúng ta sử dụng toán tử dịch trái và cổng AND logic. Vòng lặp “For” thực thi 8 lần vì có độ dữ liệu 8 bit.
Hơn nữa, chúng ta cũng gọi clock_signal () sau khi gửi Data_pin 1 bit. Bởi vì quá trình chuyển đổi dữ liệu chỉ xảy ra khi có xung cạnh tích cực của xung nhịp. Sau khi chuyển tất cả 8 bit sang thanh ghi dịch, lệnh gọi hàm latch_enable sẽ di chuyển dữ liệu đến các chân đầu ra.
Bắt đầu truyền dữ liệu nối tiếp từ bit có trọng số lớn nhất đến bit có trọng số nhỏ nhất.
Bên trong hàm setup (), chúng tôi khởi tạo các chân digital D12, D11 và D9 làm chân đầu ra digital. Hàm pinMode () được sử dụng để cấu hình các chân vi điều khiển pic là đầu ra hoặc đầu vào.
pinMode(LATCH_pin , OUTPUT); pinMode(DATA_pin , OUTPUT); pinMode(CLCOK_pin , OUTPUT); digitalWrite(LATCH_pin, LOW); // (11) ST_CP [RCK] on 74HC595 digitalWrite(CLCOK_pin, LOW); // (9) SH_CP [SCK] on 74HC595 digitalWrite(DATA_pin, LOW); // (12) DS [S1] on 74HC595
Cuối cùng, để hiển thị, chúng tôi gửi dữ liệu để bật tám đèn LED một cách tuần tự. Bắt đầu từ Q0-Q7. Như bạn có thể thấy từ những dòng code này, ở đầu đoạn code, chúng tôi gửi bit 1 ở bit trong số lớn nhất và tất cả các bit khác bằng không.
Nhưng bit 1 sẽ ở chân Q0 và các bit còn lại của các chân sẽ bằng không. Tương tự, mức logic cao xuất hiện trên các chân khác với độ trễ là 1000ms.
send_data(0b00000000); delay(1000); send_data(0b10000000); delay(1000); send_data(0b01000000); delay(1000); send_data(0b00100000); delay(1000); send_data(0b00010000); delay(1000); send_data(0b00001000); delay(1000); send_data(0b00000100); delay(1000); send_data(0b00000010); delay(1000); send_data(0b00000001); delay(1000);
Trong phần này, chúng ta sẽ tìm hiểu về giao tiếp 74HC595 với màn hình led 7 đoạn và Arduino. Bằng cách sử dụng thanh ghi dịch 74HC595 để điều khiển màn hình 7 led đoạn với Arduino, chúng ta có thể sử dụng các chân GPIO của Arduino.
Trong hướng dẫn cuối cùng về giao diện hiển thị led 7 đoạn với Arduino , chúng ta đã biết là nếu chúng ta giao tiếp trực tiếp với một màn hình led 7 đoạn với Arduino, chúng ta sẽ cần 8 chân digital của Arduino.
Tương tự, nếu chúng ta sử dụng màn hình led bảy đoạn hai chữ số, ba chữ số, bốn chữ số, chúng ta sẽ cần nhiều chân GPIO hơn, ngay cả khi chúng ta sử dụng bộ ghép kênh để tiết kiệm chân vi điều khiển.
Do đó, bằng cách sử dụng thanh ghi dịch nối tiếp 74HC595, chúng ta có thể lưu dữ liệu các chân digital Arduino và có thể sử dụng chúng cho các mục đích khác.
Ví dụ, nếu chúng ta sử dụng IC thanh ghi dịch nối tiếp này, chúng ta có thể giao tiếp led 7 đoạn với Arduino bằng cách chỉ sử dụng ba chân, thay vì sử dụng 8 chân digital.
Sơ đồ này cho thấy kết nối giữa IC thanh ghi dịch, Arduino và led 7 đoạn cathode chung.
Như bạn có thể thấy từ sơ đồ, chúng tôi kết nối 74HC595 với màn hình theo trình tự các chân đầu ra (Q0-Q7) theo bảng sau:
74HC595 | Màn hình led 7 đoạn |
Q0 | A |
Q1 | B |
Q2 | C |
Q3 | D |
Q4 | E |
Q5 | F |
Q6 | G |
Q7 | DP |
Arduino Sketch hiển thị các số từ 0 đến 9 trên 1 màn hình led 7 đoạn với độ trễ là một giây.
#define LATCH_pin 8 // (8) ST_CP [RCK] on 74HC595 #define CLCOK_pin 12 // (12) SH_CP [SCK] on 74HC595 #define DATA_pin 11 // (11) DS [S1] on 74HC595 unsigned char binary_pattern[] = { 0b11111010, 0b01100000, 0b11011100, 0b11110100, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11100110, }; unsigned int counter=0; void clock_signal(void){ digitalWrite(CLCOK_pin, HIGH); delayMicroseconds(500); digitalWrite(CLCOK_pin, LOW); delayMicroseconds(500); } void latch_enable(void) { digitalWrite(LATCH_pin, HIGH); delayMicroseconds(500); digitalWrite(LATCH_pin, LOW); } void send_data(unsigned int data_out) { int i; unsigned hold; for (i=0 ; i<8 ; i++) { if ((data_out >> i) & (0x01)) digitalWrite(DATA_pin,HIGH); else digitalWrite(DATA_pin,LOW); clock_signal(); } latch_enable(); // Data finally submitted } void setup() { pinMode(LATCH_pin , OUTPUT); pinMode(DATA_pin , OUTPUT); pinMode(CLCOK_pin , OUTPUT); digitalWrite(LATCH_pin, LOW); // (11) ST_CP [RCK] on 74HC595 digitalWrite(CLCOK_pin, LOW); // (9) SH_CP [SCK] on 74HC595 digitalWrite(DATA_pin, LOW); // (12) DS [S1] on 74HC595 Serial.begin(9600); } void loop() { send_data(binary_pattern[counter]); counter++; if(counter>9) counter =0; delay(1000); }
Code này hoạt động tương tự như code mà chúng ta đã thảo luận trong phần trước ngoại trừ phần vòng lặp “while”. Đầu tiên, chúng tôi khởi tạo code hiển thị cho màn hình led bảy đoạn loại cathode chung bằng cách sử dụng một mảng.
unsigned char binary_pattern[] = { 0b11111010, 0b01100000, 0b11011100, 0b11110100, 0b01100110, 0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11100110, };
Bên trong vòng lặp while, chúng tôi chuyển các giá trị mã hiển thị số vào hàm send_data () với sự hỗ trợ của biến bộ đếm. Biến đếm tăng 1 sau mỗi giây và được sử dụng để cập nhật hiển thị các giá trị. Khi giá trị bộ đếm bằng 9, chúng tôi reset giá trị bộ đếm về 0.
send_data(binary_pattern[counter]); counter++; if(counter>9) counter =0; delay_ms(1000);
IC này có vô số ứng dụng và được sử dụng trong nhiều sản phẩm như thiết bị ngoại vi máy tính, Thiết bị, v.v. Một vài ứng dụng dưới đây như:
Nó có các dạng package như PDIP, GDIP, PDSO 16 chân. Kích thước của package PDSO được đề cập dưới đây.
>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op
>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j
Mời anh em xem thêm: