Cách dùng phím kiểu ma trận

Một phần của tài liệu Ứng dụng ic lập trình AT89C51 (Trang 27 - 46)

Chúng ta sẽ viết chương trình nguồn cho kiểu bàn phím ma trận 4x4 như hình vẽ.

Trong bài thực hành này, chúng ta sẽ cho lấy mã có trong bảng xuất ra trên cảng p3 khi nhấn một trong các phím trên ma trận 4x4.

org 0000h ; Khởi đầu từ thanh nhơ 0000h

mov p2, #11111111b ; đặt các chân Input lên 1

k1: ; tên nhãn

mov p1, #00000000b ; đặt các chân Ouput xuống 0

mov a, p2 ; chuyển hiện trạng của p2 vào a

anl a, #00001111b ; lấy logic AND để che 4 bit cao

cjne a, #00001111b, k1 ; kiểm tra xem có phím nhấn chưa?

k2: ; đặt tên nhãn

call delay ; gọi chương trình trể tránh rung phím

mov a, p2 ; chuyển trạng thái p2 vào a

anl a, #00001111b ; lấy logic AND che 4 bit cao

cjne a, #00001111b, tim_hang ; so sánh để nhẩy

jmp k2 ; nhẩy về k2

mov p1, #11111110b ; đặt hàng 0, xuống bit 0

mov a, p2 ; chuyển p2 vào a

anl a, #00001111b ; lấy logic AND, che 4 bit cao

cjne a, #00001111b, hang_0 ; so sánh để nhẩy

;

mov p1, #11111101b ; đặt hàng 1, xuống bit 0

mov a, p2 ; chuyển p2 vào a

anl a, #00001111b ; lấy logic AND, che 4 bit cao

cjne a, #00001111b, hang_1 ; so sánh để nhẩy

;

mov p1, #11111011b ; đặt hàng 2, xuống bit 0

mov a, p2 ; chuyển p2 vào a

anl a, #00001111b ; lấy logic AND, che 4 bit cao

cjne a, #00001111b, hang_2 ; so sánh để nhẩy

;

mov p1, #11110111b ; đặt hàng 3, xuống bit 0

mov a, p2 ; chuyển p2 vào a

anl a, #00001111b ; lấy logic AND, che 4 bit cao

cjne a, #00001111b, hang_3 ; so sánh để nhẩy

;

hang_0: ; tìm ra một trong 4 phím hàng 0 mov dptr, #m_hang_0

jmp tim_phim ; qua trình tìm phím

hang_1: ; tìm ra một trong 4 phím hàng 1 mov dptr, #m_hang_1

jmp tim_phim ; qua trình tìm phím

hang_2: ; tìm ra một trong 4 phím hàng 2 mov dptr, #m_hang_2

jmp tim_phim ; qua trình tìm phím

hang_3: ; tìm ra một trong 4 phím hàng 3 mov dptr, #m_hang_3

jmp tim_phim ; qua trình tìm phím

;

tim_phim: ; đặt tên nhãn cho trình tìm phím

rrc a ; cho 8 bit trong a quay vòng có qua bit cờ C

jnc out ; kiểm tra bit 0 vào bit cờ C để nhẩy

inc dptr ; cho tăng tri trong bảng lên một nhip

jmp tim_phim ; quay lại tên nhãn tim_phim

out: ; đặt tên nhãn

clr a ; xóa sạch tri trong thanh a

movc a, @a+dptr ; lấy mã trong bảng theo a và cất vào a

mov p3, a ; chuyển kết quả ra cảng p3

jmp k1 ; nhẩy về k1

m_hang_0: ; đặt tên bảng

db 01h, 02h, 03h, 04h ; mã trong bảng hàng 0

m_hang_1: ; đặt tên bảng

db 05h, 06h, 07h, 08h ; mã trong bảng hàng 1

db 09h, 0ah, 0bh, 0ch ; mã trong bảng hàng 2

m_hang_3: ; đặt tên bảng

db 0dh, 0eh, 0fh, 00h ; mã trong bảng hàng 3 ;

delay: ; trình làm trể

mov r5, #100 ; đặt tri 100 vào thanh ghi r5

v_r6: ; đặt tên nhãn cho lệnh nhẩy

mov r6, #100 ; đặt tri 100 vào thanh ghi r6

djnz r6, $ ; giảm theo bươc -1 tri trong r6 cho đến khi bằng 0

djnz r5, v_r6 ; giảm tri trong r5 theo bươc -1, r5=0?, chọn hương nhẩy

ret ; quay lại sau lệnh call delay

end ; dừng biên dich tại dòng này

Giải thích cách dùng các câu lệnh trên:

Nhắn Bạn: Mã xuất theo phím nhấn đặt trong các bảng: m_hang_0,

m_hang_1, m_hang_2 và m_hang_3. Vậy nếu Bạn muốn dùng các mã để điều khiển các thiết bi theo bảng 16 phím nhấn này, thì các mã điều khiển do Bạn tạo ra hãy cho cất trong các bảng theo đúng vi trí. Vậy, khi Bạn nhấn phím 0 sẽ có mã 0 xuất ra trên cảng p3, nhấn phím 1 sẽ có mã 1 xuất ra trên cảng p3, nhấn phím 2 sẽ có mã 2 xuất ra trên cảng p3....Bạn sẽ có 16 mã điều khiển ứng vơi 16 phím nhấn.

Nếu Bạn dùng ma trận 8 chân trên cảng p1 làm 8 hàng và dùng 8 chân

trên cảng p2 làm 8 cột. Bạn sẽ có ma trận 8x8, trên ma trận này Bạn có thể gắn

đến 64 phím nhấn và như vậy Bạn có thể có đến 64 mã lệnh dùng để điều khiển các thiết bi. Phải không?

Mở rộng: Nhập tín hiệu vào ic lập trình lấy từ các bộ cảm

Chúng ta biết trong thiên nhiên có rất nhiều "thực thể" không thuộc điện, vậy nếu muốn đưa các "thực thể" này vào các ic lập trình, chúng ta phải dùng đến các sensor, quen gọi là các cảm biến. Phần tiếp theo chúng ta sẽ tìm hiểu một vài cảm biến thường dùng, dễ tìm, trong việc biến đổi các đại lượng không thuộc điện ra điện và tìm cách chuyển các đại lượng này vào ic lập trình để được xử lý.

Trước hết, hãy nói đến cảm biến quang.

Chúng ta biết, ánh sáng là một thực thể rất phổ biến, chúng ta nhận biết ánh sáng bằng các tế bào thi giác đặt ở mắt. Trong kỹ thuật điện tử, người ta cũng chế tạo được nhiều bộ cảm biến có thể chuyển đổi ánh sáng ra dạng tín hiệu điện, như: quang trở, quang diode, pin quang điện... Ở đây chúng ta thử dùng quang cảm biến để tạo ra các tín hiệu cho nhập vài ic lập trình và viết

các chương trình nguồn dùng để điều khiển các thiết bi theo quang năng

Quang trở là một điện trở, nghĩa là nó có thể cho dòng điện chảy qua theo cả hai chiều như nhau, Bạn cũng có thể dùng quang trở kết hợp vơi các điện trở khác làm thành các cầu chia áp. Quang trở khi bi chiếu sáng sẽ giảm ohm, do vậy nó sẽ làm thay đổi cường độ dòng điện chảy qua nó. Trong các máy ảnh người ta thường dùng quang trở và máy đo dòng để làm thiết bi đo cường độ ánh sáng. Trong các TV đời mơi, người ta dùng quang trở làm thiết bi tự động điều chỉnh mức sáng của màn hình tùy theo mức sáng của phòng. Trong các

đầu dò PIR, người ta dùng quang trở để cho mở mạch tắt mở sáng mỗi khi trời về tối, người ta dùng quang trở vơi các kính lọc màu để làm các bộ cảm biến dò tìm màu...Bạn có thể dùng một Ohm kế thông thường để kiểm tra các quang trở. Khi đo ohm, nếu cho chiếu sáng, quang trở sẽ giảm ohm và khi bi che sáng quang trở sẽ tăng ohm.

Photo diode, hay diode hồng ngoại vốn là một mối nối bán dẫn PN, nó có đặc

tính làm thay đổi cường độ dòng điện mỗi khi mối nối PN bi kích sáng. Trong mạch, photo diode thường cho ghép vơi một điện trở lơn ohm, nó đặt ở trạng thái phân cực nghich. Khi bi che sáng, photo diode dẫn điện yếu và khi bi chiếu sáng, nó sẽ dẫn điện mạnh hơn. Ở trạng thái phân cực thuận, nó cũng có tính ghim áp như các diode thông thường khác. Photo diode có hoán tính nhỏ,

cho thay đổi nhanh, nên người ta thích dùng photo diode trong các thiết bi điều khiển hồng ngoại, dùng trong các thiết bi điều khiển tốc độ quay của các motor, dùng trong mạch đo tốc. Bạn cũng có thể dùng ohm kế thông thường để kiểm tra các photo diode, dùng thang đo Rx10K, lúc này điện áp có trên 2 dây đo là 12V, đặt photo diode vào dây đo theo kiểu phân cực nghich, dùng một hộp điều khiển Remote thông dụng, cho phát lệnh điều khiển, chiếu remote vào photo diode, Bạn sẽ thấy kim máy đo rung theo xung lệnh, dấu hiệu này cho biết photo diode còn tốt. Photo diode có rất nhiều trong các đầu máy hát băng hình.

Diode Laser, vốn là một mối nối bán dẫn PN, khi bi kích thích, cấp dòng, nó sẽ phát ra thứ ánh sáng Laser. Ánh sáng Laser khác vơi ánh sáng thường là các tia sáng phát ra có tính đồng pha, nghĩa là nó tác kích vào các vật cản vơi pha giống nhau, nhờ vậy khi Bạn cho hội tụ các chùm tia sáng Laser tại một điểm nhỏ, tại điểm này cường độ sáng vẫn sẽ rất mạnh và rất nóng (Điều này sẽ không làm được vơi loại ánh sáng thường), nên điểm hội tụ gọi là tiêu

điểm (tiêu 焦 có nghĩa là điểm nóng). Ngày nay người ta dùng điểm sáng Laser để đọc lại các điểm tín hiệu lồi lõm rất nhỏ đã đặt trên các vòng quay nằm trên các mặt đĩa CD hay DVD. Tia sáng Laser còn dùng làm tia chiếu đinh vi cho các máy ngắm, và vơi các chùm tia laser có cường độ mạnh, nó còn dùng làm vũ khí tấn công đốt cháy các vật bay. Bạn có thể dùng một Ohm kế thông thường để đo các diode Laser. Lấy thang đo Rx1 để có dòng chảy ra trên 2 dây đo lơn, trên 100mA, khi đo, diode Laser được cho phân cực thuận, bên trong sẽ ánh lên một điểm sáng màu đỏ rất nhỏ. Khi xử dụng các diode Laser, Bạn tránh nhìn thẳng vào tia sáng Laser vì mức sáng quá mạnh có thể làm hư mắt.

Opto là các bộ ghép quang điện. Người ta cho tổ hợp một bên là diode phát quang, phát ra tia sáng hồng ngoại và một bên là quang transistor dùng thâu nhận tia sáng hồng ngoại. Hai thành phần này có thể đặt trên hai mạch điện riêng biệt cách ly nhau, và trao đổi thông tin vơi nhau qua các tia sáng của bên phát và của bên nhận. Opto có 2 dạng: dạng đóng kín và dạng để hở. Dạng đóng kín thường dùng để trao đổi thông tin giữa các bo mạch, và dạng để hở thường dùng để phát hiện các vật thể, như: dò tìm vật quay, dò tìm các chuyển động, dò tìm các đường kẻ, dùng để đo tốc...Bạn có thể tìm thấy các loại opto có trong các mạch điều khiển và dĩ nhiên, Bạn cũng có thể dùng Ohm kế để đo kiểm tra các opto. Dùng tính thuận (kim lên) nghich (kim không lên) để kiểm tra quang diode trong opto, rồi tìm cách cho cấp dòng qua quang diode, dùng ohm kế đo thuận nghich trên quang transistor để kiểm tra bên nhận.

Solar Cell hay pin mặt trời, là một bộ chuyển đổi năng lượng, nó chuyển đổi quang năng ra dạng điện năng. Khi trên mặt pin solar cell được chiếu sáng, trên các dây cực âm và dương sẽ xuất hiện điện áp, mức áp thường biến đổi theo cường độ sáng và tùy theo nội trở của tải. Trong ứng dụng người ta thường dùng pin mặt trời phát ra điện năng để nạp tích trữ vào các nguồn pin charge, và dùng nguồn pin này để thắp sáng hay làm quay các motor. Chúng ta thường thấy trên các máy tính số (calculator) có trang bi lá pin mặt trời để có thể vận hành trong các nguồn sáng trong phòng. Ngày nay, người ta có nhiều nghiên cứu về cách khai thác dùng năng lượng sạch, như nắng như gió, vơi nắng pin mặt trời là không thể thiếu được. Ngày mai, vơi các tấm pin hiệu suất cao, người ta sẽ có thể dùng điện lấy từ nguồn sáng tự nhiên, đó là ánh nắng vô tận của thái dương. Bạn hãy dùng một Volt kế thông thường để đo kiểm tra

các Solar Cell, và dùng các Led để kiểm tra khả năng cấp tải của các pin mặt trời.

Khảo sát: Cách dùng cảm biến quang điện để tạo xung nhip đưa vào ic lập

Trong sơ đồ này chúng ta dùng bộ đếm của timer 0 chạy ở mode 2 để đếm xung nhip đưa vào trên chân p3.4, tức chân T0, để đơn giản quá bài thực hành chúng ta chỉ dùng số đếm trong thanh tl0, nghĩa là đếm tối đa 255 nhip và quay lại. Kết quả đếm sẽ cho hiển thi trên bảng đèn số dùng mã 7 đoạn.

Mạch dùng cảm biến quang điện, chúng ta dùng Led hồng ngoại cho chiếu sáng vào một quang transistor, bình thường quang transistor dẫn điện, nó kích dẫn Q1 và tạo mức áp cao trên chân T0, khi có người đi qua, tia sáng bi che và làm cho quang transistor ngưng dẫn, Q1 tắt và mức áp trên chân p3.4 giảm xuống mức áp 0V và lúc này xung nhip vào thanh ghi tl0, thanh ghi tl0 sẽ tiếp tục tích cất số liệu này và luôn cho hiển thi kết quả con số có trong tl0 trên bảng đèn số.

Chương trình nguồn này đơn giản, dùng cho thực hành, tìm hiểu cách viết các câu lệnh cơ bản:

; Chú thích

; a,b,c,d,e,f,g -> Đèn số 7 đoạn trên Port 2 ; P3.0 -> đèn LED1 hàng đơn vi

; P3.1 -> đèn LED2 hàng chục ; P3.2 -> đèn LED3 hàng trăm ; P3.4(T0) -> cảm biến quang điện ; 30h ; thanh ghi giữ số hàng đơn vi ; 31h : thanh ghi giữ số hàng chục ; 32h : thanh ghi giữ số hàng trăm

; Chỉ đếm vơi thanh tl0, trong đó hàng đơn vi đếm đến 10, hàng chục đến 5 hàng trăm đến 2. ORG 0000h SJMP MAIN ORG 0030H MAIN:

MOV DPTR,#LED7SEG ; vào bảng lấy mã hiện số trên đèn 7 đoạn

MOV TMOD,#06h ; counter 0, mode 2, đếm xung vào trên chân T0

MOV TH0,#0C4H ; nạp tri vào thanh th0

SETB P3.0 ; tắt đèn số hàng đơn vi

SETB P3.1 ; tắt đèn số hàng chục

SETB P3.2 ; tắt đèn số hàng trăm

SETB P3.4 ; xung đếm vào ở chân này, T0

SETB TR0 ; mở mạch cho xung đếm vào thanh ghi tl0

BEGIN:

MOV A,TL0 ; cho chuyển tri trong tl0 vào thanh ghi a

CALL BIN2BCD ; gọi chương trình đổi số ra dạng thập phân

MOV A,30h ; chuyển tri có trong thanh 30h vào thanh ghi a

CJNE A, #10,qua1 ; so sánh tri trong a vơi số 10, để đinh hương nhẩy

MOV A,#00H ; trả tri trong a về 0

qua1: ; đặt tên nhãn cho lệnh nhẩy

MOVC A,@A+DPTR ; lấy tri trong bảng cho vào thanh ghi a

MOV 30h,A ; cất tri trong a vào thanh 30h

MOV A,31h ; chuyển tri có trong thanh 31h vào thanh ghi a

CJNE A,#6,qua2 ; so sánh tri trong a vơi số 6, để chọn hương nhẩy

MOV A,#00 ; trả tri trong a về 0

qua2: ; đặt tên nhãn cho lệnh nhẩy

MOVC A,@A+DPTR ; lấy tri trong bảng cho vào thanh ghi a

MOV 31h,A ; cất tri trong a vào thanh 31h

MOV A,32h ; chuyển tri có trong thanh 32h vào thanh ghi a

CJNE A,#1, qua3 ; so sánh tri trong a vơi số 1, để chọn hương nhẩy

MOV A,#00H ; trả tri trong a về 0

MOVC A,@A+DPTR ; lấy tri trong bảng cho vào thanh ghi a

MOV 32h,A ; cất tri trong a vào thanh 32h

KET_THUC: ; đặt tên nhãn

CALL DISPLAY ; cho gọi chương trình hiển thi số

JMP BEGIN ; trở lại tên nhãn begin

DISPLAY: ; trình hiển thi số trên bảng đèn

MOV P1,30H ; xuất tri trong thanh 30h ra cảng p1

CLR P3.0 ; mở đèn hàng đơn vi

CALL DELAY ; gọi delay

SETB P3.0 ; tắt đèn tránh lem

MOV P1,31H ; xuất tri trong thanh 31h ra cảng p1

CLR P3.1 ; mở đèn Led hàng chục

CALL DELAY ; gọi delay

SETB P3.1 ; tắt đèn tránh lem

MOV P1,32H ; xuất tri trong thanh 32h ra cảng p1

CLR P3.2 ; mở đèn Led hàng trăm

CALL DELAY ; gọi delay

SETB P3.2 ; tắt đèn tránh lem

RET

BIN2BCD: ; trình làm phép toán đổi tri nhi phân ra dạng số thập phân

MOV B,#10 ; đặt tri 10 vào thanh b, để làm phép toán chia 10

DIV AB ; chia tri trong a cho 10

MOV 30h,B ; cất kết quả trong b vào thanh 30h

MOV B,#10 ; đặt tri 10 vào thanh b, để làm phép toán chia 10

DIV AB ; chia tri trong a cho 10

MOV 31H,B ; cất kết quả trong b vào thanh 31h

MOV 32h,A ; cất kết quả trong a vào 32h

RET ; quay lại sau lệnh gọi call bin2bcd

DELAY: ; đặt tên nhãn cho lệnh nhẩy

Một phần của tài liệu Ứng dụng ic lập trình AT89C51 (Trang 27 - 46)

Tải bản đầy đủ (DOCX)

(46 trang)
w