(028) 66844775 - 0902760910 banhang@phuclanshop.com
Danh mục sản phẩm

Trả lời thư: Cách làm mạch điện "Đố vui để học" dùng AT89C2051 với 8 nút nhấn

29 Tháng Tám 2015

Rấ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:


Kinh chao thay Hung !
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 kè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).

 

 

 

 

 Phâ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 bá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

 

q3:                                          ; 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

 

        call 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).

 

 

 

 

 

 Kế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.

 

 

 

 

Đâ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:

 

 

http://phuclanshop.com/TraoDoiHocTap-ChiTiet.aspx?NewsId=80

  

  

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 sá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)

 

 

 

 

 

Chú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

 

 

Giả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.

 

Ghi chú:Nếu không muốn có tính năng này phải giữ phím nhấn đủ lâu, thì 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    

        jmp 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 ý:

 

 

 

Giả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.

 

Trê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.

 

 

 

 Nhắ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ạ...

 

 

 

Người soạnmời Bạn vào xem...

 

 

Và cũng với câu nhắn quen thuộc là...

 

 

 

 

 

   

Vui lòng để lại bình luận
  • online support profile

    vivian.wang.yun

    Kinh doanh linh kiện và thiết bị ngành điện tử và điều khiển điện
Top