STDIO
Tìm kiếm gần đây

    Nội dung

    Arduino Với IC 74HC595

    Nguyên Phan

    15/09/2015
    07/08/2020
    Arduino Với IC 74HC595
    Giới thiệu nguyên tắc hoạt động của IC 74HC595 và cách sử dụng IC 74HC595 với Arduino.

    Giới thiệu

    IC 74HC595 là một IC thông dụng với khả năng dịch bit và ghi nhớ tạm thời 8-bit. Với khả năng đó, IC 74HC595 có khả năng mở rộng số lượng chân vốn đã ít của Board mạch Arduino.

    Chuẩn bị

    • Board mạch Arduino – Arduino Uno
    • 1 breadboard – bảng mạch test
    • Các đèn LED nhỏ số lượng nhiều
    • 2 IC 74HC595
    • 1 con trở nhỏ - 510 Ohm

    Giới thiệu về IC 74HC595

    IC 74HC595 là một IC thông dụng:

    IC 74HC595
    IC 74HC595
    • VCC là chân nối điện cực dương
    • GND là chân nối đất
    • ENABLE là chân có cho phép IC chạy hay không, khi ở trạng thái LOW, IC được phép chạy
    • RESET khi chân này ở trạng thái HIGH, toàn bộ bộ nhớ trong IC bị xóa sạch

    Các chân mà ta quan tâm nhiều nhất:

    • Q0 → Q7 là các chân tượng trưng cho 8 bit trong vùng nhớ của IC
    • INPUT là chân đưa dữ liệu vào IC
    • LATCH khi chân ở trạng thái từ LOW chuyển sang HIGH thì IC xuất dữ liệu từ ô nhớ ra các chân Q0 Q7
    • CLOCK khi có một xung clock (1 lần LOW và một lần HIGH) thì dữ liệu được dịch vào một bit theo trạng thái hiện tại của chân INPUT
    • QH IC có vùng nhớ 8 bit, nếu như truyền vào IC nhiều hơn 8 bit thì sẽ tràn vùng nhớ và bit bị tràn truyền qua QH này

    Giải thích

    Ví dụ nếu ta muốn truyền vào IC 1 byte tương đương 8 bit có giá trị là 5 thì các chân từ Q0 Q7 sẽ có giá trị như sau:

    Với các chân có giá trị 0 tương ứng chân đó có hiệu điện thế là 0v, còn các chân có giá trị 1 sẽ có hiệu điện thế là 5v. Dựa vào đặc tính này ta dễ dàng mở rộng số lượng chân cho Arduino.

    Trong bộ complier mà Arduino cung cấp, ta đã có sẵn hàm shiftOut() để thực hiện thao tác này.

    Hiện thực

    Thử nghiệm

    Các bạn cho lắp các linh kiên nêu trên như sau:

    Các bạn có thể cắm các đèn LED như sau để dễ thao tác:

    Sau đó nối các chân lại với nhau như thiết kế.

    Các chân 5, 6, 7 và nguồn 5v nối từ dây màu đỏ như trên hình, các dây màu đen là chân GND.

    Nối chân như sau:

    • Chân số 5 – INPUT của IC 74HC595
    • Chân số 6 – LATCH của IC 74HC595
    • Chân số 7 – CLOCK của IC 74HC595

    Để IC hoạt động

    • ENABLE - chân GND tức là có giá trị LOW
    • RESET - điện cực dương có hiệu điện thế 5v tức là HIGH
    • Các chân Q0 Q7 tôi nối lần lượt cho 8 bóng đèn LED

    Nếu như một chân bất kỳ có giá trị 1, tức là chân đó có nguồn điện 5v, dòng điện sẽ chênh lệch với dòng điện từ chân dương của LED ở khoảng ~2v. Tuy nhiên khi đó dòng điện này ngược dòng với đèn LED nên đèn sẽ không sáng, còn khi chân của IC có giá trị 0 thì điện thế là 0. Dòng điện đi qua LED là ~3v nên đèn sẽ sáng.

    Vậy với giá trị 1 thì LED tắt, còn giá trị 0 thì LED sáng.

    Code 1

    Nạp vào Arduino và chạy thử.

    #define _clock 7
    #define _latch 6
    #define _data 5
    
    void setup() {
      pinMode(_latch, OUTPUT);
      pinMode(_clock, OUTPUT);
      pinMode(_data, OUTPUT);
    }
    
    void loop() {
      for (int i = 0; i < 256; i++)
      {
        digitalWrite(_latch, LOW);
        shiftOut(_data, _clock, LSBFIRST, i);
        digitalWrite(_latch, HIGH);
        delay(500);
      }
    } 	

    Kết quả

    Giải thích

    Cho lần lượt các con số từ 1 256 tức là các con số trong giới hạn 8 bit để đưa vào Arduino thông qua hàm shiftOut(). Hàm shiftOut() là hàm mà complier Arduino đã hiện thực sẵn, bạn chỉ việc sử dụng lại.

    Chân _latch mỗi lần đưa một dãy bit mới vào IC, phải bật tắt chân _latch một lần vì IC chỉ xuất từ bộ nhớ ra các chân Q0 Q7 khi chân _latch ở trạng thái từ LOW chuyển sang HIGH.

    Hàm shiftOut():

    • Vế 1: chân INPUT của IC 74HC595
    • Vế 2: chân CLOCK của IC 74HC595
    • Vế 3: tượng trưng cho việc bạn dịch bit theo thứ tự chính xác của một số hay đảo chiều
      • LSBFIRST – dịch theo thứ tự chính xác của một số
      • MSBFIRST – theo thứ tự ngược lại

    Ví dụ nếu tôi dịch con số 5 như ví dụ ban đầu thì:

    Thử lại với đoạn code khác

    Ta có đoạn code sau:

    #define _clock 7
    #define _latch 6
    #define _data 5
    
    void setup() 
    {
      pinMode(_latch, OUTPUT);
      pinMode(_clock, OUTPUT);
      pinMode(_data, OUTPUT);
    }
    
    void loop() 
    {
      for (int i = 1; i < 256; i = i << 1)
      {
        digitalWrite(_latch, LOW);
        shiftOut(_data, _clock, LSBFIRST, i);
        digitalWrite(_latch, HIGH);
        delay(1000);
      }
    }

    Đoạn code này không dịch các con số từ 1 256.

    Cho con số i ban đầu là 1 – 0000 0001. Sau mỗi vòng lặp i sẽ dịch bit sang trái 1 lần, vậy tức là với một con số 8 bit, i lần lượt có các giá trị:

    • 0000 0001 - 1
    • 0000 0010 - 2
    • 0000 0100 - 4
    • 0000 1000 - 8
    • 0001 0000 - 16
    • 0010 0000 - 32
    • 0100 0000 - 64
    • 1000 0000 - 128

    Do đó, giới hạn vòng lặp khi i chạm 256 thì dừng.

    Kết quả

    Chồng 2 IC 74HC595

    Như đã đê cập ở trên, vẫn còn 1 chân QH là chân đưa ra các bit bị tràn. Dựa vào điều này, mở rộng được thêm chân nữa tức là 1 con số 16 bit nếu chồng thêm 1 IC lên.

    Ngoài ra có thể chồng nhiều IC hơn nữa theo thứ tự : IC 2 lấy từ QH của IC 1, IC 3 lấy từ QH của IC 2, IC 4 lấy từ QH của IC 3, ….

    Các chân CLOCK và chân LATCH của IC 2 vẫn phải được đảm bảo có giá trị tương đương với các chân CLOCK và chân LATCH của IC1.

    Giả sử cắm mạch như sau:

    Sơ đồ mạch
    Thực tế

    Sử dụng đoạn code

    #define _clock 7
    #define _latch 6
    #define _data 5
    
    #define HC595_count 2
    
    void setup() 
    {
      pinMode(_latch, OUTPUT);
      pinMode(_clock, OUTPUT);
      pinMode(_data, OUTPUT);
    }
    
    void loop() 
    {
      char* temp;
      unsigned int i;
      temp = (char*) &i;
      for( i = 1 ; i < 32768 ; i = i << 1)
      {
        digitalWrite(_latch, LOW);
        for (int j = 0; j < HC595_count; j++)
        {
          shiftOut(_data, _clock, LSBFIRST, *(temp + j));
        }
        digitalWrite(_latch, HIGH);
        delay(1000);
      }
      digitalWrite(_latch, LOW);
      for (int j = 0; j < HC595_count; j++)
      {
        shiftOut(_data, _clock, LSBFIRST, *(temp + j));
      }
      digitalWrite(_latch, HIGH);
      delay(1000);
    }

    Giải thích

    HC595_count là số lượng IC 74HC595 đang dùng.

    Hàm shiftOut() chỉ có thể dịch 1 lần 8 bit. Trường hợp này dùng đến 16 bit (biến 2 bytes) nên khai báo unsigned int.

    Khi i đạt đến giá trị 16.384 - 0100 0000 0000 0000 thì thoát vòng lặp, tiếp tục dịch i qua trái thêm một lần nữa để có giá trị là 32.768 - 1000 0000 0000 0000, để có thể hiển thị đèn cuối cùng.

    Kết quả

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    IC 74HC595N

    IC 74HC595N

    Hướng dẫn sử dụng IC 74HC595N để tạo thêm nhiều chân kết nối các linh kiện.

    Điện Tử Ứng DụngKiến thức & linh kiện

    02/09/2015

    Điều Khiển Động Cơ Bằng IC L298

    Điều Khiển Động Cơ Bằng IC L298

    Hướng dẫn sử dụng IC L298 đã tích hợp sẵn mạch cầu H, ứng dụng trong việc điều khiển cùng lúc 2 động cơ theo chiều quay bất kì, kết hợp với điều xung PWM có thể điều ...

    Điện Tử Ứng DụngĐào tạo & nâng cao

    01/02/2016

    Lập Trình Điều Khiển Đèn LED Với Arduino

    Lập Trình Điều Khiển Đèn LED Với Arduino

    Giới thiệu đèn LED, các lưu ý và sử dụng LED cơ bản với Arduino.

    Điện Tử Ứng DụngKiến thức & linh kiện

    13/10/2014

    Điện Tử Cơ Bản Với Arduino – LED 7 Đoạn

    Điện Tử Cơ Bản Với Arduino – LED 7 Đoạn

    Giới thiệu LED 7 đoạn và code demo sử dụng LED 7 đoạn với Arduino.

    Điện Tử Ứng DụngArduino

    01/09/2015

    Thông Số Kĩ Thuật Arduino Uno R3 - Các Biến Thể Và Lưu Ý

    Thông Số Kĩ Thuật Arduino Uno R3 - Các Biến Thể Và Lưu Ý

    Arduino board có rất nhiều phiên bản với hiệu năng và mục đích sử dụng khác nhau như: Arduino Mega, Arduino Nano, Arduino LilyPad, ... Trong số đó, Arduino Uno R3 là một ...

    Điện Tử Ứng DụngArduino

    13/10/2014

    Đo Khoảng Cách Trong Không Gian Với Cảm Biến SRF05 Và Arduino

    Đo Khoảng Cách Trong Không Gian Với Cảm Biến SRF05 Và Arduino

    Hướng dẫn sử dụng cảm biến sóng siêu âm SRF05 để đo khoảng cách từ vật cản và code mẫu với Arduino.

    Điện Tử Ứng DụngArduino

    29/09/2014

    Điện Tử Cơ Bản với Arduino – Cài Đặt Lần Đầu và Hiện Thực LED Chớp Tắt

    Điện Tử Cơ Bản với Arduino – Cài Đặt Lần Đầu và Hiện Thực LED Chớp Tắt

    Hướng dẫn thực hiện mạch đèn chớp tắt đơn giản với Arduino. Cung cấp các khái niệm cơ bản: HIGH/LOW, các hàm, ...

    Điện Tử Ứng DụngArduino

    12/09/2015

    Cài Đặt Thư Viện Trên Arduino IDE

    Cài Đặt Thư Viện Trên Arduino IDE

    Thư viện trong Arduino chứa các mã nguồn có những đặc điểm chung, được xây dựng thành một gói bao gồm file:examples, .h, .cpp,...Nhằm giúp người sử dụng giải quyết được ...

    Nguyễn Đăng Khánh

    25/02/2016

    Proteus Giả Lập Mạch Arduino Trên Máy Tính

    Proteus Giả Lập Mạch Arduino Trên Máy Tính

    Khi chưa có trong tay bộ "STDIO STARTER KIT V1", mỗi lần nghĩ ra ý tưởng hoặc muốn sáng tạo thứ gì đó với mạch Arduino, tôi thường phải chạy đi mua linh kiện, điều đó vừa ...

    Nguyễn Đăng Khánh

    31/01/2016

    Giới Thiệu Arduino Nano - Cài Đặt Driver CH340G

    Giới Thiệu Arduino Nano - Cài Đặt Driver CH340G

    Giới thiệu board Arduino Nano, các ưu điểm, cài đặt driver CH340 và chương trình mẫu nạp code để test board.

    Điện Tử Ứng DụngArduino

    15/12/2014

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020