Có những khả năng trong thiết kế nhúng mà bạn không có đủ chân I / O trong bộ vi điều khiển của mình. Điều đó có thể là do bất kỳ lý do nào, có thể là ứng dụng của bạn cần nhiều đèn LED hoặc bạn muốn sử dụng nhiều màn hình 7 đoạn, nhưng bạn không cần có chân I / O trong bộ vi điều khiển của mình. Ở đây có một thành phần hoàn hảo, thanh ghi dịch chuyển. Thanh ghi Shift chấp nhận dữ liệu nối tiếp và đưa ra đầu ra song song. Nó chỉ yêu cầu 3 chân để kết nối với bộ vi điều khiển của bạn và bạn sẽ nhận được hơn 8 chân Đầu ra từ nó. Một trong những thanh ghi ca phổ biến là 74HC595. Nó có 8 thanh ghi lưu trữ chút và 8 bit đăng ký thay đổi. Tìm hiểu thêm về sổ đăng ký ca tại đây.
Bạn sẽ cung cấp dữ liệu nối tiếp cho thanh ghi ca và nó sẽ được chốt trên thanh ghi lưu trữ và sau đó thanh ghi lưu trữ sẽ điều khiển 8 đầu ra. Nếu bạn muốn nhiều đầu ra hơn, chỉ cần thêm một thanh ghi dịch chuyển khác. Bằng cách xếp tầng hai thanh ghi dịch chuyển, bạn sẽ nhận được thêm 8 đầu ra, tổng đầu ra 16bit.
Đăng ký Shift 74HC595:
Đây là sơ đồ chân ra của 74HC595 theo biểu dữ liệu-
HC595 có 16pins; nếu chúng ta xem biểu dữ liệu, chúng ta sẽ hiểu các hàm pin-
Các QA để QH, từ số pin 1-7 và 15 sử dụng như 8 đầu ra chút từ thanh ghi dịch, trong khi đó pin 14 được sử dụng để nhận dữ liệu nối tiếp. Ngoài ra còn có bảng sự thật về cách sử dụng các chân khác và tận dụng các chức năng khác của thanh ghi shift.
Khi chúng tôi viết mã để giao tiếp 74HC595, chúng tôi sẽ áp dụng bảng sự thật này để nhận được kết quả đầu ra mong muốn.
Bây giờ, chúng ta sẽ giao diện 74HC595 với PIC16F877A và điều khiển 8 đèn LED. Chúng tôi đã giao tiếp thanh ghi dịch chuyển 74HC595 với các bộ vi điều khiển khác:
- Giao diện 74HC595 Đăng ký dịch chuyển nối tiếp với Raspberry Pi
- Làm thế nào để sử dụng Shift Register 74HC595 với Arduino Uno?
- Giao diện LCD với NodeMCU bằng thanh ghi shift
Các thành phần bắt buộc:
- PIC16F877A
- 2 cái tụ đĩa gốm 33pF
- Tinh thể 20Mhz
- Điện trở 4,7k
- 8 cái đèn LED
- Điện trở 1k -1 cái (yêu cầu 8 điện trở 1k nếu cần điện trở riêng biệt trên mỗi đèn led)
- 74HC595 ic
- Bộ chuyển đổi tường 5V
- Môi trường lập trình PIC
- Bảng mạch và dây
Sơ đồ mạch:
Trong sơ đồ mạch, chúng tôi đã kết nối chân dữ liệu nối tiếp; xung nhịp và chốt (chốt) lần lượt trên chân RB0, RB1 và RB2 của vi điều khiển. Ở đây chúng tôi đã sử dụng một điện trở cho 8 đèn LED. Theo bảng sự thật, chúng tôi đã kích hoạt đầu ra bằng cách kết nối chân 13 của 74HC595 với mặt đất. Các QH pin còn lại mở như chúng tôi sẽ không thác khác 74HC595 với nó. Chúng tôi đã vô hiệu hóa cờ đầu vào rõ ràng bằng cách kết nối chân 10 của thanh ghi dịch chuyển với VCC.
Bộ tạo dao động Crystal được kết nối trên các chân OSC của vi điều khiển. PIC16F877A không có bất kỳ bộ dao động bên trong nào. Trong dự án này, chúng tôi sẽ chiếu sáng led lần lượt từ Q0 đến Q7 bằng cách sử dụng shift regitster.
Chúng tôi đã xây dựng mạch trong một breadboard-
Giải thích mã:
Mã hoàn chỉnh để điều khiển đèn LED với thanh ghi shift được đưa ra ở cuối bài viết. Như mọi khi, chúng ta cần thiết lập các bit cấu hình trong vi điều khiển PIC.
#pragma cấu hình FOSC = HS // bit Oscillator Selection Tool (HS dao động) #pragma cấu hình WDTE = OFF // Watchdog Timer Enable bit (WDT vô hiệu hóa) #pragma cấu hình PWRTE = OFF // Power-up Hẹn giờ Enable bit (PWRT vô hiệu hóa) # pragma config BOREN = ON // Brown-out Reset bit Enable (bật BOR) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming bit (chân RB3 / PGM có chức năng PGM; low -có bật lập trình điện áp) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Ghi bảo vệ tắt; tất cả bộ nhớ chương trình có thể là được viết bởi EECON control) #pragma config CP = OFF // Bit Bảo vệ Mã Bộ nhớ Chương trình Flash (Tắt Bảo vệ Mã)
Sau đó, chúng tôi khai báo tần số tinh thể cần thiết cho độ trễ và khai báo pin-out cho 74HC595.
#include
Tiếp theo chúng ta khai báo hàm system_init () để khởi tạo hướng chân.
void system_init (void) { TRISB = 0x00; }
Chúng tôi đã tạo xung đồng hồ và xung chốt bằng hai chức năng khác nhau
/ * * Chức năng này sẽ bật Đồng hồ. * / đồng hồ void (void) { CLK_595 = 1; __delay_us (500); CLK_595 = 0; __delay_us (500); }
và
/ * * Chức năng này sẽ nhấp nháy và cho phép kích hoạt đầu ra. * / void strobe (void) { STROBE_595 = 1; __delay_us (500); STROBE_595 = 0; }
Sau hai hàm này, chúng tôi khai báo hàm data_submit (dữ liệu int không dấu) để gửi dữ liệu nối tiếp đến 74HC595.
void data_submit (unsigned int data) { for (int i = 0; i <8; i ++) { DATA_595 = (data >> i) & 0x01; đồng hồ(); } strobe (); // Dữ liệu cuối cùng đã được gửi }
Trong hàm này, chúng tôi chấp nhận dữ liệu 8 bit và gửi từng bit bằng cách sử dụng hai toán tử bitwise shift trái và toán tử AND. Đầu tiên, chúng tôi chuyển dữ liệu từng cái một và tìm ra bit chính xác xem nó là 0 hay 1 bằng cách sử dụng toán tử AND với 0x01. Mỗi dữ liệu được lưu trữ bằng xung đồng hồ và đầu ra dữ liệu cuối cùng được thực hiện bằng cách sử dụng chốt hoặc xung nhấp nháy. Trong quá trình này, đầu ra dữ liệu sẽ là MSB (Bit quan trọng nhất) đầu tiên.
Trong chức năng chính, chúng tôi đã gửi nhị phân và làm cho các chân đầu ra cao từng chân một.
system_init (); // Hệ thống chuẩn bị sẵn sàng while (1) { data_submit (0b00000000); __delay_ms (200); data_gửi (0b10000000); __delay_ms (200); data_gửi (0b01000000); __delay_ms (200); data_gửi (0b00100000); __delay_ms (200); data_gửi (0b00010000); __delay_ms (200); data_gửi (0b00001000); __delay_ms (200); data_gửi (0b00000100); __delay_ms (200); data_gửi (0b00000010); __delay_ms (200); data_gửi (0b00000001); __delay_ms (200); data_gửi (0xFF); __delay_ms (200); } trở lại; }
Đó là cách một thanh ghi dịch chuyển có thể được sử dụng để có thêm các chân I / O miễn phí trong bất kỳ bộ vi điều khiển nào để kết nối nhiều cảm biến hơn.