Tuy nhiên có một số lệnh chưa được xây dựngCác lệnh 8051 được chia ra 5 nhóm chính:... 5 4.2.1 Định địa chỉ thanh ghi Người ta sử dụng các thanh ghi để chứa dữ liệu, và sử dụng tên của
Trang 1CHƯƠNG 4 TẬP LỆNH HỌ VI ĐIỀU KHIỂN 8051
Trang 22
4.1 Giới thiệu về tập lệnh của họ 8051
8051 có khả năng cung cấp tối đa 28 = 256 lệnh Tuy nhiên
có một số lệnh chưa được xây dựngCác lệnh 8051 được chia ra 5 nhóm chính:
Trang 44
4.2 Các kiểu định địa chỉ
Có 8 kiểu định địa chỉ đối với 8051:
- Định địa chỉ thanh ghi
- Định địa chỉ trực tiếp
- Định địa chỉ gián tiếp
- Định địa chỉ tức thời
- Định địa chỉ tương đối
- Định địa chỉ tuyệt đối
- Định địa chỉ dài
- Định địa chỉ theo chỉ số
Trang 55
4.2.1 Định địa chỉ thanh ghi
Người ta sử dụng các thanh ghi để chứa dữ liệu, và sử dụng tên của các thanh ghi trong câu lệnh Ta có 8 thanh ghi R0 – R7
Ví dụ:
ADD A, R7 Cộng dữ liệu trong A với dữ liệu
trong R7, kết quả lưu vào A
Trang 6MOV P1, A
Trang 77
4.2.4 Định địa chỉ tức thời
Khi ta muốn nạp một giá trị hằng số vào một ô nhớ nào đó,
ta sẽ dùng phương pháp định địa chỉ tức thời
Trong phương pháp định địa chỉ tức thời, ta sử dụng dấu
“#” trước các toán hạng tức thời
VD:
MOV A,#12H Nạp giá trị 12H vào thanh ghi A MOV R1,#28 Nạp giá trị 28 vào thanh ghi R1 MOV 30H,#0F0H Nạp giá trị F0H vào ô nhớ có địa
chỉ 30H
Trang 99
4.3 Tập lệnh của họ vi điều khiển 8051
Ý nghĩa các ký hiệu được sử dụng:
Ký hiệu Ý nghĩa
Rn hoặc Rr Các thanh ghi R0 – R7 direct Địa chỉ nội 8 bit (00H – FFH)
#data8 Hằng số 8 bit src Toán hạng nguồn (source) dest Toán hạng đích (destination) (X) Nội dung trong X VD: (A) là nội dung trong thanh ghi
A
Trang 1010
4.3 Tập lệnh của họ vi điều khiển 8051
Công thức tính chu kỳ máy
VD: 8051 sử dụng thạch anh 12 MHz sẽ có chu kỳ máy là:
Chu kỳ máy:
Mỗi lệnh trong 8051 khi thực thi sẽ cần một khoảng thời gian nhất định, tùy lệnh mà thời gian sẽ dài hay ngắn
Trang 1111
4.3.3 Nhóm lệnh chuyển dữ liệu
Trang 12MOV A, 7FH
Ghi giá trị trong ô nhớ 7FH vào ANếu giá trị trong ô nhớ 7FH là 20H Sau khi thực hiện lệnh, giá trị trong A và giá trị trong ô nhớ 7FH bằng bao nhiêu ?
(A) = 20H và (7FH) = 20H
Trang 13(A) = 20H và (R7) = 20H
Trang 14(A) = 100
Trang 15VD: chép dữ liệu từ ô nhớ 40H vào ô nhớ 50HMOV 50H, 40H
Trang 1616
4.3.3 Nhóm lệnh chuyển dữ liệu
ORG 0000H MOV P0,#00000000B ACALL delay
Loop: MOV P0,#00000001B
ACALL delay
MOV P0,#00000010B ACALL delay
MOV P0,#00000100B ACALL delay
MOV P0,#00001000B ACALL delay
MOV P0,#00010000B ACALL delay
MOV P0,#00100000B ACALL delay
MOV P0,#01000000B ACALL delay
MOV P0,#10000000B ACALL delay
SJMP Loop
delay:
MOV R6,#255 Lap1: MOV R7,#255 Lap2: DJNZ R7,Lap2
DJNZ R6,Lap1 RET
END
VD: chương trình 1 led sáng dịch chuyển trên Port 0
Trang 1919
4.3.2 Nhóm lệnh luận lý - logic
Các lệnh logic thực hiện các phép toán Boole (AND,
OR, NOT, XOR) trên cơ sở từng bit
VD: thanh ghi A chứa giá trị 00110101B, thực hiện lệnh sau:
Trang 20VD: ban đầu A có giá trị 1000 0000B
Trang 21END
Trang 2222
4.3.2 Nhóm lệnh luận lý - logic
Dựa vào chương trình mẫu trên, viết ứng dụng:
1 led tắt dịch chuyển trên Port 0
Trang 2323
4.3.2 Nhóm lệnh luận lý - logic
Lệnh “RRC A”: xoay phải qua cờ C
VD: thanh ghi A có nội dung 10000000B
Trang 24RRC A SJMP Loop
MOV
Trang 25RRC A SJMP Loop
Trang 26MOV P0,#00000000B ACALL DELAY
Lap2: SETB C
RRC A
MOV P0,A ACALL DELAY
JNC Lap2
SJMP Lap1
DELAY:
MOV R6,#255 Lap3: MOV R7,#255 Lap4: DJNZ R7,Lap4
DJNZ R6,Lap3 RET
END
Trang 2727
4.3.4 Nhóm lệnh với biến Boole
Trang 2828
4.3.4 Nhóm lệnh với biến Boole
Nhóm lệnh Boole là các tác vụ trên 1 bit, chỉ thực thi được đối với BIT có địa chỉ
Ta có thể đặt lên 1 hay xóa về 0 các bit bằng 1 lệnh (rất thuận lợi cho điều khiển các thiết bị I/O)
VD: 1 đèn led được điều khiển bằng bit 7 của Port 0 (P0.7), ta có thể bật đèn bằng cách set bit lên 1
SETB P0.7
Và tắt nó bằng cách xóa bit về 0
CLR P0.7
Trang 2929
4.3.4 Nhóm lệnh với biến Boole
Các lệnh trên bit còn có thể là các lệnh rẽ nhánh có điều kiện
- JC rel: nhảy đến vị trí nhãn rel nếu bit C = 1
- JNC rel: nhảy đến vị trí nhãn rel nếu bit C = 0
- JB bit,rel: nhảy đến vị trí nhãn rel nếu bit điều kiện = 1
- JNB bit,rel: nhảy đến vị trí nhãn rel nếu bit điều kiện
= 0
- JBC bit,rel: nhảy đến vị trí nhãn rel nếu bit điều kiện =
1 và CLR (xóa) bit điều kiện về 0
Trang 3030
4.3.4 Nhóm lệnh với biến Boole
VD: chương trình điều khiển led sáng dần – tắt hết
ORG 0000H Lap1: MOV A,#00000000B
MOV P0,#00000000B ACALL DELAY
Lap2: SETB C
RRC A MOV P0,A ACALL DELAY
JNC Lap2
SJMP Lap1
DELAY:
MOV R6,#255 Lap3: MOV R7,#255 Lap4: DJNZ R7,Lap4
DJNZ R6,Lap3 RET
END
Trang 3232
4.3.1 Nhóm lệnh số học
Trang 3333
4.3.1 Nhóm lệnh số học
VD: lệnh ADD
ADD A,7FH Định địa chỉ trực tiếp (DIR)
ADD A,#100 Định địa chỉ tức thời (IMM)
Trang 3838
4.3.5 Nhóm lệnh rẽ nhánh chương trình
Các lệnh rẽ nhánh không điều kiện:
Click to edit Master text styles
Second level
Third level
Fourth level
Fifth level
Trang 3939
4.3.5 Nhóm lệnh rẽ nhánh chương trình
Có 3 loại lệnh nhảy là SJMP, LJMP và AJMP
- SJMP rel: nhảy đến nhãn mong muốn (không có điều kiện), khoảng cách nhảy bị giới hạn trong vùng từ -128 đến +127 byte địa chỉ
- AJMP rel: nhảy đến nhãn mong muốn (không có điều kiện), khoảng cách nhảy bị giới hạn trong cùng khối 2KB
- LJMP rel: nhảy đến nhãn mong muốn (không có điều kiện), nhảy đến bất cứ vị trí nào trong vùng nhớ chương trình 64K
Trang 40Chương trình con phải kết thúc bằng lệnh RET để 8051 quay về thực hiện chương trình chính tiếp theo lệnh CALL
Lệnh ACALL và LCALL có cùng những giới hạn với địa chỉ đích như AJMP và LJMP
Trang 41MOV P0,#00000000B
ACALL DELAY Lap2: SETB C
RRC A MOV P0,A
DJNZ R6,Lap3
RET
END
Trang 43Được dùng để điều khiển vòng lặp Để thực thi vòng lặp
N lần, nạp giá trị cho byte là N và sử dụng DJNZ để điều khiển vòng lặp
VD: thực hiện vòng lặp 2 lần
MOV R7, #2LOOP: (bắt đầu các lệnh trong vòng lặp)
………
(kết thúc các lệnh trong vòng lặp)DJNZ R7, LOOP
Trang 44ACALL DELAY MOV P0,#00H ACALL DELAY DJNZ R2,Loop SJMP $
DELAY:
MOV R7,#2 Lap1: MOV R6,#250 Lap2: MOV R5,#250 Lap3: DJNZ R5,Lap3
DJNZ R6,Lap2 DJNZ R7,Lap1 RET
END
Trang 4646
4.3.5 Nhóm lệnh rẽ nhánh chương trình
CJNE A,byte,rel: nhảy đến rel nếu (A) khác (byte)
CJNE byte,#data8,rel: nhảy đến rel nếu (byte) khác
#data8
Được dùng để điều khiển vòng lặp