Trong thiết kế điện tử, việc chuyển đổi từ các cổng logic rời rạc sang Vi điều khiển (MCU) họ 8051 (AT89C51) là một bước tiến lớn giúp tối giản phần cứng và tăng độ linh hoạt nhờ phần mềm. Tuy nhiên, ranh giới giữa “chạy mượt trên mô phỏng” và “chạy tốt ngoài thực tế” luôn là thách thức lớn với mọi kỹ sư.
Bài viết này sẽ phân tích chi tiết sơ đồ nguyên lý mạch đếm vòng dùng AT89C51 trên Proteus, cách khắc phục lỗi kết nối để chạy mô phỏng thành công, và những lưu ý “xương máu” khi triển khai phần cứng thực tế, kèm theo mã nguồn (source code) hoàn chỉnh để bạn đọc dễ dàng thực hành.
1. Sơ Đồ Nguyên Lý Mạch Đếm Vòng 8051 (Proteus)
Dưới đây là sơ đồ nguyên lý toàn bộ hệ thống mạch đếm vòng hiển thị LED 7 đoạn, điều khiển động cơ Servo qua Relay và tích hợp cảm biến:
Các khối chức năng chính trong mạch:
- Khối xử lý trung tâm: Vi điều khiển AT89C51.
- Khối hiển thị: 2 bộ LED 7 đoạn kép (Anode chung), sử dụng cổng đảo NOT để quét LED.
- Khối điều khiển: Công tắc xoay
SW1chọn chế độ vòng và các nút nhấn cài đặt số vòng (Tăng, Giảm, Start, Stop). - Khối cơ cấu chấp hành: Relay
RL1điều khiển động cơ Servo thông qua transistor NPNQ1.
2. Sửa Lỗi Chí Mạng Để Chạy Mô Phỏng Trên Proteus
Nếu bạn nhấn nút Play trên Proteus mà mạch không phản hồi khi bấm nút SENSOR, nguyên nhân nằm ở một lỗi kết nối nhãn (Net Label).
Lỗi thiết kế: Nút bấm tạo xung ở góc dưới có nhãn tên làSENSOR, nhưng trên các chân của vi điều khiểnU1(AT89C51) hoàn toàn không có nhãn nào tên làSENSOR. Do đó, Proteus hiểu chân này đang bị để lơ lửng (Floating) và không nhận tín hiệu.
Cách khắc phục nhanh trên phần mềm:
- Xác định chân nhận tín hiệu cảm biến trong code Assembly của bạn (Ví dụ: Chân ngắt ngoại vi
P3.2– Chân số 12). - Vẽ một đoạn dây ngắn tại chân đó trên Proteus.
- Nhấp đúp và đặt tên nhãn (Net Label) trùng khớp hoàn toàn là
SENSOR. Lúc này, Proteus mới thiết lập kết nối ảo giữa nút bấm và MCU.
3. Khoảng Cách Giữa Mô Phỏng Và Thực Tế: 3 Lỗi Cần Sửa Khi Làm Mạch Thật
Môi trường mô phỏng Proteus cực kỳ “bao dung” vì nó bỏ qua các giới hạn vật lý của linh kiện. Nếu bạn mang nguyên si sơ đồ này đi làm mạch in (PCB), mạch sẽ không hoạt động hoặc bị cháy linh kiện.
| Lỗi Thiết Kế | Trạng Thế Trên Proteus | Hậu Quả Trên Mạch Thật | Giải Pháp Khắc Phục |
|---|---|---|---|
| Mạch Reset sai thông số (Chân RST nối 150Ω xuống GND) |
Vẫn khởi động bình thường vì Proteus tự động nạp trạng thái ban đầu. | MCU bị “đơ” hoàn toàn, không thể khởi động tự động khi cấp nguồn. | Sử dụng mạch Auto-Reset chuẩn: Tụ hóa 10µF nối lên VCC và điện trở 10kΩ nối xuống GND. |
| Thiếu Diode dập xung Song song với cuộn dây Relay RL1 |
Transistor Q1 “bất tử” nên không bị ảnh hưởng. |
Cuộn cảm Relay sinh dòng điện ngược hàng trăm Volt khi ngắt, gây cháy ngay transistor Q1. |
Hàn song song một Diode (ví dụ: 1N4148 hoặc 1N4007) vào 2 đầu cuộn dây (Cathode hướng lên nguồn 12V). |
| Dùng cổng NOT gánh dòng quét LED (IC U2 – U5) |
LED vẫn sáng đều vì nguồn dòng trong Proteus mô phỏng là vô hạn. | Cổng NOT bị quá tải dòng (>30mA), sinh nhiệt cao và sụt áp làm LED tối mờ. | Thay thế các cổng NOT bằng transistor PNP (ví dụ: A1015, S8550) để làm nhiệm vụ đệm dòng. |
4. Mã Nguồn Assembly Đầy Đủ
Dưới đây là toàn bộ mã nguồn Assembly dành cho vi điều khiển AT89C51 được sử dụng để nạp vào hệ thống đếm vòng hiển thị LED 7 đoạn nói trên:
donvi equ 20h
chuc equ 21h
donvi_7seg equ 22h
chuc_7seg equ 23h
donvi2 equ 24h
chuc2 equ 25h
donvi_7seg2 equ 26h
chuc_7seg2 equ 27h
sovong_manu equ 28h
// =====khai bao den hien thi========
den_start bit p2.0
den_tuyy bit p2.1
den_2vong bit p2.2
den_1vong bit P2.3
// ====khai bao nut nhan==============
nut_2vong bit p3.0
nut_1vong bit p3.1
nut_tang bit p3.2
nut_giam bit p3.3
nut_start bit p3.6
nut_stop bit p3.7
org 0000h
ljmp main1
org 0003h
ljmp ngat_ngoai0
org 0013h
ljmp ngat_ngoai1
// ============================
main1: mov ie,#10000101b
setb it0
setb it1
mov TMOD,#00000101b
setb tr0
mov p0,#00h
mov P2,#00
mov sovong_manu,#00
mov TL0,#00h
mov TH0,#00h
main:
lcall giaima_tp
lcall gaima_7seg
lcall hienthi
// -------------------------------------
// ***********khoi kiem tra nut start _ stop
jb nut_start,kt_nutstop
jb den_start,kt_nutstop
mov TL0,#00
setb den_start
kt_nutstop: jb nut_stop,kt_nut2vong
clr den_start
// ***********khoi kiem tra nut start _ stop
// -------------------------------------
// ----***khoi kiem tra che do 1 vong _ 2 vong***---
kt_nut2vong:jb nut_2vong,kt_nut1vong
clr den_tuyy
setb den_2vong
clr den_1vong
mov a,TL0
cjne a,#2,main
clr den_start
kt_nut1vong: jb nut_1vong,kt_tuyy
clr den_tuyy
setb den_1vong
clr den_2vong
mov a,TL0
cjne a,#1,main
clr den_start
kt_tuyy:
jnb nut_2vong,main
jnb nut_1vong,main
setb den_tuyy
clr den_2vong
clr den_1vong
mov a,TL0
subb a,sovong_manu
cjne a,#0,main
clr den_start
// ----***khoi kiem tra che do 1 vong _ 2 vong***---
// -------------------------------------
ljmp main
giaima_tp:
mov a,TL0
mov b,#10
div ab
mov donvi,b
mov chuc,a
mov a,sovong_manu
mov b,#10
div ab
mov donvi2,b
mov chuc2,a
ret
gaima_7seg:
mov dptr,#dulieu
mov a,donvi
movc a,@a+dptr
mov donvi_7seg,a
mov a,chuc
movc a,@a+dptr
mov chuc_7seg,a
mov a,donvi2
movc a,@a+dptr
mov donvi_7seg2,a
mov a,chuc2
movc a,@a+dptr
mov chuc_7seg2,a
ret
hienthi:
mov p1,#0ffh
mov p0,donvi_7seg
mov p1,#11111110b
lcall delay
mov p1,#0ffh
mov p0,chuc_7seg
mov p1,#11111101b
lcall delay
mov p1,#0ffh
mov p0,donvi_7seg2
mov p1,#11111011b
lcall delay
mov p1,#0ffh
mov p0,chuc_7seg2
mov p1,#11110111b
lcall delay
ret
delay: mov r7,#255
de1: mov r6,#255
djnz r7,de1
ret
ngat_ngoai0:
inc sovong_manu
mov a,sovong_manu
cjne a,#99,thoat_ngat0
mov sovong_manu,#00
thoat_ngat0:reti
ngat_ngoai1:
dec sovong_manu
mov a,sovong_manu
cjne a,#-1,thoat_ngat0
mov sovong_manu,#00
reti
dulieu:
db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h
end
Tải xuống Tài liệu & Tài nguyên Dự án
Gói dữ liệu hoàn chỉnh giúp bạn triển khai mô phỏng và thực tế ngay lập tức.
1. Thành phần gói dự án
Sau khi tải xuống và giải nén tệp tin .ZIP, thư mục dự án sẽ bao gồm các tệp tin quan trọng:
mach_dem_vong.pdsprj: File thiết kế mô phỏng mạch nguyên lý trên Proteus (Khuyên dùng v8.12 trở lên).main.asm: File chứa mã nguồn lập trình Assembly gốc dành cho vi điều khiển 8051.main.hex: File mã máy đã được biên dịch sẵn để nạp trực tiếp vào chip AT89C51 trong Proteus.
2. Các bước chạy mô phỏng trên máy tính
- Mở file
mach_dem_vong.pdsprjbằng phần mềm Proteus. - Nhấp đúp chuột trái vào vi điều khiển
U1(AT89C51) trên màn hình làm việc. - Tại mục Program File, nhấp chọn biểu tượng thư mục và tìm chọn đường dẫn đến file
main.hexvừa giải nén. - Nhấp nút Play (hoặc nhấn phím
F12) ở góc dưới bên trái phần mềm Proteus để khởi động mô phỏng. - Sử dụng các phím bấm tương tác:
nut_startđể chạy,nut_stopđể dừng,nut_tang/nut_giamđể cấu hình số vòng chạy tự chọn.
⚠️ Lưu ý đặc biệt cho mạch vật lý thực tế:
Mạch mô phỏng lý thuyết không vẽ một số khối bổ trợ để sơ đồ gọn gàng hơn. Tuy nhiên khi ráp linh kiện thật, bạn bắt buộc phải thiết kế bổ sung: bộ tạo dao động Thạch anh 12MHz (chân XTAL1/XTAL2), tụ chống nhiễu nguồn 104 lọc xung nhiễu cho động cơ, và mạch reset tự động để đảm bảo hệ thống không bị treo đột ngột.