Mục lục (6 phần)
Điện tử số là phần "dễ ăn điểm" nếu nắm chắc bảng chân lí. Đề thường có 2–3 câu ở phần I (nhận dạng cổng, đọc mạch logic, cấu
trúc vi điều khiển) và có thể có một câu đúng/sai ở phần II về mạch điều khiển thực tế: máy bơm, chuông báo động, đèn tự động.
Từ đề 2026 có thêm câu đọc chương trình Arduino (setup(), loop(), pinMode, digitalWrite, delay…) — xem mục
"Vi điều khiển và đọc chương trình Arduino" ở cuối phần dạng bài.
Kiến thức trọng tâm
Tín hiệu tương tự và tín hiệu số
- Tín hiệu tương tự biến thiên liên tục theo thời gian (điện áp từ micro, cảm biến nhiệt độ).
- Tín hiệu số chỉ có hai mức: mức thấp — logic 0 (ví dụ gần 0 V) và mức cao — logic 1 (ví dụ gần 5 V hoặc 3,3 V).
- Ưu điểm của xử lí số: ít bị nhiễu, dễ lưu trữ, dễ xử lí bằng vi mạch và máy tính.
Các cổng logic cơ bản
| Cổng | Biểu thức | Đầu ra bằng 1 khi |
|---|---|---|
| AND (Và) | Tất cả đầu vào bằng 1 | |
| OR (Hoặc) | Ít nhất một đầu vào bằng 1 | |
| NOT (Đảo) | Đầu vào bằng 0 | |
| NAND | Có ít nhất một đầu vào bằng 0 | |
| NOR | Tất cả đầu vào bằng 0 | |
| XOR | Hai đầu vào khác nhau |
Bảng chân lí của các cổng hai đầu vào:
| Cổng | A = 0, B = 0 | A = 0, B = 1 | A = 1, B = 0 | A = 1, B = 1 |
|---|---|---|---|---|
| AND | 0 | 0 | 0 | 1 |
| OR | 0 | 1 | 1 | 1 |
| NAND | 1 | 1 | 1 | 0 |
| NOR | 1 | 0 | 0 | 0 |
| XOR | 0 | 1 | 1 | 0 |
Mạch logic tổ hợp và mạch logic dãy
| Tiêu chí | Mạch tổ hợp | Mạch dãy |
|---|---|---|
| Đặc điểm | Đầu ra chỉ phụ thuộc các đầu vào ở thời điểm đó | Đầu ra phụ thuộc đầu vào và trạng thái trước đó (có nhớ) |
| Ví dụ | Mạch cộng, mạch so sánh, mạch mã hóa, giải mã (hiển thị LED 7 đoạn) | Flip-flop (trigơ), bộ đếm, thanh ghi |
Flip-flop RS (dùng cổng NOR): → (đặt); → (xóa); → giữ nguyên trạng thái cũ (nhớ); → trạng thái cấm. Flip-flop D: khi có xung nhịp, đầu ra nhận giá trị của đầu vào .
Vi điều khiển
Vi điều khiển là một vi mạch tích hợp trên một chip gồm bộ xử lí trung tâm, bộ nhớ và các cổng vào/ra, được lập trình để điều khiển thiết bị.
| Khối | Chức năng |
|---|---|
| Bộ xử lí trung tâm (CPU) | Đọc và thực hiện lệnh của chương trình |
| Bộ nhớ chương trình (Flash) | Lưu chương trình, không mất khi tắt nguồn |
| Bộ nhớ dữ liệu (RAM) | Lưu dữ liệu tạm thời khi chạy |
| Cổng vào/ra số (I/O) | Nhận tín hiệu từ nút nhấn, cảm biến; xuất tín hiệu điều khiển đèn, rơ le, động cơ |
| Bộ chuyển đổi tương tự – số (ADC) | Đổi điện áp từ cảm biến thành con số |
| Bộ định thời, bộ đếm | Tạo thời gian trễ, đếm xung, tạo xung điều khiển |
| Khối giao tiếp | Trao đổi dữ liệu với máy tính, mô đun khác |
Ứng dụng: máy giặt, điều hòa, lò vi sóng, khóa cửa điện tử, nhà thông minh, robot, ô tô, thiết bị IoT trong nông nghiệp.
Quy trình làm sản phẩm với vi điều khiển: xác định yêu cầu → vẽ sơ đồ khối, lưu đồ thuật toán → viết chương trình trên máy tính → biên dịch và nạp chương trình vào vi điều khiển → lắp mạch, chạy thử, hiệu chỉnh.
Lặp mãi:
L ← đọc giá trị cảm biến ánh sáng (ADC)
Nếu L < ngưỡng: đặt chân điều khiển đèn = 1 (bật đèn)
Ngược lại: đặt chân điều khiển đèn = 0 (tắt đèn)
Bộ ADC bit chia điện áp vào thành mức: ADC 10 bit cho giá trị từ 0 đến 1023.
Lệnh cụ thể và cách đọc một chương trình cho bo mạch Arduino Uno: xem mục Vi điều khiển và đọc chương trình Arduino bên dưới.
Dạng bài thường gặp trong đề thi
Dạng 1: Nhận dạng cổng từ bảng chân lí
Xem lời giải
Đó là cổng XOR (): và cho ; và cho .
Dạng 2: Từ sơ đồ mạch viết biểu thức và lập bảng chân lí
Xem lời giải
, .
| 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 0 |
khi và , không cùng bằng 1: có 3 tổ hợp , , .
Dạng 3: Thiết kế mạch logic cho tình huống thực tế
Xem lời giải
khi có ít nhất một cặp cùng bằng 1: .
Kiểm tra: các tổ hợp , , , cho (4 tổ hợp); các tổ hợp có không quá một người đồng ý cho . Mạch dùng 3 cổng AND hai đầu vào và 1 cổng OR ba đầu vào.
Dạng 4: Câu đúng/sai về mạch báo động
Xem lời giải
a) Đúng: nên .
b) Đúng: .
c) Sai: cần và → chỉ 3 tổ hợp , , .
d) Đúng: cổng OR tạo , cổng AND nhân với .
Dạng 5: Cấu trúc và hoạt động của vi điều khiển
Xem lời giải
Điện áp cảm biến là tín hiệu tương tự → đưa vào chân vào tương tự (ADC) để đổi thành con số. Tín hiệu bật/tắt rơ le là tín hiệu số 0/1 → lấy từ cổng ra số (I/O). CPU so sánh giá trị đọc được với ngưỡng trong chương trình để quyết định bật hay tắt.
Vi điều khiển và đọc chương trình Arduino
Đề tốt nghiệp 2026 có 2 câu về bo mạch Arduino ở phần I; các đề bám sát còn có câu đúng/sai kèm chương trình và sơ đồ nối dây. Đọc một chương trình Arduino giống đọc một mạch điện: biết chân nào nối với thiết bị nào, lệnh nào chạy lúc nào, và tại mỗi thời điểm chân ra đang ở mức nào.
Bo mạch Arduino Uno
Vi điều khiển tích hợp CPU, bộ nhớ và cổng vào/ra trên một chip (xem mục Vi điều khiển ở trên). Arduino Uno là bo mạch lập trình có gắn sẵn một vi điều khiển 8 bit làm việc ở 5 V, kèm mạch nạp chương trình qua cổng USB, mạch nguồn và các hàng chân cắm để nối cảm biến, cơ cấu chấp hành.
| Nhóm chân | Kí hiệu | Công dụng |
|---|---|---|
| Chân số | 0 – 13 | Vào/ra tín hiệu số: mức cao HIGH (khoảng 5 V), mức thấp LOW (0 V). Chân 0, 1 dùng khi trao đổi dữ liệu với máy tính nên thường để trống |
| Chân có dấu ~ | 3, 5, 6, 9, 10, 11 | Là chân số, xuất thêm được xung PWM bằng lệnh analogWrite |
| Chân tương tự | A0 – A5 | Đọc điện áp 0 – 5 V của cảm biến bằng lệnh analogRead |
| Chân nguồn | 5V, GND (và 3,3 V, Vin) | Cấp điện cho cảm biến, mô-đun; GND là mốc 0 V chung |
| Cổng USB, giắc nguồn | — | Nạp chương trình từ máy tính, cấp nguồn cho bo mạch |
Thiết bị thường nối với bo mạch. Cảm biến, nút nhấn là phần tử đầu vào; LED, còi, rơ le, động cơ là cơ cấu chấp hành (đầu ra).
| Thiết bị | Nối vào | Lệnh dùng |
|---|---|---|
| Nút nhấn, công tắc hành trình, cảm biến có ngõ ra số (chuyển động, vật cản hồng ngoại) | Chân số, khai báo là chân vào | digitalRead |
| Cảm biến ánh sáng (quang điện trở), nhiệt độ, độ ẩm; biến trở | Chân A0 – A5 | analogRead |
| LED (nối qua điện trở hạn dòng), còi báo | Chân số, khai báo là chân ra | digitalWrite |
| Rơ le đóng cắt máy bơm, quạt, đèn 220 V | Chân ra, qua mô-đun rơ le | digitalWrite |
| Động cơ một chiều, LED cần chỉnh độ sáng | Chân có dấu ~, qua transistor hoặc mô-đun | analogWrite (mở rộng) |
Cấu trúc chương trình và các lệnh cơ bản
Chương trình Arduino viết bằng ngôn ngữ giống C/C++, được soạn và biên dịch trên máy tính bằng phần mềm Arduino IDE rồi nạp vào bo mạch qua cổng USB. Chương trình nào cũng có hai hàm:
// (1) Khai báo: đặt tên chân, biến dùng chung
const int DEN = 12;
int dem = 0;
void setup() {
// (2) Chạy MỘT lần khi cấp nguồn hoặc nhấn nút reset
pinMode(DEN, OUTPUT);
}
void loop() {
// (3) Chạy LẶP LẠI mãi mãi:
// đọc tín hiệu vào → so sánh → điều khiển chân ra
}setup()chạy một lần: khai báo chân vào/ra, đặt trạng thái ban đầu.loop()chạy lặp lại mãi mãi: thực hiện xong lệnh cuối lại quay về lệnh đầu.- Mỗi lệnh kết thúc bằng dấu
;, khối lệnh nằm giữa{và}; chữ sau//là chú thích, không phải lệnh. const int DEN = 12;đặt tên cho chân 12; từ đó viếtDENthay cho số 12.
Các lệnh vào/ra cần thuộc:
pinMode(chân, chế độ);— khai báo chân:OUTPUT(chân ra),INPUT(chân vào),INPUT_PULLUP(chân vào có điện trở kéo lên bên trong, mở rộng — xem dưới).digitalWrite(chân, HIGH);hoặcdigitalWrite(chân, LOW);— xuất mức cao (khoảng 5 V) hoặc mức thấp (0 V) ra chân số.digitalRead(chân)— đọc mức của chân vào, trả vềHIGH(1) hoặcLOW(0).analogRead(A0)— đọc điện áp 0 – 5 V ở chân tương tự, trả về số nguyên từ 0 đến 1023 (bộ ADC 10 bit).analogWrite(chân, k);— (mở rộng) chỉ dùng với chân có dấu ~, xuất dãy xung vuông 5 V (PWM), từ 0 đến 255; điện áp trung bình .delay(t);— dừng chương trình t mili giây (1 s = 1000 ms); trong lúc chờ, các chân ra giữ nguyên mức.
Biến, điều kiện và phép so sánh:
int x = analogRead(A0);tạo biến số nguyênxlưu giá trị đọc được. Biến khai báo ngoài mọi hàm (đầu chương trình) giữ giá trị qua các lần lặp củaloop(); biến khai báo bên trongloop()được tạo lại ở mỗi lần lặp.- So sánh:
==(bằng),!=(khác),<,>,<=,>=. Dấu=đứng một mình là phép gán, không phải so sánh. - Ghép điều kiện:
&&(và) ứng với cổng AND,||(hoặc) ứng với cổng OR,!(phủ định) ứng với cổng NOT. if (điều kiện) { khối 1 } else { khối 2 }: điều kiện đúng thì chạy khối 1, sai thì chạy khối 2. Không cóelsethì khi điều kiện sai, chương trình bỏ qua và các chân ra giữ nguyên mức cũ.
INPUT_PULLUP (mở rộng). Nút nhấn nối giữa chân vào và GND, chân khai báo pinMode(chân, INPUT_PULLUP);: điện trở kéo lên
bên trong (vài chục kΩ) giữ chân ở mức cao khi nút hở. Vì vậy nhả nút → đọc HIGH, nhấn nút → đọc LOW — ngược với cách
nối nút từ 5V tới chân vào và dùng điện trở kéo xuống GND. Chân vào để hở, không có điện trở kéo lên hay kéo xuống thì mức đọc được
bất định.
Cách đọc một chương trình
- Nối mạch với code. Đọc phần khai báo và
setup(), lập bảng: chân nào — nối với thiết bị gì — là chân vào hay chân ra. Cảm biến, nút nhấn ở chân vào; LED, còi, rơ le, động cơ ở chân ra. - Lập bảng lần vết theo thời gian. Đi lần lượt từng lệnh trong
loop(); mỗidelay(t)cộng thêm t ms vào đồng hồ; ghi mức của từng chân ra trong mỗi khoảng thời gian. Các lệnh khác coi như thực hiện tức thời (đề thường ghi "bỏ qua thời gian thực hiện các lệnh khác ngoàidelay()"). - Tìm chu kì. Một vòng
loop()dài bằng tổng cácdelaytrong vòng đó. Muốn biết trạng thái ở thời điểm : lấy số dư của khi chia cho chu kì rồi tra bảng lần vết. - Thay số vào điều kiện. Đổi điện áp của cảm biến ra giá trị
analogRead(hoặc ngược lại) rồi xét từngif; với nút nhấn, xác định mức đọc được khi nhấn và khi nhả.
Ví dụ 1: Lập bảng lần vết theo thời gian
Xem lời giải
Lập bảng lần vết cho một vòng loop():
| Thời gian trong vòng | Chân 7 | Chân 8 | Thùng trộn |
|---|---|---|---|
| 0 – 4 s | HIGH | LOW | Quay thuận |
| 4 – 5 s | LOW | LOW | Đứng yên |
| 5 – 9 s | LOW | HIGH | Quay ngược |
| 9 – 10 s | LOW | LOW | Đứng yên |
Một vòng dài . Vì nên tại chương trình đang ở giây thứ 3 của vòng thứ tư: thùng quay thuận và dừng ở giây thứ 4 của vòng (lúc ), tức còn 1 s. Chọn C.
Phương án A là kết quả khi quên cả hai lệnh delay(1000) (coi vòng dài 8 s); B là kết quả khi quên một lệnh delay(1000) (vòng
9 s).
Ví dụ 2: Hai ngưỡng đọc tương tự, chân ra giữ trạng thái
Xem lời giải
Đổi hai ngưỡng ra điện áp () rồi ra độ ẩm (độ ẩm bằng phần trăm):
doAm < 818khi , tức độ ẩm dưới khoảng 80% → bật máy;doAm > 921khi , tức độ ẩm trên khoảng 90% → tắt máy;- độ ẩm từ 80% đến 90%: không lệnh
digitalWritenào chạy → chân 6 giữ nguyên mức cũ.
Lần vết (hàm setup() đặt chân 6 ở mức thấp, máy tắt):
| Độ ẩm | Giá trị đọc | Lệnh được chạy | Máy |
|---|---|---|---|
| 93% | 951 | tắt (951 > 921) | Tắt |
| 85% | 869 | không có | Giữ: tắt |
| 79% | 808 | bật (808 < 818) | Bật |
| 84% | 859 | không có | Giữ: bật |
| 91% | 930 | tắt (930 > 921) | Tắt |
Chọn D. Phương án A (bật ngay khi dưới 90%) và B (chỉ chạy khi dưới 80%) đều bỏ qua việc chân ra giữ trạng thái; C đổi nhầm 921 thành 92,1%. Hai ngưỡng cách nhau giúp máy không bật, tắt liên tục khi độ ẩm dao động quanh một ngưỡng — chương trình "nhớ" trạng thái giống mạch dãy.
Ví dụ 3: Câu đúng/sai có sơ đồ nối dây
Xem lời giải
a) Đúng. analogRead dùng với các chân tương tự A0 – A5, nên hai cảm biến cho điện áp biến thiên được nối vào A1, A2;
pinMode(DONG_CO, OUTPUT) khai báo chân 8 là chân ra.
b) Đúng. Với INPUT_PULLUP, công tắc hở thì điện trở kéo lên giữ chân 4 ở mức cao; công tắc đóng nối chân 4 xuống GND nên
chân 4 ở mức thấp. Khi đó vế digitalRead(HANH_TRINH) == HIGH sai, cả điều kiện nối bằng && sai, chương trình chạy nhánh
else: chân 8 mức thấp, động cơ dừng. Nhờ vậy động cơ không kéo mãi khi giàn đã vào hết.
c) Sai. nên mua = 388 < 400: vế mua < 400 đúng. Phép || chỉ cần một vế đúng,
nên (mua < 400 || sang < 200) đúng dù trời sáng; công tắc đang hở nên chân 4 ở mức cao. Chân 8 lên mức cao: động cơ kéo giàn
vào (chương trình coi tấm cảm biến ẩm là trời mưa).
d) Đúng. Trời khô nên mua gần 1023, vế mua < 400 sai; động cơ chạy khi sang < 200, tức , hay
.
Ví dụ 4: Nút nhấn chọn mức sáng và xung PWM (mở rộng)
Xem lời giải
a) Đúng. Biến khai báo ở đầu chương trình (ngoài setup() và loop()) được tạo một lần và giữ giá trị qua các lần lặp. Nếu
viết int muc = 0; bên trong loop() thì mỗi vòng muc lại về 0 và mỗi lần bấm đèn chỉ lên mức 1.
b) Sai. Với INPUT_PULLUP, không nhấn nút thì chân 7 ở mức cao, digitalRead(7) trả về HIGH; điều kiện == LOW sai nên
khối lệnh không chạy, đèn giữ nguyên mức.
c) Đúng. Mỗi lần bấm, khối if chạy một lần rồi delay(400); sau 0,4 s tay đã thả nên lần bấm không bị đếm hai lần. Lần
vết muc: 1 → 2 → 3 → 0 → 1 → 2. Cuối cùng analogWrite(DEN, muc * 85) xuất giá trị 170, điện áp trung bình
.
d) Sai. Chân 4 không có dấu ~ nên không xuất được xung PWM. (Mở rộng: khi đó analogWrite chỉ cho mức thấp nếu và
mức cao nếu .) Đèn chỉ còn tắt (mức 0, 1) hoặc sáng hẳn (mức 2, 3), không còn 4 mức.
Lỗi thường gặp
Khi đọc chương trình Arduino:
Mẹo làm bài
Tự kiểm tra nhanh
- Cổng NAND hai đầu vào có , . Đầu ra bằng bao nhiêu?
Xem đáp án
.
- Cổng NOR hai đầu vào có , . Đầu ra bằng bao nhiêu?
Xem đáp án
.
- Mạch logic có 4 đầu vào thì bảng chân lí có bao nhiêu dòng?
Xem đáp án
dòng.
- Bộ đếm sản phẩm trên băng chuyền là mạch tổ hợp hay mạch dãy? Vì sao?
Xem đáp án
Mạch dãy, vì kết quả đếm phụ thuộc số xung đã nhận trước đó (mạch phải "nhớ" trạng thái).
- ADC 8 bit chia điện áp vào thành bao nhiêu mức?
Xem đáp án
mức (giá trị từ 0 đến 255).
- Một cảm biến nối chân A0 của bo mạch Arduino Uno; lệnh
analogRead(A0)trả về 614. Điện áp ở chân A0 khoảng bao nhiêu?
Xem đáp án
.
- Đoạn lệnh sau nằm trong
loop()(chân 2 là chân vào, chân 9 là chân ra), nhằm bật đèn ở chân 9 chỉ khi chân 2 ở mức cao. Chạy thử thì đèn sáng suốt, dù chân 2 ở mức nào. Lỗi ở đâu?
int nut = digitalRead(2);
if (nut = HIGH) {
digitalWrite(9, HIGH);
} else {
digitalWrite(9, LOW);
}Xem đáp án
nut = HIGH là phép gán: gán nut bằng HIGH (tức 1), giá trị của cả biểu thức là 1 nên điều kiện luôn đúng và đèn luôn
sáng. Sửa thành if (nut == HIGH).
- Chương trình khai báo
pinMode(5, INPUT_PULLUP);và bật đèn báo ở chân 11 khidigitalRead(5) == LOW. Nút nhấn phải nối giữa chân 5 và chân 5V hay chân GND của bo mạch? Nếu nối nhầm sang chân còn lại thì đèn hoạt động thế nào?
Xem đáp án
Nối giữa chân 5 và GND: nhả nút, điện trở kéo lên giữ chân 5 ở mức cao; nhấn nút, chân 5 bị nối xuống 0 V nên đọc được LOW
và đèn sáng. Nếu nối nhầm sang 5V thì nhấn hay nhả chân 5 đều ở mức cao: đèn không bao giờ sáng.
- Trong một chương trình,
a,b,clà giá trị đọc từ ba chân vào; đèn sáng khi điều kiện(a == HIGH && b == HIGH) || c == HIGHđúng. Đặt , , bằng 1 khi chân tương ứng ở mức cao, khi đèn sáng. Viết biểu thức của và cho biết có bao nhiêu tổ hợp đầu vào làm đèn sáng.
Xem đáp án
&& ứng với AND, || ứng với OR nên . Đèn sáng khi (4 tổ hợp) hoặc khi ,
(1 tổ hợp): tổng cộng 5 trong 8 tổ hợp.
Làm 10 câu luyện tập về điện tử số và vi điều khiển và xem lời giải ngay sau mỗi câu.