GIỚI THIỆU
Trong lập trình vi điều khiển và đặc biệt là Arduino, việc hiểu về hệ nhị phân (binary number) là rất quan trọng. Hệ nhị phân là ngôn ngữ cơ bản của máy tính và vi điều khiển, nơi mọi thông tin đều được biểu diễn bằng hai trạng thái: 0 và 1.
Tại sao cần học Binary?
- Hiểu cách vi điều khiển xử lý thông tin
- Làm việc với các thanh ghi (registers) và cờ (flags)
- Tối ưu hóa bộ nhớ và tốc độ xử lý
- Làm việc với các phép toán bitwise
- Điều khiển nhiều chân GPIO cùng lúc
1. HỆ NHỊ PHÂN CƠ BẢN
Định nghĩa:
Hệ nhị phân (binary) là hệ đếm cơ số 2, chỉ sử dụng hai ký tự là 0 và 1 để biểu diễn tất cả các giá trị số. Mỗi chữ số nhị phân được gọi là một "bit" (binary digit).
Chuyển đổi giữa hệ nhị phân và hệ thập phân
| Hệ nhị phân (Binary) | Hệ thập phân (Decimal) | Cách tính |
|---|---|---|
| 0000 | 0 | 0×2³ + 0×2² + 0×2¹ + 0×2⁰ |
| 0001 | 1 | 0×2³ + 0×2² + 0×2¹ + 1×2⁰ |
| 0010 | 2 | 0×2³ + 0×2² + 1×2¹ + 0×2⁰ |
| 0011 | 3 | 0×2³ + 0×2² + 1×2¹ + 1×2⁰ |
| 0100 | 4 | 0×2³ + 1×2² + 0×2¹ + 0×2⁰ |
| 0101 | 5 | 0×2³ + 1×2² + 0×2¹ + 1×2⁰ |
| 0110 | 6 | 0×2³ + 1×2² + 1×2¹ + 0×2⁰ |
| 0111 | 7 | 0×2³ + 1×2² + 1×2¹ + 1×2⁰ |
| 1000 | 8 | 1×2³ + 0×2² + 0×2¹ + 0×2⁰ |
Ví dụ chuyển đổi:
Binary: 1011 → Decimal: 11
Cách tính: 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11
2. BINARY TRONG ARDUINO
Biểu diễn số nhị phân trong code:
Trong Arduino IDE, chúng ta có thể biểu diễn số nhị phân bằng cách thêm tiền tố 0b (hoặc B) trước dãy bit.
// Biểu diễn số nhị phân trong Arduino byte binaryNumber = 0b10101010; // Số nhị phân 10101010 = 170 trong hệ thập phân byte anotherBinary = B00001111; // Số nhị phân 00001111 = 15 trong hệ thập phân // In ra giá trị để kiểm tra Serial.begin(9600); Serial.print("Binary 10101010 in decimal: "); Serial.println(binaryNumber, DEC); // In ra: 170 Serial.print("Binary 00001111 in decimal: "); Serial.println(anotherBinary, DEC); // In ra: 15
3. ĐIỀU KHIỂN NHIỀU LED VỚI BINARY
Một ứng dụng thực tế của binary trong Arduino là điều khiển nhiều LED cùng lúc bằng một byte (8 bit). Mỗi bit đại diện cho trạng thái của một LED.
// Định nghĩa các chân LED kết nối với Arduino const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; const int numLeds = 8; // Hàm thiết lập ban đầu void setup() { // Khởi tạo tất cả chân LED là OUTPUT for (int i = 0; i < numLeds; i++) { pinMode(ledPins[i], OUTPUT); } Serial.begin(9600); } // Hàm điều khiển LED bằng số nhị phân void setLedsFromBinary(byte pattern) { // Duyệt qua từng bit trong pattern for (int i = 0; i < numLeds; i++) { // Kiểm tra bit thứ i có bằng 1 không if (pattern & (1 << i)) { digitalWrite(ledPins[i], HIGH); // Bật LED nếu bit = 1 } else { digitalWrite(ledPins[i], LOW); // Tắt LED nếu bit = 0 } } } // Hàm chính lặp lại void loop() { // Ví dụ: Bật LED ở vị trí chẵn (bit 0, 2, 4, 6) setLedsFromBinary(0b01010101); // 85 trong hệ thập phân delay(1000); // Ví dụ: Bật LED ở vị trí lẻ (bit 1, 3, 5, 7) setLedsFromBinary(0b10101010); // 170 trong hệ thập phân delay(1000); // Tất cả LED sáng setLedsFromBinary(0b11111111); // 255 trong hệ thập phân delay(1000); // Tất cả LED tắt setLedsFromBinary(0b00000000); // 0 trong hệ thập phân delay(1000); }
4. CÁC PHÉP TOÁN BITWISE TRONG ARDUINO
Arduino hỗ trợ các phép toán bitwise để thao tác trực tiếp với các bit của số nhị phân:
| Toán tử | Tên | Ví dụ | Kết quả | Mô tả |
|---|---|---|---|---|
| & | AND | 0b1100 & 0b1010 | 0b1000 | Bit kết quả = 1 nếu cả hai bit cùng là 1 |
| | | OR | 0b1100 | 0b1010 | 0b1110 | Bit kết quả = 1 nếu ít nhất một bit là 1 |
| ^ | XOR | 0b1100 ^ 0b1010 | 0b0110 | Bit kết quả = 1 nếu hai bit khác nhau |
| ~ | NOT | ~0b1100 | 0b0011 | Đảo ngược tất cả các bit (0 thành 1, 1 thành 0) |
| << | Left Shift | 0b0001 << 2 | 0b0100 | Dịch trái các bit |
| >> | Right Shift | 0b0100 >> 2 | 0b0001 | Dịch phải các bit |
// Ví dụ về các phép toán bitwise byte a = 0b11001100; // 204 byte b = 0b10101010; // 170 // Phép AND byte resultAnd = a & b; // 0b10001000 = 136 // Phép OR byte resultOr = a | b; // 0b11101110 = 238 // Phép XOR byte resultXor = a ^ b; // 0b01100110 = 102 // Phép dịch trái byte resultLeftShift = a << 2; // 0b00110000 = 48 (tràn bit) // Phép dịch phải byte resultRightShift = a >> 2; // 0b00110011 = 51
BÀI TẬP THỰC HÀNH
Yêu cầu:
Sử dụng kiến thức về hệ nhị phân và phép toán bitwise, hãy viết chương trình Arduino thực hiện các tác vụ sau:
- Kết nối 4 LED với các chân 5, 6, 7, 8 của Arduino
- Viết hàm hiển thị số đếm từ 0 đến 15 (0-1111 trong nhị phân) trên 4 LED này
- Sử dụng phép toán bitwise để xác định trạng thái của từng LED
- Mỗi số hiển thị trong 1 giây trước khi chuyển sang số tiếp theo
Gợi ý:
- Sử dụng vòng lặp for từ 0 đến 15
- Với mỗi số i, sử dụng phép toán AND với mask để kiểm tra từng bit
- Ví dụ: để kiểm tra bit thứ 0, dùng (i & 0b0001)
- Để kiểm tra bit thứ 1, dùng (i & 0b0010)
- Tương tự cho các bit tiếp theo