Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 15

BÀI 3: ĐIỀU KHIỂN KHÔNG

GIỚI HẠN SỐ LED


BÀI 3: ĐIỀU KHIỂN KHÔNG GIỚI HẠN SỐ
LED
Mục tiêu:
- Phân tích được nguyên

hoạt động của IC 595
- Phân tích được lệnh
shiftOut của arduino
-Viết được chương
trình điều khiển nhiều
LED sáng theo hiệu ứng

Lập trình Arduino


3.1. Lý thuyết liên quan – Nguyên lý hoạt động
IC595

Để điều khiển được nhiều không giới hạn số LED, mạch arduino cần kết hợp
với IC 595 hoặc với các IC có đặc tính tương tự.
IC595 là một dạng IC có đặc tính “vào nối tiếp, ra song song”. Người dùng có
thể đưa lần lượt nhiều giá trị logic vào ngõ vào của IC để nó lưu vào bộ nhớ
chờ đến lúc “chốt”. Khi IC được “chốt” thì toàn bộ các bit đã lưu ở bộ nhớ sẽ
được chuyển ra các chân dữ liệu của IC. Giá trị của các chân dữ liệu này sẽ
không bị thay đổi cho đến khi IC được “chốt” lần tiếp theo.

Lập trình Arduino


3.1. Lý thuyết liên quan – Nguyên lý hoạt động
IC595

Các chân từ 1 tới 7 và chân 15 là ngõ ra của IC ứng với Q0, Q1, …, Q7.
Chân DS (14) là ngõ vào của IC.
Chân 16 cấp nguồn dương (2-6VDC), chân 8 GND

Sơ đồ và tác dụng các chân của IC595


Lập trình Arduino
3.1. Lý thuyết liên quan – Nguyên lý hoạt động
IC595

Chân SHCP (11) là chân đưa xung clock (xung nhịp) vào IC. Khi có cạnh lên
của xung thì IC đưa tín hiệu ở ngõ vào (chân DS) tới bộ nhớ của IC để chờ xử
lý. Xung clock là một chuỗi tín hiệu logic 0 và 1 xen kẽ.

Một ví dụ về xung clock điển hình


Bộ nhớ tối đa của IC 595 là 8 bit, nếu vượt quá ngưỡng này thì giá trị mới sẽ
được đưa vào IC và đồng thời giá trị cũ nhất của IC sẽ bị đẩy ra khỏi bộ nhớ tới
chân Q7S (9).

Lập trình Arduino


3.1. Lý thuyết liên quan – Nguyên lý hoạt động
IC595

Chân STCP (12) là chân đưa xung latch (xung chốt) vào IC. Khi có cạnh lên
của xung thì IC đưa toàn bộ 8 bit ở bộ nhớ ra ngõ ra của IC (Q0 tới Q7).

Chân MR là chân reset IC. Khi chân này ở mức logic 0 thì toàn bộ bộ nhớ của
IC sẽ bị xoá về 0. Nhưng điện áp ở các chân ngõ ra vẫn giữ nguyên giá trị.
Chân OE là chân Output Enable. Khi chân này ở mức logic 0 thì các chân ngõ
ra mới có thể thay đổi được trạng thái.

Lập trình Arduino


3.1. Lý thuyết liên quan – Nguyên lý hoạt động
IC595
Giản đồ
thời gian
của IC
595

Lập trình Arduino


3.1. Lý thuyết liên quan – Câu lệnh liên
quan
Phép dịch bit: dịch trái – Bits shift left ( << ) và Dịch phải – Bits shift right ( >> )
Khi dịch một dãy bit A được đánh số từ bit 0 đến bit n, chỉ số của các bit sẽ thay
đổi còn giá trị của mỗi bit sẽ vẫn giữ nguyên. Như vậy giá trị của A sẽ thay đổi.
Khi dịch dãy bit A sang phải n đơn vị tức là chỉ số của mỗi bit trong A sẽ bị trừ
đi n đơn vị. Ngược lại, khi dịch sang trái n đơn vị tức là chỉ số của mỗi bit sẽ
được cộng thêm n đơn vị. Sau khi dịch bit, các bit có chỉ số âm sẽ bị bỏ đi.

Ví dụ:
A = A >> 2; //dịch phải 2
bit A = A << 3; //dịch trái 3
bit Lập trình Arduino
3.1. Lý thuyết liên quan – Câu lệnh liên
quan
shiftOut() có nhiệm vụ chuyển 1 byte (gồm 8 bit) ra ngoài từng bit một. Bit
được chuyển đi có thể được bắt đầu từ bit nằm bên trái nhất (leftmost) hoặc từ
bit nằm bên phải nhất (rightmost). Các bit này được xuất ra tại
chân dataPin sau khi chân clockPin được pulsed (có mức điện thế là HIGH,
sau đó bị đẩy xuống LOW).
Cú pháp: shiftOut(dataPin, clockPin, bitOrder, value);
dataPin: pin sẽ được xuất ra tín hiệu (int)
clockPin: pin dùng để xác nhận việc gửi từng bit của dataPin (int)
bitOrder: một trong hai giá trị MSBFIRST hoặc LSBFIRST.
(Bắt đầu từ bit bên phải nhất hoặc Bắt đầu từ bit bên trái nhất)
Lậpvalue: dữ liệu cần được shiftOut. (byte)
trình Arduino
3.2. Thiết kế sơ đồ nguyên

Sơ đồ
nguyên lý

Lập trình Arduino


3.2. Thiết kế sơ đồ nguyên

đồ

lắp
mạch

trên
bread

board
(bo mạch test)
Lập trình Arduino
3.3. Biên soạn chương
/*shiftOut với 8 LED bằng 1 IC HC595*/ trình
int latchPin = 8; //chân ST_CP của 74HC595
int clockPin = 12; //chân SH_CP của 74HC595
int dataPin = 11; //Chân DS của 74HC595
const int HC595_COUNT = 2; //Nếu có số IC 74595 nhiều hơn thì thay bằng một số lớn hơn 2.
byte ledStatus[HC595_COUNT]= {0}; //Trạng thái của LED, hay chính là byte mà ta sẽ gửi qua shiftOut
void setup() {
pinMode(latchPin, OUTPUT); //BUỘC PHẢI pinMode các chân này là OUTPUT
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void fillValueToArray(byte value) {
for (int i = 0;i < HC595_COUNT; i += 1) {ledStatus[i] = value;}
}
void shiftOutHC595(int dataPin, int clockPin, byte ledStatus[]) {
digitalWrite(latchPin, LOW);
for (int i = 0; i < HC595_COUNT; i++)
{shiftOut(dataPin,clockPin,LSBFIRST,ledStatus[i]); }
digitalWrite(latchPin, HIGH);
}
Lập trình Arduino
3.3. Biên soạn chương
void loop() { trình
fillValueToArray(0); //Đưa giá trị khởi đầu vào mảng
//Led sáng tuần tự
for (int i = 0; i < HC595_COUNT; i++) {
for (byte j=0;j<8;j++) {
ledStatus[i] = (ledStatus[i] << 1) | 1;
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(100); // Dừng chương trình khoảng 500
mili giây để thấy các hiệu ứng của đèn LED
}
}

//Led tắt tuần tự


for (int i = 0; i < HC595_COUNT; i++) {
for (byte j=0;j<8;j++) {
ledStatus[i] = (ledStatus[i] << 1);
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(100); // Dừng chương trình khoảng 500
mili giây để thấy các hiệu ứng của đèn LED
}
} Lập trình Arduino
3.3. Biên soạn chương
//Nhấp nháy nhanh trình
for (byte k = 0; k < 20; k++)
{ fillValueToArray(0b10101010);
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(50);
fillValueToArray(0b01010101);
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(50);
}

//sáng 1 đèn rồi cách 1 đèn ko sáng rồi lại


sáng những đèn chưa bật
fillValueToArray(0);
for (int i = 0; i < HC595_COUNT; i++) {
for (byte j = 0;j<8;j += 2) {
ledStatus[i] |= 1 << j;
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(200);
}
}
Lập trình Arduino
3.3. Biên soạn chương
for (int i = 0; i < HC595_COUNT; i++) { trình
for (int i = HC595_COUNT - 1; i >= 0; i--) {
for (byte j = 1;j<8;j += 2) for (int j = 6;j >= 0;j -= 2) {
{ ledStatus[i] |= 1 << j; ledStatus[i] &= ~(1 << j);
shiftOutHC595(dataPin,clockPin,ledStatus); shiftOutHC595(dataPin,clockPin,ledStatus);
delay(200); delay(200);
} }
} }
//Tắt dần theo thứ tự trên } /// đóng ngoặc của loop()
for (int i = HC595_COUNT - 1; i >= 0; i--) {
for (int j = 7;j >= 0;j -= 2) {
ledStatus[i] &= ~(1 << j);
shiftOutHC595(dataPin,clockPin,ledStatus);
delay(200);
}
}

Lập trình Arduino

You might also like