Cổng logic và IC 74HC: bảng sự thật, đại số Boole, thử IC bằng ESP32
Cổng logic NOT, AND, OR, NAND, NOR, XOR và bảng sự thật, mức điện áp logic của 74HC, đại số Boole, định luật De Morgan, cổng NAND vạn năng, IC 74HC và thí nghiệm ESP32 tự đoán loại cổng.
Mọi máy tính, kể cả con chip ESP32, cuối cùng đều được ghép từ những mạch rất đơn giản chỉ hiểu hai trạng thái 0 và 1: các cổng logic. Bài viết giải thích các cổng NOT, AND, OR, NAND, NOR, XOR qua ký hiệu và bảng sự thật, mức điện áp nào được hiểu là 0 hay 1, vài quy tắc của đại số Boole (gồm định luật De Morgan), vì sao chỉ cần cổng NAND là ghép được mọi cổng khác, các IC họ 74HC thường gặp, rồi làm thí nghiệm: ESP32 cấp đủ bốn tổ hợp vào một cổng, lập bảng sự thật và tự đoán đó là cổng gì.
1. Cổng logic và bảng sự thật

Cổng logic là mạch có một hoặc vài đầu vào và một đầu ra, mỗi chân chỉ ở một trong hai trạng thái: 0 (mức thấp, gần 0 V) hoặc 1 (mức cao, gần VCC). Cách cổng biến đổi đầu vào thành đầu ra được ghi trọn trong một bảng sự thật: mỗi dòng là một tổ hợp đầu vào, cột cuối là đầu ra. Cổng hai đầu vào có 2 × 2 = 4 dòng.

- NOT (cổng đảo): một đầu vào, ra ngược lại.
- AND: ra 1 chỉ khi tất cả đầu vào là 1. Giống hai công tắc mắc nối tiếp: đèn chỉ sáng khi cả hai cùng đóng.
- OR: ra 1 khi có ít nhất một đầu vào là 1. Giống hai công tắc mắc song song (cách mắc nối tiếp, song song ở bài 4).
- NAND, NOR: AND, OR rồi đảo. Vòng tròn nhỏ ở ngõ ra ký hiệu cho phép đảo.
- XOR (hoặc loại trừ): ra 1 khi hai đầu vào khác nhau. Dùng để so sánh hai bit, làm phép cộng nhị phân, đảo bit có điều kiện. XNOR thì ngược lại: ra 1 khi giống nhau.
Bên trong, mỗi cổng CMOS là vài transistor MOSFET (bài 20) làm công tắc: cổng NOT chỉ cần một MOSFET kênh P và một MOSFET kênh N, cổng NAND cần bốn.
2. Mức logic là các dải điện áp

- Đầu vào không cần đúng 0 V hay 3,3 V: với 74HC nuôi 3,3 V, từ khoảng 2,31 V trở lên được hiểu là 1, từ khoảng 0,99 V trở xuống là 0. Giữa hai mức là vùng không xác định: cổng có thể hiểu sai, và cả hai transistor bên trong cùng dẫn một phần làm IC tốn điện, nóng.
- Ngõ ra luôn đẩy hẳn về gần 0 V hoặc gần VCC. Nhờ vậy tín hiệu đi qua nhiều cổng vẫn "sạch", nhiễu nhỏ trên đường đi bị loại bỏ ở mỗi tầng.
- Đầu vào CMOS để hở không phải mức 0: nó trôi theo nhiễu, có thể nằm trong vùng không xác định. Luôn nối đầu vào không dùng xuống GND hoặc lên VCC, hoặc qua điện trở kéo lên, kéo xuống (giống nút nhấn ở bài 14).
- Cùng một ý: chân GPIO của ESP32 cũng có ngưỡng như vậy; đó là lý do tín hiệu 5 V không được đưa thẳng vào ESP32, còn tín hiệu 3,3 V của ESP32 đưa vào IC 5 V có thể không đủ mức 1. Họ 74HCT nuôi 5 V nhưng nhận mức 1 từ 2,0 V, hay dùng làm mạch chuyển mức từ 3,3 V lên 5 V (ví dụ cho dải LED WS2812).
3. Đại số Boole và định luật De Morgan

Đại số Boole là phép tính chỉ có hai giá trị 0 và 1, dùng dấu · cho AND, dấu + cho OR. Vài quy tắc nhìn là thấy đúng nếu thử với bảng sự thật: A · 0 = 0, A · 1 = A, A + 1 = 1, A + 0 = A. Quan trọng nhất là định luật De Morgan:
- NOT (A · B) = (NOT A) + (NOT B): "không phải cả hai đều đúng" nghĩa là "ít nhất một cái sai".
- NOT (A + B) = (NOT A) · (NOT B): "không có cái nào đúng" nghĩa là "cả hai đều sai".
Hệ quả: chỉ cần cổng NAND là ghép được mọi cổng khác. Nối chung hai đầu vào của NAND được cổng NOT; NAND rồi NOT được AND; đảo từng đầu vào rồi đưa vào NAND, theo De Morgan, được OR. Cổng NOR cũng có tính chất vạn năng như vậy. Trong thực tế, đây là cách tận dụng cổng thừa trong một IC: mạch cần một cổng NOT mà IC 74HC00 còn dư một cổng NAND thì dùng luôn, không phải thêm IC.
Đại số Boole cũng dùng thẳng trong chương trình: biểu thức !(a && b) trong C viết lại được thành !a || !b, giúp điều kiện if dễ đọc hơn.
4. IC họ 74HC

- 74HC là họ IC logic CMOS phổ biến nhất hiện nay: nguồn 2–6 V, chạy tốt ở 3,3 V cùng ESP32, tốc độ đổi mức vài chục nano giây, gần như không tốn điện khi đứng yên. Họ 74LS cũ hơn (TTL lưỡng cực) cần đúng 5 V và tốn điện hơn.
- Hai số cuối là chức năng, giống nhau giữa các họ: 7400, 74LS00, 74HC00 đều là bốn cổng NAND (cách đọc mã IC ở bài 23).
- 74HC00, 08, 32, 86 cùng sơ đồ chân: cổng 1 vào chân 1, 2, ra chân 3. 74HC02 khác: ngõ ra ở chân 1, đầu vào ở chân 2, 3.
- 74HC14 là cổng NOT có trễ (Schmitt trigger): đầu vào thay đổi chậm hoặc có nhiễu, ngõ ra vẫn lật dứt khoát. Hay dùng để làm sạch tín hiệu nút nhấn, cảm biến.
5. Thí nghiệm: ESP32 lập bảng sự thật và đoán loại cổng
ESP32 đóng vai bộ thử IC: lần lượt đặt bốn tổ hợp (A, B) = 00, 01, 10, 11 vào cổng 1 của IC, đọc ngõ ra, ghép thành bảng sự thật rồi so với bảng của sáu loại cổng hai đầu vào.
Chuẩn bị
- ESP32 DevKit V1, breadboard, dây cắm.
- Một hoặc vài IC 74HC00, 74HC08, 74HC32, 74HC86 vỏ DIP-14; tụ gốm 100 nF.
Sơ đồ nối

- IC cắm vắt qua rãnh giữa breadboard, khấc sang trái. Nuôi IC bằng 3,3 V của ESP32 để mức ra của IC vừa với chân GPIO.
- Sáu đầu vào của ba cổng còn lại (chân 4, 5, 9, 10, 12, 13) nối GND. Ngõ ra của chúng (chân 6, 8, 11) để trống.
- Muốn thử 74HC02 thì đổi dây: GPIO26 vào chân 2, GPIO27 vào chân 3, chân 1 về GPIO32.
Chương trình
/*
PYWORLD.VN - Thử cổng logic 74HC bằng ESP32: lập bảng sự thật của một cổng hai đầu vào và tự đoán loại cổng
IC 74HC00/08/32/86 nuôi 3,3 V: GPIO26 vào chân 1 (A), GPIO27 vào chân 2 (B), chân 3 (Y) về GPIO32
Các đầu vào của ba cổng còn lại nối GND; tụ 100 nF giữa chân 14 (VCC) và chân 7 (GND)
*/
#define CHAN_A 26
#define CHAN_B 27
#define CHAN_Y 32
// Bảng sự thật viết thành 4 bit: bit i là Y khi (A, B) = (i / 2, i % 2)
const char *TEN_CONG[] = {"AND", "OR", "NAND", "NOR", "XOR", "XNOR"};
const char *VI_DU_IC[] = {"74HC08", "74HC32", "74HC00", "74HC02", "74HC86", "74HC7266"};
const uint8_t BANG_CONG[] = {0b1000, 0b1110, 0b0111, 0b0001, 0b0110, 0b1001};
// Đọc chân Y hai lần, lần lượt với điện trở kéo xuống và kéo lên bên trong (khoảng 45 kΩ).
// Ngõ ra 74HC mạnh hơn nhiều nên hai lần phải giống nhau; khác nhau nghĩa là chân Y đang hở mạch.
int docY() {
pinMode(CHAN_Y, INPUT_PULLDOWN);
delayMicroseconds(50);
int y1 = digitalRead(CHAN_Y);
pinMode(CHAN_Y, INPUT_PULLUP);
delayMicroseconds(50);
int y2 = digitalRead(CHAN_Y);
return (y1 == y2) ? y1 : -1;
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_A, OUTPUT);
pinMode(CHAN_B, OUTPUT);
delay(300);
Serial.println("Thu cong logic hai dau vao: A = GPIO26, B = GPIO27, Y = GPIO32");
}
void loop() {
uint8_t bang = 0;
bool hoMach = false;
Serial.println(" A B | Y");
for (int i = 0; i < 4; i++) {
int a = i / 2, b = i % 2;
digitalWrite(CHAN_A, a);
digitalWrite(CHAN_B, b);
delay(5); // Cổng 74HC đổi mức trong vài chục ns; chờ dư để dây dài cũng ổn định
int y = docY();
if (y < 0) {
hoMach = true;
Serial.printf(" %d %d | ? (ho mach)\n", a, b);
} else {
bang |= y << i;
Serial.printf(" %d %d | %d\n", a, b, y);
}
}
if (hoMach) {
Serial.println("=> Chan Y khong duoc dieu khien: kiem tra day Y, nguon chan 14, GND chan 7");
} else {
int k = -1;
for (int j = 0; j < 6; j++) {
if (BANG_CONG[j] == bang) k = j;
}
if (k >= 0) Serial.printf("=> Cong %s (vi du IC %s)\n", TEN_CONG[k], VI_DU_IC[k]);
else if (bang == 0) Serial.println("=> Y luon 0: kiem tra nguon, so do chan (74HC02 khac so do)");
else if (bang == 0b1111) Serial.println("=> Y luon 1: kiem tra GND, so do chan");
else Serial.println("=> Khong khop cong hai dau vao nao: kiem tra day A, B");
}
Serial.println();
delay(3000);
}
- Mỗi bảng sự thật được ghép thành một số 4 bit: bit thứ i là ngõ ra khi (A, B) = (i / 2, i % 2). Ví dụ cổng AND chỉ ra 1 ở tổ hợp 11 (i = 3) nên bảng là
0b1000. So bảng đo được với sáu số trongBANG_CONGlà biết loại cổng. docY()đọc chân Y hai lần, lần lượt bật điện trở kéo xuống và kéo lên bên trong ESP32. Ngõ ra 74HC mạnh hơn nhiều nên hai lần phải giống nhau; nếu khác, chân Y đang hở mạch (dây lỏng, IC chưa có nguồn). Đây là mẹo hay khi kiểm tra một chân có được điều khiển hay không.- Chân GPIO32 được chọn vì có điện trở kéo lên, kéo xuống bên trong; các chân GPIO34–39 của ESP32 không có.
Kết quả mong đợi

Cắm 74HC00 thì chương trình báo cổng NAND; tắt nguồn, thay bằng 74HC86 rồi cấp lại thì báo cổng XOR. Thử rút dây ở chân 3: bốn dòng báo hở mạch. Thử dời ba dây sang cổng 2 (chân 4, 5, 6) để kiểm tra từng cổng trong IC: cách này dùng được để tìm cổng hỏng trong một IC cũ.
6. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Báo hở mạch cả bốn dòng | Dây chân 3 lỏng, IC chưa có nguồn chân 14 hoặc GND chân 7 | Đo 3,3 V giữa chân 14 và 7; kiểm tra dây Y |
| Y luôn 0 hoặc luôn 1 | Cắm 74HC02 với dây theo sơ đồ 74HC00, hoặc IC cắm ngược | Kiểm tra mã IC và khấc; đổi dây theo sơ đồ chân đúng |
| Báo "không khớp cổng nào" | Dây A hoặc B cắm nhầm hàng, một đầu vào bị hở | Kiểm tra chân 1, 2 của IC |
| Kết quả lúc đúng lúc sai | Đầu vào các cổng khác để hở gây nhiễu, thiếu tụ 100 nF | Nối mọi đầu vào không dùng xuống GND; thêm tụ nguồn |
| IC ấm lên dù không có tải | Đầu vào nằm trong vùng không xác định (để hở hoặc điện áp lưng chừng) | Nối đầu vào về mức rõ ràng |
7. Xem thêm
- Các bài liên quan trong loạt điện tử căn bản: MOSFET (bài 20), IC là gì và cách đọc mã (bài 23).
- Bài tiếp theo của loạt: flip-flop, bộ đếm và thanh ghi dịch 74HC595 để mở rộng chân ra cho ESP32.
Xem thêm