các bài toán ứng dụng vi điều khiển
Trang 1Rất vui khi thấy Bạn vào xem
Phần dẫn nhập.
Có một Bạn viết e-mail cho tôi với câu hỏi như sau:
Em la giao sinh moi ra truong, hien dang di day hoc cho cac em hoc sinh Tieu hoc, trong qua trinh day hoc em rat thich cho cac em choi tro choi do em co
su dung mach nhan chuong uu tien nhung mach chuong hien tai chi co the su dung duoc cho toi da la 4 doi nhung lop hoc cua em lai can den 8 doi hoac nhieu hon nua Thay co the tang em chuong trình hoac huong dan em cach viet chuong trinh nay duoc khong ? Em dang su dung bi vi dieu khien AT89C2951 Cam on thay rat nhieu !
Đặc tính của một mạch điện “Đố vui để học”, là:
* Theo giả định của tôi là:Trên mỗi bàn có một nút nhấn (có thể mắc song song 3 nút nhấn cho 3 người cùng bàn)
* Khi nghe xong câu hỏi thì người điều khiển chương trình sẽ nhấn nút “Bắt đầu”
* Lúc này, các em sẽ suy nghĩ và khi ai có câu trả lời thì nhấn nút “Trả lời”
* Ở đây có 8 nút nhấn chính Khi một nút đã nhấn thì tất cả các nút còn lại sẽ không còn tác dụng
* Trên bảng đèn sẽ có đèn báo “Bắt đầu”, nó sáng ngay khi người điều khiển chương trình nhấn nút Reset Và khi đã có nút nhấn trả lời thì đèn báo “Bắt đầu” sẽ tắt và lúc này một đèn báo “Đang trả lời sẽ nhấp nháy (có thể cho
Trang 2kèm tiếng nhịp)” Và lúc đang trả lời sẽ có một đèn sáng liên tục xác nhận mạch đang ở “trạng thái trả lời”
* Muốn trở lại trạng thái đầu cho câu hỏi kế tiếp, người điều khiển chỉ cần nhấn nút Reset
Dĩ nhiên phần trên đây là các đặc tính mà tôi tự đặt ra và vựa vào đó để thiết kế phần cứng và rồi sẽ viết chương trình nguồn cho mạch điện này Tôi nghĩ sau khi Bạn đã hiểu rõ công việc thiết kế loại mạch này rồi, Bạn sẽ tự có thể viết các chương trình nguồn khác, nó sẽ thực hiện theo đúng các ý muốn của Bạn
Sơ đồ mạch điện mẫu (tôi vẽ trong OrCAD và tô màu trong trình Paint).
Trang 3Phân tích sơ đồ mạch điện:
Khi dùng ic vi điều khiển AT89C2051, mạch điện cơ bản sẽ gồm các phần sau:
* Phần cấp nguồn: Dùng ic ổn áp 3 chân 7805 để có nguồn 5V ổn định cấp cho chân số 20 và chân số 10 cho nối masse để lấy dòng (Dòng điện tử chảy vào ic qua chân số 10 và ra trên chân số 20) Ở đây dùng Led D1 làm Led
Trang 4báo nguồn mạch làm việc với mức nguồn ngả vào là 12V Nguồn 12V còn được dùng để cấp điện cho các relay Chúng ta dùng 3 relay và dùng các tiếp điểm lá kim K1, K2, K3 của các relay này để điều khiển các bóng đèn điện hay chuông báo
* Phần mạch Reset Tác dụng Reset khi chân số 1 ở mức áp cao Khi mạch được cấp nguồn, tụ C5 (10uF) sẽ nạp điện, dòng nạo chảy qua điện trở R1 (10K), nó kéo chân số 1 lên mức áp cao và chương trình sẽ quay về thanh nhớ 0000h (đó là vị trí khỏi đầu của tác dụng reset) Chỉ sau một lúc tụ C5 sẽ nạp đầy mức nguồn, chân 1 được trả về mức áp thấp và ic vi điều khiển bắt đầu chạy chương trình có trong bộ nhớ EEP-ROM Trong mạch chúng ta dùng nút nhấn reset để đưa chương trình trở lại trạng thái khởi đầu
* Phần định tần cho mạch dao động tạo xung nhịp Xung nhịp được định tần theo thạch anh gắn trên chân 4 và chân 5 Với thạch anh 12MHz, tần số xung nhịp sẽ là 1MHz và chu kỳ lệnh sẽ là 1us Các tụ nhỏ C6, C7 có tác dụng bù nhiệt ổn tần
* 8 Nút nhấn gắn trên port 1 và chúng ta dùng chân p3.0 điều khiển relay 3, chân p3.1 điều khiển relay 2 và chân p3.2 điều khiển relay 1
Cách viết chương trình nguồn:
org 0000h
mov p3, #00000001b ; Đặt 7 chân của p3 xuống mức áp thấp, chân p3.0 ở mức 1, relay 3 đóng
call del ; Chờ một lúc cho ổn định
q1: ; Viết cho phím S1
jb p1.0, q2 ; Chờ phím S1 nhấn xuống, chưa nhấn thì qua kiểm tra phím S2 call del ; tránh hiện tượng rung phím làm kết quả sai
jb p1.0, $ ; kiểm tra lần nữa phím S1cho chắc chắn
jmp ctr_1 ; Vào chương trình điều khiển các đèn báo
q2: ; Viết cho phím S2
jb p1.1, q3
call del
jb p1.1, $
jmp ctr_1
Trang 5q3: ; Viết cho phím S3
jb p1.2, q4
call del
jb p1.2, $
jmp ctr_1
q4: ; Viết cho phím S4
jb p1.3, q5
call del
jb p1.3, $
jmp ctr_1
q5: ; Viết cho phím S5
jb p1.4, q6
call del
jb p1.4, $
jmp ctr_1
q6: ; Viết cho phím S6
jb p1.5, q7
call del
jb p1.5, $
jmp ctr_1
q7: ; Viết cho phím S7
jb p1.6, q8
call del
jb p1.6, $
jmp ctr_1
q8: ; Viết cho phím S8
jb p1.7, q1
call del
jb p1.7, $
jmp ctr_1
ctr_1:
mov p3, #00000110b ; Tắt relay 3, mở relay 2 và mở relay 1 call delay ; Chương trình làm chậm
mov p3, #00000100b ; Tắt relay 3, tắt relay 2 và mở relay 1
Trang 6call delay ; Chương trình làm chậm
jmp ctr_1 ; Tiếp tục chương trình 1
del: ; Chương trình trể dùng tánh hiện tượng rung phím
mov r7, #30
v6: mov r6, #100
djnz r6, $
djnz r7, v6
ret
delay: ; Chương trình trễ tạo nhịp nhấp nháy mov r5, #250
tt: call del
djnz r5, tt
ret
end
Sau khi đã có file nguồn, lấy họ là asm, Bạn cho chuyển vào trình M-IDE để biên dịch ra file có họ là hex Bạn xem, tôi cắt các câu lệnh trên và dán vào cửa sổ của trình MIDE, rồi chọn mục Build và trong cửa sổ Build lại chọn mục Build lần nữa để cho biên dịch ra file hex (Khi có file nguồn trong MIDE, Bạn nhấn phím F9 để cho dịch ra file hex cũng được)
Trang 7Kết quả trong thư mục của file 8-nut.asm (file nguồn), Bạn thấy xuất hiện file 8-nut.hex (file mã) Bây giờ Bạn dùng hộp nạp cho nạp file này vào ic vi điều khiển AT89C2051 là xong chuyện
Trang 8Đây là file văn bản của file 8-nut.hex (Nếu như Bạn không có trình biên dịch MIDE, Bạn có thể dùng các mã này bằng cách cắt lấy, rồi tạo ra file lấy họ
là hex và dùng hộp nạp cho nạp vào ic AT89C2051 cũng được)
:1000000075B0011200742090091200742090FD0256
:1000100000662091091200742091FD020066209272
:10002000091200742092FD020066209309120074E8
:100030002093FD0200662094091200742094FD02B2
:1000400000662095091200742095FD020066209636
:10005000091200742096FD0200662097A912007410
:100060002097FD02006675B00612007D75B004127F
:10007000007D80F27F1E7E64DEFEDFFA227DFA11B3
:0400800074DDFC220D
:00000001FF
Về cách dùng hộp nạp các file hex cho các bộ nhớ EEP-ROM trong các ic vi điều khiển, Bạn tham khảo bài viết sau:
Trang 9
Phân tích các câu lệnh trong chường trình nguồn:
Mới vào Bạn phải dùng câu lệnh:
mov p3, #00000001b
Với câu lệnh này, chỉ có chân p3.0 (tức chân số 2 của ic) là ở mức áp cao, vậy transistor Q3 sẽ bão hòa , nó cấp dòng cho relay 3 và relay này đóng tiếp điểm lá kim K3 Trên tiếp điểm này Bạn gắn một bóng điện, bóng điện sẽ phát
Trang 10sáng, nó cho biết là lúc này 8 nút nhấn đã được kích hoạt, tứ cho quyền nhấn Khi relay 3 được cấp nguồn, Led chỉ thị D4 cũng sẽ phát sáng
Do các chân p3.1 (chúng ta dùng đóng mở relay 2), và chân p3.2 (chúng ta dùng đóng mở relay 1) đều cho ở mức áp thấp nên các transistor Q2, Q1 đều ngưng dẫn
Trong mạch các điện trở 2.2K dùng hạn dòng chân B các Led D2, D3, D4 dùng chỉ thị trạng thái của relay Ở mỗi Led phải có điện trở hạn dòng 560 ohm
Chúng ta không cần dùng câu lệnh:
mov p1, #11111111b hay: mov p1, #0ffh
để đặt 8 chân của port1 lên mức áp cao, vì sau lệnh reset, các chân port1 đều
đã cho ở mức áp cao Vậy khi mới vào chúng ta sẽ viết:
org 0000h ; Cho khởi đầu từ thanh nhớ có địa chỉ là 0000h
mov p3, #00000001b ; Đặt 7 chân của p3 xuống mức áp thấp, chân p3.0 ở mức 1, relay 3 đóng
call del ; Chờ một lúc cho ổn định
(Trên đây là các câu lệnh mở đầu)
Trang 11Chúng ta đặt 8 nút nhấn thường hở trên port1 Vậy trạng thái áp cao trên các chân của port1 là trạng thái chờ
Để bảo đảm là bình thường lúc ở trạng thái chờ các chân của port1 đều ở mức áp cao, chúng ta cho treo áp các chân của port1 bằng các điện trở 10K
Vậy, mỗi khi nút reset đã được nhấn, chương trình khởi đầu từ thanh nhớ 0000h, sau khi qua các câu lệnh khởi đầu (phần trình bày trên), nó vào chương trình dò phím Ở đây chúng ta dùng lệnh nhẩy theo bit cao trên các chân của port1 Các câu lệnh được viết như sau:
q1: ; Viết cho phím S1
jb p1.0, q2 ; Chờ phím S1 nhấn xuống, chưa nhấn thì qua kiểm tra phím S2
call del ; tránh hiện tượng rung phím làm kết quả sai
jb p1.0, $ ; kiểm tra lần nữa phím S1cho chắc chắn, nó phải ở mức áp thấp
jmp ctr_1 ; Vào chương trình điều khiển các đèn báo
Trang 12Giải thích các câu lệnh trên:
q1:
; Đây là tên nhãn của phím S1
jb p1.0, q2
; Nếu phím S1 trên chân p1.0 ở mức áp cao (chưa nhấn) thì nhẩy qua tên nhãn q2 dò phím S2
call del
; cho trễ một chút để tránh ảnh hưởng của việc rung phím Khi Bạn nhấn phím xuống, mặt tiếp xúc sẽ rung và ạo ra hiện tượng lúc dính lúc không, phải chờ sau một thời gian mới chắc chắn là nó đã dính
jb p1.0, $
; Đến đây nếu phím S1 còn ở mức áp cao thì chương trình sẽ dừng lại chờ, chương trình sẽ phải khởi động lại bằng nút nhấn reset Do đó, chúng ta phải yêu cầu các em tham gia trò chơi, khi nhấn phím rồi thì phải giữ phím, không buôn ra ngay
Bạn bỏ câu lệnh: jb p1.0, $
Trường hợp muốn có thêm tính năng là chờ bỏ phím mới bắt đầu nhẩy vào chương trình ctr_1, thì Bạn thêm vào câu lệnh:
jnb p1.0, $ ; lúc này người chơi phải bỏ phím nhấn mới vào cuộc chơi
jmp ctr_1
; Đến đây chương trình sẽ nhẩy vào đoạn điều khiển các đèn báo, có tên nhãn là ctr_1
Giải thích đoạn chương trình điều khiển các đèn báo:
ctr_1:
mov p3, #00000110b ; Tắt relay 3, mở relay 2 và mở relay 1
call delay ; Chương trình làm chậm
mov p3, #00000100b ; Tắt relay 3, tắt relay 2 và mở relay 1
call delay ; Chương trình làm chậm
Trang 13jmp ctr_1 ; Tiếp tục chương trình 1
Bạn dùng câu lệnh:
mov p3, #00000110b
; Câu lệnh này đặt chân p3.0 ở mức áp thấp, các chân p3.1, p3.2 ở mức áp cao Vậy tắt đèn ở tiếp điểm lá kim K3, cho sáng đèn ở tiếp điểm lá kim K1
và K2
call delay
; Cho gọi chương trình làm chậm
mov p3, #00000100b
; Câu lệnh này đặt chân p3.0 ở mức áp thấp, chân p3.1 ở mức áp thấp , và p3.2 ở mức áp cao Vậy tắt đèn ở tiếp điểm lá kim K3 và K2, cho sáng đèn ở tiếp điểm lá kim K1
call delay
; Cho gọi chương trình làm chậm
jmp ctr_1
; Tức cho quay lại tiếp tục thực hiện các câu lệnh trên Kết quả, Bạn thấy:
Đèn trên tiếp điểm K3 đã tắt
Đèn trên tiếp điểm K1 sáng
Đèn trên tiếp điểm K2 sẽ nhấp nháy
….và trạng thái này được giữ cho đến khi Bạn nhấn phím reset
Mở rộng:
Muốn tăng số phím nhấn và viết chương trình điều khiển phức tạp hơn Bạn có thể dùng ic vi điều khiển AT89C51 Với 4 port 32 chân, việc gắn các nút nhấn tất nhiên sẽ nhiều hơn và cách hiển thị sẽ hấp dẫn hơn
Sau đây là một sơ đồ phát thảo dùng ic vi điều khiển AT89C51, chỉ là một gợi ý:
Trang 14Giải thích sơ đồ mạch điện:
Sơ đồ mạch điện cho thấy cách dùng ic vi điều khiển AT89C51 làm mạch “Đố vui để học” với 16 nút nhấn Các nút nhấn gắn trên port 1 và port 3 (ở port 1
và port 3 Bạn không cần dùng các điện trở treo áp) Ở trạng thái thường, các nút nhấn hở, các chân đều ở mức 1, chương trình sẽ ở đoạn quét phím, chỉ khi có một nút nhấn nhấn xuống, thì chân đó sẽ bị cho nối masse và sẽ xuống mức 0 Chúng ta sẽ dùng lệnh nhẩy jb (jump bit) hay jnb (jump nobit) để viết chương trình dò phím, dùng để phát hiện ra vị trí của các phím đã nhấn
Trang 15Trên port 0 và port 2 dùng làm bảng đèn số để hiển thị con số thứ tự mà phím
đã nhấn Thí dụ: như khi phím 5 nhấn thì trên bảng đèn sẽ hiện ra con số 5… Sau đó bảng đèn sẽ chuyển qua làm nhiệm vụ của một đồng hồ đếm thời gian
Chúng ta dùng các chân còn lại của port 2 để điều khiển các relay (relay 1 và relay 2), các tiếp điểm lá kim của các realy dùng đóng mở các đèn, hay các chuông báo
Tóm lại:
Sau khi cho khởi động với nút Reset thì bảng đèn sẽ chuyển qua trạng thái chờ để hiển thị con số thứ tự của phím nhấn Lúc này Bạn có thể cho đèn báo nhấp nháy để chỉ là đang ở trạng thái chờ Khi có một phím nhấn xuống, trên bảng đèn sẽ hiện ra con số thứ tự của phím đã được nhấn, đèn nhấp nháy sẽ chuyển qua sáng liên tục, mạch chuông sẽ báo nhịp và bảng đèn Led 7 đoạn chuyển qua làm công việc đếm thời gian
Khi nào trả lời xong, muốn trở lại trạng thái khởi đầu thì nhấn nút Start
Trên đây là một mạch điện gợi ý mà tôi phát thảo ra để các Bạn góp ý và nếu thấy thích thì thử viết chương trình nguồn cho mạch điện này Khi có thời gian rảnh tôi sẽ trở lại chuyên đề này Chào Bạn nhé!
Tạm kết.
Bạn biết môn điện tử phát triển với tốc độ phi mã, "Nhật tân, Nhật tân, Nhật Nhật tân", nghĩa là mỗi ngày mỗi mới Cho đến hôm nay thì các kiểu mạch điện tử ráp theo cách xưa rất khó đáp ứng được với cách yêu cầu thực tế luôn cần phải nâng cấp, do đó Bạn phải làm quen với các kiểu mạch điện vi điều khiển, đặc điểm của loại mạch dùng ic vi điểu khiển là cấu trúc phần cứng đơn giản, ít thay đổi, nhưng công năng của nó có thể thay đổi dễ dàng,
mở rộng ứng dụng bằng các phần mềm, tức thay đổi hay thêm vào các chức năng mới chỉ bằng các câu lệnh (mà không phải đụng đến phần cứng) Trong các bài viết sau này, tôi sẽ thường xuyên trình bày cách thiết kế và lắp ráp các kiểu mạch điện này, mong Bạn vào đọc
Trang 16Nhắn với các Bạn gửi e-mail về cho Vương Khánh Hưng
Người soạn rất vui khi nhận và xem các thư e-mail của nhiều Bạn, qua các điện thư này, biết được các yêu cầu, ý muốn của Bạn qua đó để định hướng cho các bài viết trong trang web phuclanshop.com
Có Bạn đưa ra các câu hỏi ngắn thôi nhưng nội dung lại rất cao xa, như Bạn biết, để trả lời tốt một "vấn đề kỹ thuật cụ thể" cần rất nhiều thời gian và công sức, do đó rất khó trả lời nhanh và trả lời riêng cho từng Bạn được, tôi
sẽ rất cố gắng chọn ra các câu hỏi mà nhiều người đang muốn biết để trả lời bằng các bài viết trên trang web này, mong Bạn thông cảm khi không nhận được các thư hồi âm riêng biệt
Sau cùng, cũng thật tình tâm sự với Bạn, người soạn trình độ có hạn, hiểu biết có khi cũ kỷ nên còn nhiều vấn đề còn rất mù mờ, như vậy rất khó tránh "là khi nói nhiều dễ sai, nói thiếu", rất mong được các Bạn thông cảm
và chân tình viết thư chỉ bảo Đa tạ, xin đa tạ
N