89C51 điều khiển Motor qua phím nhấn

23
89C51 điều khiển Motor qua phím nhấn ĐƯA LÊN FACEBOOK MCU 8051 LẬP TRÌNH HỢP NGỮ ASM NGÀY ĐĂNG DUYPHI LƯỢT XEM: 753 Một thí dụ về cách dùng các phím nhấn đơn lập

Transcript of 89C51 điều khiển Motor qua phím nhấn

Page 2: 89C51 điều khiển Motor qua phím nhấn

Phân tích mạch:

 

Sơ đồ cho thấy, chúng ta cấp điện cho ic lập trình AT89C51 với chân 20 cho nối masse và chân 40

cho nối vào đường nguồn 5V. Trên chân 9 gắn tụ C1 (10uF) và điện trở R1 (10K) dùng tạo tính

năng reset mỗi khi mạch được cấp nguồn. Trên chân 18, 19 gắn thạch anh định tần, chúng ta dùng

thạch anh 12MHz. Để mạch chỉ làm việc với bộ nhớ trong chúng ta cho chân 31 nối vào đường

nguồn 5V.

 

Đề làm thực hành với các phím nhấn đơn lập, chúng ta dùng 4 phím nhấn, gắn trên các chân p1.2,

p1.3, p1.4, p1.5 của Port p1 và gắn 8 Led trên Port p3 để hiển thị tác dụng của các phím nhấn.

 

Ở đây chúng ta sẽ tạo tính năng cho 4 phím nhấn như sau: phím S1 cho mở phím, phím S4 cho tắt

phím, phím S2 cho 8 Led trên p3 tuần tự dời qua phải và phím S3 cho 8 Led trên p3 dời qua trái.

 

 

Tóm lại công dụng của các phím như sau: 

 

* Nhấn nút S1 vào mode khởi động, cho mở phím.

 

* Nhấn nút S2, 8 Led trên Port p3 dời bit qua phải

 

* Nhất nút S3, 8 Led trên Port p3 dời bit qua trái

 

* Nhấn nút S4 vào mode tắt phím 

 

 

Page 3: 89C51 điều khiển Motor qua phím nhấn

Chương trình nguồn:

 

 

 

UpDown EQU 00H ; đặt tên bit 00h là updown

StartEnd EQU 01H ; đặt tên bit 01h là startend

LAMPCODE EQU 21H ; đặt tên thanh ghi 21h là lampcode

ORG 0000H  ; địa chỉ thanh ghi khởi đầu

JMP MAIN  ; nhẩy đến tên nhãn

ORG 30H  ; vùng địa chỉ bên ngoài chức năng ngắt

 

MAIN:  ; đặt tên nhãn dùng cho lệnh nhẩy

MOV SP,#5FH  ; chọn địa chỉ làm ngăn xếp

MOV P3,#0FFH ; đặt trị 11111111b vào Port p3 để tắt 8 led

; điều kiện khởi đầu

CLR UpDown ; đặt bit 0 vào bit updown

CLR StartEnd ; đặt bit 0 vào bit startend

MOV LAMPCODE,#0FEH ; chuyển trị 11111110b vào lampcode

 

LOOP:  ; đặt tên nhãn dùng cho lệnh nhẩy

CALL KEY ; gọi chương trình dò phím, tên nhãn key

JNB F0,LNEXT ; cho nhẩy theo bit f0

CALL KEYPROC ; gọi chương trình xử lý phím

 

LNEXT:  ; đặt tên nhãn dùng cho lệnh nhẩy

CALL LAMP ; gọi chương trình điều khiển 8 Led trên Port p3

JMP LOOP ; quay lại tên nhãn loop

 

DELAY: ; chương trình tạo trể

MOV R7,#100  ; đặt trị 100 vào thanh ghi r7

 

Page 4: 89C51 điều khiển Motor qua phím nhấn

D1:      ; đặt tên nhãn dùng cho lệnh nhẩy

MOV R6,#100 ; đặt trị 100 vào thanh ghi r6

DJNZ R6,$   ; nhẩy tại chổ, chờ trị trong r6 bằng 0

DJNZ R7,D1  ; giảm trị trong r7 theo bước -1, r7=0?, định hướng nhẩy

RET  ; qua lại sau lệnh call delay

 

;----------------------------------------

KEYPROC:   ; chương trình xử lý phím

MOV A,B ;   chuyển trị trong b vào thanh ghi a

JB ACC.2,KeyStart ; xét bit acc.2 để định hướng nhẩy 

JB ACC.3,KeyOver  ; xét bit acc.3 để định hướng nhẩy

JB ACC.4,KeyUp  ; xét bit acc.4 để định hướng nhẩy

JB ACC.5,KeyDown ; xét bit acc.5 để định hướng nhẩy

JMP KEY_RET  ; nhẩy về tên nhãn key_ret

 

KeyStart:   ; trình vào mode khởi động

SETB StartEnd ; đặt bit startend lên 1, cho khởi động

JMP KEY_RET  ; nhẩy đến tên nhãn key_ret

 

KeyOver:  ; trình cho tắt, kết thúc

CLR StartEnd ;  đặt bit startend xuống 0, kết thúc

JMP KEY_RET  ; nhẩy đến tên nhãn key_ret

 

KeyUp:  ; trình cho 8 Led dời qua phải

SETB UpDown ; đặt bit updown lên 1, dời qua phải

JMP KEY_RET ; nhẩy đến tên nhãn key_ret

 

KeyDown:  ; trình cho 8 Led dời qua trái

CLR UpDown ; đặt bit updown xuống 0, dời qua trái

 

KEY_RET:  ; đặt tên nhãn dùng cho lệnh nhẩy

RET  ; quay lại sau lệnh call keyproc

Page 5: 89C51 điều khiển Motor qua phím nhấn

 

KEY:   ; đặt tên nhãn dùng cho lệnh nhẩy, trình dùng dò phím

CLR F0 ;  xóa bit f0

ORL P1,#00111100B ; lấy logic OR trị 00111100b và Port p1

MOV A,P1 ;  chuyển trị hiện có của p1 vào thanh ghi a

ORL A,#11000011B ; lấy logic OR a và 11000011b, xét trạng thái 4 phím

CPL A ;  lấy bù a, đảo 8 bit trong thanh ghi a

JZ K_RET ; xét trị trong thanh a, có bằng 0 không? để nhẩy

CALL DELAY ; cho gọi chương trình trể

OR P1,#00111100B  ; lại lấy logia OR trị 00111100b cho Port p1

MOV A,P1 ; lại chuyển trị hiện có của Port p1 vào thanh ghi a

ORL A,#11000011B ; cho lấy logic OR trị trong a và trị 11000011b

CPL A   ; lại cho bù a, đảo 8 bit trong thanh ghi a

JZ K_RET  ; lại xét trị trong thanh a, có bằng 0? để nhẩy

MOV B,A ; chuyển trị trong a vào thanh b

SETB F0 ; đặt bit kiểm tra f0 lên 1, báo đã có phím nhấn

 

K_RET:  ; đặt tên nhãn dùng cho lệnh nhẩy

ORL P1,#00111100B ; Lấy logic OR trị hiện có trong p1 và 00111100b

MOV A,P1   ; chuyển trị hiện có trên Port p1 vào thanh ghi a

ORL A,#11000011B  ; lấy logic OR trị trong a và 11000011b

CPL A  ; lấy bù a, đảo 8 bit trong thanh ghi a

JZ K_RET1 ; xét trị trong a có bằng 0 không? để nhẩy

JMP K_RET  ; nhẩy đến tên nhãn k_ret

 

K_RET1: ; đặt tên nhãn dùng cho lệnh nhẩy

RET   ; quay lại sau lệnh call key

 

D500MS: ; chương trình làm trể

PUSH PSW  ; tạm cho cất trị trong thanh ghi psw vào ngăn xếp

SETB RS0  ; đặt trị rs0 trong thanh ghi trạng thái psw lên 1

MOV R7,#200  ; chuyển trị 200 vào thanh ghi r7

 

D51:  ; đặt tên nhãn dùng cho lệnh nhẩy

Page 6: 89C51 điều khiển Motor qua phím nhấn

MOV R6,#250  ; đặt trị 250 vào thanh ghi r6

 

D52:  ; đặt tên nhãn dùng cho lệnh nhẩy

NOP ; dòng không tác vụ

NOP ; dòng không tác vụ

NOP ; dòng không tác vụ

NOP ; dòng không tác vụ

DJNZ R6,D52  ; giảm trị trong r6 theo bước -1, r6=0?, chọn hướng nhẩy

DJNZ R7,D51  ; giảm trị trong r7 theo bước -1, r7=0?, chọn hướng nhẩy

POP PSW  ; lấy lại trị trước đó cho thanh ghi psw

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

 

LAMP:  ; chương trình điều khiển 8 Led trên Port p3

JB StartEnd,LampStart ; chọn hướng nhẩy theo bit startend

MOV P3,#0FFH  ; đặt trị 11111111b vào Port p3, tắt hết 8 Led

JMP LAMPRET ;  nhẩy về tên nhãn lampret

 

LampStart:  ; đặt tên nhãn cho lệnh nhẩy, trình dời 8 bit trong a qua trái

JB UpDown,LAMPUP ; nhẩy theo bit updown

MOV A,LAMPCODE ; chuyển trị trong lampcode cho thanh ghi

RL A ;  cho quay vòng 8 bit trong thanh ghi aqua hướng trái

MOV LAMPCODE,A ; chuyển trị trong a vào lampcode

MOV P3,A   ; cho xuất trị trong a ra Port p3

CALL D500MS  ; gọi chương trình làm chậm d500ms

JMP LAMPRET  ; nhẩy về tên nhãn lampret

 

LAMPUP:  ; đặt tên nhãn cho lệnh nhẩy, trình cho dời 8 bit qua phải

MOV A,LAMPCODE  ; chuyển trị trong lampcode vào thanh ghi a

RR A ;  cho quay vòng 8 bit trong a qua hướng phải

MOV LAMPCODE,A  ; chuyển trị trong a vào lampcode

MOV P3,A  ; xuất trị trong a ra Port p3

CALL D500MS  ; cho gọi chương trình trể d500ms

 

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

Page 7: 89C51 điều khiển Motor qua phím nhấn

RET  ; quay lại sau lệnh call

END  ; dừng biên dịch tại dòng này

 

 

Phân tích cách viết các câu lệnh chương trình nguồn trên:

 

 

 

 

 

Tìm hiểu thêm một cách viết khác. Bạn xem thí dụ sau: 

 

Trong thí dụ này, chúng ta gắn 4 phím trên Port p3 và dùng các phím này điều khiển trạng thái nhấp

nháy của 8 Led đặt trên Port p1.

 

Page 8: 89C51 điều khiển Motor qua phím nhấn

 

 

Page 9: 89C51 điều khiển Motor qua phím nhấn

 

 

Chương trình nguồn viết như sau:

 

ORG 0000H   ; Khởi đầu từ thanh ghi 0000h

    LJMP START  ; nhẩy đến tên nhãn start

; các thanh ghi chuyên dùng cho chức năng ngắt

ORG 0003H  ; vị trí chạy ngắt INT0

    RETI

ORG 000BH  ; vị trí chạy ngắt TF0

    RETI

ORG 0013H  ; vị trí chạy ngắt INT1

    RETI

Page 10: 89C51 điều khiển Motor qua phím nhấn

ORG 001BH  ; vị trí chạy ngắt TF1

    RETI

ORG 0023H  ; vị trí chạy ngắt RI var TI

    RETI

;

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

    RET

;

START:   ; đặn tên nhãn cho khời đầu

   CALL CLEAR  ; gọi chương trình clear

; trình dò phím

STAR1:  ; đặt tên nhãn dùng cho lệnh nhẩy

    MOV P3,#0FFH  ; đặt trị 11111111b vào p3, định trạng thái đầu

    JNB P3.4,FUN0  ; dò bit 0 trên chân p3.4, để nhẩy

    JNB P3.5,FUN1  ; dò bit 0 trên chân p3.5 để nhẩy

    JNB P3.2,FUN2  ; dò bit 0 trên chân p3.2 để nhẩy

    JNB P3.3,FUN3  ; dò bit 0 trên chân p3.3 để nhẩy

    JNB F0,STAR1   ; nhẩy theo bit f0, f0=1, có nhấn phím

    RET  ; quay lại sau lệnh call start

;

FUN0:  ; tên nhãn dùng cho phím p3.4

    CALL DL10MS ; gọi chương trình trể 10ms, tránh rung phím

    JB P3.4,STAR1  ; kiểm tra lại phím nhấn trên p3.4

WAITL0:   ; trình chờ bỏ phím 

    JNB P3.4,WAITL0 ; chờ bỏ phím

    SETB F0  ; đặt bit kiểm tra f0 lên 1

FUN01:  ; đặt tên nhãn dùng cho lệnh nhẩy

    CALL FUN00  ; cho gọi chương trình fun00

    CALL STAR1  ; quay lại tên nhãn star1

    JMP FUN01   ; nhẩy về tên nhãn fun01

; Viết tương dạng như trên

FUN1:

    CALL DL10MS ;

    JB P3.5,STAR1

WAITL1:

    JNB P3.5,WAITL1 ;

    SETB F0

FUN10:

    CALL FUN11

    CALL STAR1

   JMP FUN10

Page 11: 89C51 điều khiển Motor qua phím nhấn

; Viết tương dạng như trên

FUN2:

   CALL DL10MS ;

   JB P3.2,STAR1

WAITL2:

   JNB P3.2,WAITL2 ;

   SETB F0

FUN20:

   CALL FUN22

   CALL STAR1

   JMP FUN20

; viết tương dạng như trên

FUN3:

   CALL DL10MS ; gọi trể 10ms tránh ảnh hưởng của rung phím

   JB P3.3,STAR1 ; kiểm tra lần nữa phím trên p3.3

WAITL3:   ; tên nhãn

   JNB P3.3,WAITL3 ; chờ bỏ phím ra

   CLR F0   ; xóa bit f0, về trạng thái chờ nhấn phím

   MOV P1,#0FFH ; đặt trị 11111111b để tắt 8 Led trên p1

   JMP STAR1  ; quay lại tên nhãn star1

;  trình cho Led sáng lan lên

FUN00:  

   MOV A,#0FEH

FUN000:

   MOV P1,A

   CALL DL05S

   JNB ACC.7,OUT

   RL A

   JMP FUN000

OUT: RET

;  trình cho các Led sáng nhẩy

FUN11:

   MOV A,#0FEH

FUN111:

   MOV P1,A

   CALL DL05S

   JZ OUT

   RL A

Page 12: 89C51 điều khiển Motor qua phím nhấn

   ANL A,P1

   JMP FUN111

; trình cho các 4 Led nhấp nháy xen kẻ 

FUN22:

   MOV A,#0AAH

   MOV P1,A

   CALL DL30S

   CPL A

   MOV P1,A

   CALL DL30S

   RET

; chương trình làm trể

DL512:

   MOV R2,#0FFH

LOOP1: 

   DJNZ R2,LOOP1

   RET

DL10MS:

   MOV R3,#14H

LOOP2: 

   CALL DL512

   DJNZ R3,LOOP2

   RET

DL05S:

   MOV R4,#0AH

LOOP3: 

   CALL DL10MS

   DJNZ R4,LOOP3

   RET

DL30S:

   MOV R5,#03H

LOOP4:

   CALL DL05S

   DJNZ R5,LOOP4

   RET

end 

 

 

Page 13: 89C51 điều khiển Motor qua phím nhấn

 

 

 

Một thí dụ khác nữa: Dùng 8 phím trên Port 1 để điều khiển các động thái của một motor DC

 

Trước hết tìm hiểu nguyên lý vận hành của các thành phần dùng trong mạch điện:

 

1. Tìm hiểu ic điều khiển motor:

 

 

IC BA6209 có 10 chân, công dụng của các chân như sau:

Page 14: 89C51 điều khiển Motor qua phím nhấn

 

Chân 1 cho nối masse, chân 7 cho nối nguồn VCC1, chân 8 lấy nguồn VCC2 qua một điện trở 10

ohm. Mức áp chuẩn định tốc độ quay chọn theo diode Zener trên chân số 4. Chân số 3 và số 9 mắc

tụ lọc và chân số 2 và chân số 10 cấp điện cho motor. Ngang motor gắn một tụ lọc nhiễu ồn phát ra

từ motor. Tín hiệu điều khiển đưa vào trên chân 5 và chân 6. Bản logic cho thấy:

 

* Khi chân 5 Fin và chân 6 Rin đều ở mức áp thấp, thì mức áp ngả ra trên chân 2, 10 đều ở mức áp

thấp: Motor không quay.

 

* Khi chân Fin ở mức áp cao, chân Rin ở mức áp thấp, thì chân 2 ở mức cao và chân 10 ở mức áp

thấp: Motor quay thuận.

 

* Khi chân Fin ở mức áp thấp, chân Rin ở mức áp cao, thì chân 2 ở mức thấp và chân 10 ở mức áp

cao: Motor quay ngược.

 

* Khi chân 5 Fin và chân 6 Rin đều ở mức áp cao, thì mức áp ngả ra trên chân 2, 10 đều ở mức áp

thấp: Motor không quay. 

 

Phân tích trên cho thấy, chúng ta có thể dùng 3 chân 4, 5, 6 của ic lập trình để điều khiển các trạng

thái quay của motor

 

 

 2. Tìm hiểu nguyên lý làm việc của motor DC.

 

Motor DC gồm có:

 

* Phần tĩnh là một nam châm vĩnh cữu, đặt cố định, một bên là cực nam thì bên kia là cực bắc.

Page 15: 89C51 điều khiển Motor qua phím nhấn

 

* Phần quay gồm có các cuộn dây ứng quấn trên các từ cực. Trên trục quay người ta đặt một cổ lấy

điện bằng các vòng đồng, dùng chổi than đè lên cổ lấy điện để cấp điện cho các cuộn dây ứng đặt

trên phần quay, cuộn dây có điện sẽ trở thành các nam châm điện.

 

Do tương tác, các nam châm (ở đây là nam châm vĩnh cữu của phần tĩnh và nam châm điện

trên phần quay) đặt gần nhau, khi có tên cực giống nhau sẽ đẩy nhau và khác tên thì sẽ hút nhau,

điều này sẽ làm quay phần ứng, khi phần ứng quay nó đồng thời làm quay cổ lấy điện, điều này sẽ

làm đảo chiều dòng chảy qua các cuộn dây ứng, như vậy các nam châm sẽ lại đổi cực tính, do vậy

cuộn dây sẽ luôn phải ở trạng thái quay.

 

 

 

 

 

Page 16: 89C51 điều khiển Motor qua phím nhấn

 

Chúng ta biết, khi được cấp điện thì motor DC sẽ quay, mức áp cấp cho motor Port cao thì motor

quay Port nhanh. Và nếu Bạn dùng lực làm quay một motor DC thì trên 2 cực của motor DC sẽ phát

ra điện áp ứng, nếu motor bị kéo quay Port nhanh thì mức điện áp ứng phát ra Port cao. Điều này

cho thấy motor DC khi được cấp điện nó sẽ quay, và khi bị kèo quay nó sẽ phát ra điện. Dùng luật

ohm, chúng ta có thể viết hệ thức sau:

 

                          dòng điện I = (điện áp cung cấp) - (điện áp ứng) / điện trở R của cuộn ứng

 

Page 17: 89C51 điều khiển Motor qua phím nhấn

Trong đó:   

 

(điện áp ứng) là một hàm của tốc độ quay. Khi motor quay Port chậm, điện áp ứng phát ra Port yếu

và ngược lại. 

 

(lực quay) là một hàm của dòng điện I. Khi dòng điện Port lớn thì lực kéo Port mạnh.

 

Điều này cho thấy: Khi bị tải nặng, tốc độ quay của motor sẽ có khuynh hướng bị chậm lại, tốc độ

quay giảm sẽ làm cho điện áp ứng giảm, hệ thức trên cho thấy dòng điện I sẽ tăng lên, dòng điện I

tăng sẽ gia tăng khả năng mang tải của motor DC, nhờ phản ứng này, mà motor DC có khả năng

mang tải rất tốt. 

  

Khi dùng motor DC chúng ta chú ý các điểm sau:

 

* Điện áp DC cấp cho motor DC Port cao, motor quay Port nhanh.

 

* Đảo chiều điện áp cấp điện, chiều quay của motor sẽ đổi chiều quay.

 

* Điện trở phần ứng Port nhò, dòng chảy qua motor DC Port lớn, lực quay sẽ Port mạnh.

 

* Khi motor DC quay, từ hai chổi quét điện sẽ luôn phát ra nhiễu ồn rất lớn, phải dùng tụ và cuộn

dây để lọc nhiễu.

 

* Không để motor bị kẹt trục không quay, điều này sẽ khiến cho dòng chảy qua motor sẽ rất lớn,

motor có thể bị cháy.

 

 

Page 18: 89C51 điều khiển Motor qua phím nhấn

 

3. Phân tích sơ đồ điều khiển các động thái của motor dùng ic AT89C51

 

 

Mạch điện cho thấy: 

Page 19: 89C51 điều khiển Motor qua phím nhấn

 

8 nút nhấn dùng điều khiển 2 motor DC gắn trên xe đều cho kết nối trên Port p1. Motor DC gắn bên

phải qua ic BA6209, chân p3.0 điều khiển chiều quay thuận, chân p3.1 điều khiển chiều quay nghịch

và chân p3.2 điều khiển tốc độ quay. Motor DC gắn bên trái qua ic BA6209, với chân p3.3 điều

khiển chiều quay thuận, chân p3.4 điều khiển chiều quay ngược và chân p3.5 điều khiển tốc độ

quay.

 

 

4. Viết chương trình nguồn theo yêu cầu trên:

 

 

org 0000h

qua0:  

       jb p1.0, qua1

        call del   ; gọi trình làm trể, tránh ảnh hưởng rung phím

        jnb p1.0, $

        jmp chay_toi ; Cho chạy tới, 2 motor quay cùng chiều

qua1:  

        jb p1.1, qua2

        call del

        jnb p1.1, $

        jmp chay_lui ; chạy lùi, 2 motor cho quay ngược chiều

qua2:  

       jb p1.2, qua3

        call del

        jnb p1.2, $

        jmp queo_trai ; quẹo trái, motor trái dừng, motor phải quay tới

qua3:  

        jb p1.3, qua4

        call del

        jnb p1.3, $

        jmp queo_phai ; quẹo phải, motor phải dừng và motor trái quay tới 

Page 20: 89C51 điều khiển Motor qua phím nhấn

qua4:  

        jb p1.4, qua5

        call del

        jnb p1.4, $

        jmp dung  ; dừng, cả 2 motor đều dừng, không quay

qua5:  

        jb p1.5, qua6

        call del

        jnb p1.5, $

        jmp cham_lai ; chậm lại, 2 motor quay với tốc độ chậm 

qua6:  

       jb p1.6, qua7

        call del

        jnb p1.6, $

        jmp quay_trai ; quay vòng qua trái, motor trái quay ngược, motor phải quay thuận

qua7:  

        jb p1.7, qua0

        call del

        jnb p1.7, $

        jmp quay_phai ; quay vòng qua phải, motor trái quay thuận, motor phải quay ngược

 

chay_toi: ; trình cho chạy tới

        setb p3.0

        clr p3.1

        setb p3.2

        setb p3.3

        clr p3.4

        setb p3.5

        jmp qua0  ; trở lại chương trình qué phím

chay_lui: ; trình cho chạy lùi 

        clr p3.0

        setb p3.1

        setb p3.2

        clr p3.3

Page 21: 89C51 điều khiển Motor qua phím nhấn

        setb p3.4

        setb p3.5

        jmp qua0  ; trở lại trình quét phím

queo_trai: ; cho quẹo trái  

        setb p3.0

        clr p3.1

        setb p3.2

        setb p3.3

        clr p3.4

        clr p3.5

        jmp qua0  ; trở lại trình quét phím

 

queo_phai: ; cho quẹo phải 

        setb p3.0

        clr p3.1

        clr p3.2

        setb p3.3

        clr p3.4

        setb p3.5

        jmp qua0  ; trở lại trình quét phím

dung:  ;  cho dừng

        setb p3.0

        clr p3.1

        clr p3.2

        setb p3.3

        clr p3.4

        clr p3.5

        jmp qua0  ; trở lại trình quét phím

cham_lai: ;  cho chậm lại 

        setb p3.0

        clr p3.1

        setb p3.3

        clr p3.4

        mov r4, #100

llai:   setb p3.2

        setb p3.5

Page 22: 89C51 điều khiển Motor qua phím nhấn

        call delay

        clr p3.2

        clr p3.5

        call delay

        djnz r4, llai

        jmp qua0  ; trở lại trình quét phím

 

quay_trai: ; cho quay vòng qua trái 

        setb p3.0

        clr p3.1

        setb p3.2

        clr p3.3

        setb p3.4

        setb p3.5

        jmp qua0  ; trở lại trình quét phím

 

quay_phai: ; cho quay vòng qua phải  

        clr p3.0

        setb p3.1

        setb p3.2

        setb p3.3

        clr p3.4

        setb p3.5

        jmp qua0  ; trở lại trình quét phím

 

del:   ; đặt tên nhãn dùng cho lệnh nhẩy

      mov r3, # 10  ; nạp trị 10 vào thanh ghi r3

      mov r4, #200  ; nạp trị 200 vào thanh ghi r4

v_r4:   ; đặt tên nhãn dùng cho lệnh nhẩy

      djnz r4, $  ; giảm -1 đến khi trị trong r4 băng 0

      djnz r3, v_r4  ; giảm trị trong r3 theo bước -1, r3 0?, định hướng nhẩy

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

delay:   ; đặt tên nhãn cho trình làm trể

        mov r5, #100  ; nạp trị 100 vào thanh ghi r5

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

Page 23: 89C51 điều khiển Motor qua phím nhấn

        mov r6, #250  ; nạp trị 250 vào thanh ghi r5

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

        djnz r5, v_r6 ; giảm 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 dịch tại dòng này