CHƯƠNG II: TẬP LỆNH 8951
I. NHÓM LỆNH DI CHUYỂN DỮ LiỆU:
1. Lệnh di chuyển dữ liệu trực tiếp:
- Cú pháp: MOV <ĐÍCH>, <NGUỒN>
Trong đó:
. <ĐÍCH>: có thể là thanh ghi, địa chỉ ô nhớ trong vùng RAM nội
Ồ ể
. <
N
GU
Ồ
N>: có th
ể
là thanh ghi, địa chỉ ô nhớ trong vùng RAM
nội hoặc #<giá trị>
-
Thựchiện: di chuyểnnội dung
<
NGUỒN
>
vào
<
ĐÍCH
>
Thực
hiện:
di
chuyển
nội
dung
NGUỒN
vào
ĐÍCH
-Ví dụ:
MOV A, 120
MOV B, #24
MOV 120,#10110010B
MOV R3, A
MOV P3,#3EH
20
2. Nhóm lệnh di chuyển dữ liệu gián tiếp:
a. Liên quan đến vùng nhớ RAM nội
:
+ Lệnh đọc bộ nhớ:
- Cú pháp: MOV <ĐÍCH>, @Rp
T đó
T
rong
đó
:
. <ĐÍCH>: thanh ghi, ô nhớ
Rp: là thanh ghi R
0
hoặcR
1
.
Rp:
là
thanh
ghi
R
0
hoặc
R
1
-Thực hiện: lấy nội dung ô nhớ trong vùng RAM nội có địa chỉ là nội dung
thanh ghi Rp đặt vào <ĐÍCH>
-Ví dụ:
MOV 120,#47
MOV R1,#120
MOV A,@R1
; sau khi thực hiện xong đoạn lệnh nội dung thanh ghi A chứa giá trị 47
21
+ Lệnh ghi bộ nhớ:
- Cú pháp: MOV @Rp, <NGUỒN>
Trong đó:
. <NGUỒN>: thanh ghi, ô nhớ hoặc #<giá trị>
RlàhhhiR
0
h ặ R
1
.
R
p:
là
t
h
an
h
g
hi
R
0
h
o
ặ
c
R
1
-Thực hiện: đặt nội dung <NGUỒN> vào ô nhớ trong vùng RAM nội có địa
chỉ là nội dung thanh ghi Rp.
-Ví dụ 1:
MOV R0,#100
MOV @R0, #0E3H
; sau khi thực hiện xong đoạn lệnh nội dung ô nhớ 100 chứa giá trị E3H
-Ví dụ 2:
MOV A, #49
MOV
R
1,#127
MOV @R1, A ; (127) = 49
22
b. Liên quan đến vùng nhớ dữ liệu ngoài:
+ Lệnh đọc bộ nhớ:
- Cú pháp: MOVX A, @DPTR
-Thực hiện: lấy nội dung ô nhớ trong vùng dữ liệu ngoài có địa chỉ là nội
dung thanh ghi DPTR đặt vào thanh ghi A
dung
thanh
ghi
DPTR
đặt
vào
thanh
ghi
A
-Ví dụ:
MOV DPTR,#1000
MOVX A, @DPTR ; A Å (1000)
+ Lệnh đọc bộ nhớ:
- Cú pháp: MOVX @DPTR, A
-Thực hiện: lấy nội dung A đặt vào ô nhớ trong vùng dữ liệu ngoài có địa chỉ
là ộid th h hiDPTR
là
n
ội
d
ung
th
an
h
g
hi
DPTR
.
-Ví dụ:
MOV
DPTR #
1000
MOV
DPTR
,
#
1000
23
MOV A, #4EH
MOVX @DPTR, A ; ghi giá trị 4EH vào ô nhớ ngoài có địa chỉ 1000
c. Lệnh liên quan đến vùng nhớ chương trình (đọc mã lệnh):
- Cú pháp: MOVC A,@A+DPTR
Th hiệ lấ ộid ô hớ ùhớ h ìh óđị hỉ là ội
-
Th
ực
hiệ
n:
lấ
y n
ội
d
ung
ô
n
hớ
trong v
ù
ng n
hớ
c
h
ương tr
ì
n
h
c
ó
đị
a c
hỉ
là
n
ội
dung thanh ghi A + DPTR đặt vào thanh ghi A.
-Ví dụ 1:
MOV A,#2
MOV DPTR,#500
MOVC A,@A+DPTR ; A Å (502)
-Ví dụ 2:
MOV A, #4
MOV DPTR,#TABLE
MOVC A, @A+DPT
R
TABLE: DB 12H, 4EH, 0C7H, 084H, 055H,……
24
3. Nhóm lệnh liên quan đến ngăn xếp:
+ Ghi vào ngăn xếp:
- Cú pháp: PUSH Thanh ghi/ địa chỉ
-Thực hiện: cất nội dung thanh ghi hoặc ô nhớ vào đỉnh ngăn xếp
Đ ă ế
+
Đ
ọc ng
ă
n x
ế
p:
- Cú pháp: POP Thanh ghi/ địa chỉ
Thựchiện: lấynội dung ở đỉnh ngănxếp gán vào thanh ghi ô nhớ
-
Thực
hiện:
lấy
nội
dung
ở
đỉnh
ngăn
xếp
gán
vào
thanh
ghi
,
ô
nhớ
+ ví dụ: MOV A,#100
MOV
100
#
3
EH
MOV
100
,
#
3
EH
PUSH ACC
PUSH 100
MOV A, #21H
MOV 100, #40
POP 100
POP ACC
25
4. Lệnh trao đổi dữ liệu:
- Cú pháp: XCH A, <NGUỒN>
Trong đó: <NGUỒN> có thể là thanh ghi, ô nhớ hoặc @Rp
-Thực hiện: trao đổi nội dung thanh ghi A và <NGUỒN>
Ó Ệ Ố
II. NH
Ó
M L
Ệ
NH S
Ố
HỌC
1. Lệnh cộng:
a. Cộng không nhớ:
- Cú pháp: ADD A, <NGUỒN>
T đó <NGUỒN> ó thể là th h hi ô hớ #< iá t ị>h ặ @R
T
rong
đó
:
<NGUỒN>
c
ó
thể
là
th
an
h
g
hi
,
ô
n
hớ
,
#<
g
iá
t
r
ị>
h
o
ặ
c
@R
p
-Thực hiện: A Å A + <NGUỒN>
b. Cộng có nhớ:
- Cú pháp: ADDC A, <NGUỒN>
T đó NGUỒNóthể là th h hi ô hớ #iátị h ặ @R
T
rong
đó
: <
NGUỒN
> c
ó
thể
là
th
an
h
g
hi
,
ô
n
hớ
,
#
<g
iá
t
r
ị
>
h
o
ặ
c
@R
p
-Thực hiện: A Å A + <NGUỒN> + C
26
2. Lệnh trừ:
- Cú pháp: SUBB A, <NGUỒN>
Trong đó: <NGUỒN> có thể là thanh ghi, ô nhớ, #<giá trị> hoặc @Rp
-Thực hiện: A Å A - <NGUỒN> - C (carry bit)
3. Lệnh nhân
:
Cú há
MUL
AB
-
Cú
p
há
p:
MUL
AB
-Thực hiện: A * B = BA (B: byte cao của kết quả; A: byte thấp của kết quả)
4. Lệnh chia:
- Cú pháp: DIV AB
-Thực hiện: A : B = A dư B (A: chứa phần nguyên; B: chứa phần dư)
5. L
ệ
nh tăn
g
m
ộ
t đơn v
ị
:
ệ
g
ộ
ị
- Cú pháp: INC <ĐÍCH>
Trong đó: <ĐÍCH> có thể là thanh ghi, ô nhớ
- Thực hiện: <ĐÍCH> = <ĐÍCH> + 1
27
6. Lệnh giảm một đơn vị:
- Cú pháp: DEC <ĐÍCH>
Trong đó: <ĐÍCH> có thể là thanh ghi, ô nhớ
- Thực hiện: <ĐÍCH> = <ĐÍCH> - 1
Ó
Ệ
Ả
III. NH
Ó
M L
Ệ
NH NH
Ả
Y:
1. Lệnh nhảy không điều kiện:
ầ
a
.
Nhả
y
g
ầ
n:
- Cú pháp: SJMP <NHÃN>
T đ
ó
<
NHÃ
N
>
là
ộ
tt
ừ
h
hó
t
ừ
i
ế
tli
ề
h
th b
ằ
d
ấ
”
”
T
rong
đ
ó
:
<
NHÃ
N
>
là
m
ộ
t
t
ừ
,
h
ay n
hó
m
t
ừ
v
i
ế
t
li
ề
n n
h
au,
th
eo sau
b
ằ
ng
d
ấ
u
”
:
”
dùng để đánh dấu vị trí chương trình.
- Thực hiện: nhày không điều kiện đến vị trí chương trình được chỉ định bởi
Ã
ế
Ã
<
N
H
Ã
N
>, khoảng cách từ lệnh đ
ế
n <
N
H
Ã
N
> không vư
ợ
t quá 128
b
yte mã
lệnh.
b
.
Nhả
y
xa:
y
- Cú pháp: LJMP <NHÃN>
28
- Thực hiện: nhảy đến vị trí được chỉ định bởi <NHÃN>, <NHÃN> có thể nằm ở
bất kì vị trí nào trong chương trình.
2
L
ệ
nh
nhả
y
có
đi
ề
uki
ệ
n
:
2
.
L
ệ
nh
nhả
y
có
đi
ề
u
ki
ệ
n
:
a. Lệnh so sánh và nhảy nếu không bằng (compare and jump if not equal)
-
Cú phá
p:
Cú
phá
p:
CJNE A, <TOÁN HẠNG >, <NHÃN>
Trong đó <TOÁN HẠNG> có thể là thanh ghi, ô nhớ hoặc #<giá trị>
- Thực hiện: So sánh A và <TOÁN HẠNG>, nếu:
+ A ≠ <TOÁN HẠNG>: nhảy đến <NHÃN> và nếu:
. A > <TOÁN HẠNG>: bit C = 0
. A < <TOÁN HẠNG>: bit C = 1
+ A = <TOÁN HẠNG>: thực hiện lệnh kế tiếp
- Một dạng khác của lệnh:
Á
Ã
CJNE Ri/@Rp, #<GI
Á
TRỊ>, <NH
Ã
N>
29
b. Lệnh giảm nội dung Ri một đơn vị và nhảy nếu bằng zero (decrement Ri by 1
and jump if not zero):
Cú phá
p:
DJNZ
Ri
<
NHÃ
N>
-
Cú
phá
p:
DJNZ
Ri
,
<
NHÃ
N>
- Thực hiện: Ri = Ri - 1, nếu:
+
Ri
>
0
:
nhả
y
đế
n
<
NHÃ
N
>
Ri
0
:
nhả
y
đế
n
NHÃ
N
+ Ri =0: thực hiện lệnh kế tiếp
c. Lệnh nhảy phụ thuộc vào trạng thái bit kiểm tra:
- Cú pháp: JB/ JNB BIT, <NHÃN>
Trong đó: BIT có thể là các bit của một thanh ghi hoặc các chân I/O của vi điều
ể
khi
ể
n
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu BIT
b
ằn
g
1 ho
ặ
c bằn
g
0
g
ặ
g
d. Lệnh nhảy thông qua việc kiểm tra cờ CARRY:
- Cú pháp: JC/ JNC <NHÃN>
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu C bằng
1 hoặc bằng 0
30
e. Lệnh nhảy thông qua việc kiểm tra cờ ZERO:
- Cú pháp: JZ/ JNZ <NHÃN>
- Thực hiện: nhảy đến vị trí chương trình được chỉ định bởi <NHÃN> nếu Z bằng
1 hoặc bằng 0
IV
NHÓ
ML
Ệ
NH LOGIC:
IV
.
NHÓ
M
L
Ệ
NH
LOGIC:
1. ANL A, <NGUỒN>
2
ORL
A
,
<
NGU
Ồ
N>
2
.
ORL
A
,
<
NGU
Ồ
N>
3. XRL A, <NGUỒN>
4. CL
R
A
;
xóa n
ộ
i dun
g
thanh
g
hi A
;
ộ
gg
5. CPL A ; đảo các BIT trong thanh ghi A
6. NOP ; lệnh không thực hiện, bỏ qua khi gặp lệnh này
7. SWAP A ; đảo vị trí 4 bit cao và 4 bit thấp trong thanh ghi A
8 Nhóm lệnh quay vòng
:
a. Quay phải thanh ghi A
- Cú pháp: RR A
31
- Thực hiện:
Bit 7 >- bit 0
b
.
L
ệ
nh quay
trá
ithanhghiA:
b
.
L
ệ
nh
quay
trá
i
thanh
ghi
A:
- Cú pháp: RL A
- Thực hiện:
Bit 7 < bit 0
c. Lệnh quay trái thanh ghi A với cờ C:
Cú há
RLC
A
-
Cú
p
há
p
:
RLC
A
- Thực hiện:
Bit
7
<
bit
0
C
Bit
7
bit
0
C
32
d. Lệnh quay phải thanh ghi A với cờ C:
- Cú pháp: RRC A
- Thực hiện:
Bit 7
>
bit 0
C
Bit
7
>
bit
0
C
V. NHÓM LỆNH THAO TÁC BIT:
1
CLR
BIT
;
xó
aBIT=
0
1
.
CLR
BIT
;
xó
a
BIT
=
0
2. SETB BIT ; đặt BIT = 1
3
CPL
BIT
;
đ
ả
on
ộ
i dung hi
ệ
n
tạ
i
củ
aBIT
3
.
CPL
BIT
;
đ
ả
o
n
ộ
i
dung
hi
ệ
n
tạ
i
củ
a
BIT
4. Lệnh di chuyển BIT
- MOV C
,
BIT
;
C Å BIT
,
;
- MOV BIT, C ; BIT Å C
33
VI. NHÓM LỆNH LIÊN QUAN ĐẾN CHƯƠNG TRÌNH CON:
1. CALL <TÊN CHƯƠNG TRÌNH CON> ; gọi chương trình con
2. RET ; kết thúc chương trình con
ế
ắ
3. RETI ; k
ế
t thúc chương trình ng
ắ
t
34
Chương III: CÁC THANH GHI CÓ CHỨC NĂNG ĐẶC BIỆT
(
SFR: S
p
ecial Function Re
g
isters
)
T
113
-
138
(
p
g)
I. CÁC THANH GHI ĐIỀU KHIỂN TIMER/COUNTER:
ªVi điều khiển 8951 có 2 timer/counter: TIMER/COUNTER0 và TIMER/COUNTER1
T
.
113
138
,
TLTK
ªCấu trúc của một bộ timer/counter:
8951
18
OSC
÷12
C/T = 0: T
C/T = 1: C
TFx
TH
8
bit
TL
8
bit
Thạch anh
T
C
0
:
SW h
ở
TFx
tràn
TH
x:
8
bit
TL
x:
8
bit
19
Tx
&
00…0 00…0
(14/15)
SW
TRx
GATE
0
:
SW h
ở
1: SW đóng
INTx
T
Fx
,
C
/
T
,
GATE
,
TRx: các bit
(12/13)
&
,
/
,
,
THx, TLx: 2 thanh ghi 8 bit, ghi/đọc được
Tx, INTx: chân 8951
35
1. Thanh ghi điều khiển timer: TCON
Là thanh ghi 8 bit, truy xuất (ghi/đọc) byte hoặc bit
T
ấ
tb t
MOV
TCON
#
iá t ị
-
T
ruy xu
ấ
t
b
y
t
e:
MOV
TCON
,
#
g
iá
t
r
ị
- Truy xuất bit: SETB/CLR <TÊN BIT>
3
6
2
4
1
7
0
5
IE1
3
TF0 IE0
6
TF1
2
IT0
4
TR1
1
TR0
7
0
IT1
5
TF
1
:
báo trạng thái tràn cho bộ Timer/Counter
1
TF
1
:
báo
trạng
thái
tràn
cho
bộ
Timer/Counter
1
TR1: điều khiển cấp xung cho bộ Timer/Counter1
TF0: báo trạng thái tràn cho bộ Timer/Counter0
TR0: điều khiển cấp xung cho bộ Timer/Counter0
IE1: báo trạng thái ngắt ngoài 1
IT
1
hhétáđộ ắtài
1
bằ h ố (d f lt IT
1
0
tá độ ắt
IT
1
: c
h
o p
hé
p
tá
c
độ
ng ng
ắt
ngo
ài
1
bằ
ng cạn
h
xu
ố
ng
(d
e
f
au
lt
IT
1
=
0
,
tá
c
độ
ng ng
ắt
bằng mức thấp)
IE0: báo trạng thái ngắt ngoài 0
IT0:cho phép tác động ngắt ngoài 0 bằng cạnh xuống (default IT1 = 0, tác động ngắt
bằng mức thấp)
36
2. Thanh ghi chế độ timer: TMOD
Là
thanh ghi
8
bit
,
truy xu
ấ
t
(
ghi
/
đ
ọ
c) byte
Là
thanh
ghi
8
bit
,
truy
xu
ấ
t
(
ghi
/
đ
ọ
c)
byte
MOV TMOD, #giá trị
36241705
ĐIỀU KHIỂN TIMER 0
GATEM1 M1GATE M0C/T M0
ĐIỀU KHIỂN TIMER 1
C/T
GATE, C/T: điều khiển trạng thái hoạt động cho Timer/Counter
M1, M0: chọn chế độ hoạt động cho Timer/Counter
M1 M0 Chế độ Mô tả
00 0
Timer/Counter 13 bit
0
1
1
Timer/Counter 16 bit
<
VÍ DỤ
>
0
1
1
Timer/Counter
16
bit
10 2 Timer/Counter 8 bit, auto reload
11 3
Timer/Counter 8 bit
<
VÍ
DỤ
>
<VÍ DỤ>
37
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
CCH
Ế ĐỘ
TIMER/COUNTER
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
C
CH
Ế
ĐỘ
TIMER/COUNTER
ª Chế độ 0: 13 bit
TL 5 BIT
PULSE INPUT
TH 8 BIT
TF
TL
x :
5
BIT
TH
x :
8
BIT
TF
x
ª
Ch
ế
đ
ộ
1
:
16
bit
PULSE INPUT
ª
Ch
ế
đ
ộ
1
:
16
bit
T
Lx : 8 BIT
T
Hx : 8 BIT
T
Fx
38
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
CCH
Ế ĐỘ
TIMER/COUNTER
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
C
CH
Ế
ĐỘ
TIMER/COUNTER
ª Chế độ 2: 8 bit AUTORELOAD
PULSE INPUT
TFxTLx : 8 BIT
OVERFLOW
THx : 8 BIT
39
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
CCH
Ế ĐỘ
TIMER/COUNTER
HOẠ
T
ĐỘ
NG
CỦ
A
CÁ
C
CH
Ế
ĐỘ
TIMER/COUNTER
ª Chế độ 3: 8 bit
TL0 : 8 BIT
PULSE INPUT
TF0
TF1TH0 : 8 BIT
OSC:12
TR1
#
#
Trong chếđộnày, TH1 và TL1 không đượcsử dụng, thay vào đólàTH0
và TL0 hoạt động như 2bộ Timer/counter 8 bit. Tuy nhiên, xung cung cho
TH
0
là
ừ
b
ộ
đi
ề
khi
ể
ủ
i/
1
40
TH
0
là
t
ừ
b
ộ
đi
ề
u
khi
ể
nc
ủ
at
i
mer
/
counte
r
1
.
VÍ DỤ Ứ
NG
DỤ
NG CH
Ế ĐỘ
1
16
BITS
VÍ
DỤ
Ứ
NG
DỤ
NG
CH
Ế
ĐỘ
1
:
16
BITS
ª
Ch
ế
đ
ộ
1
:
16
bit
ª
Ch
ế
đ
ộ
1
:
16
bit
YÊU CẦU: Viết chương trình điều
khiển bóng đèn theo qui luật: 300mS
sá
ng
300
mS
t
ắ
t
(
delay
s
ử
dụ
ng
timer
0
8951
sá
ng
,
300
mS
t
ắ
t
(
delay
s
ử
dụ
ng
timer
0
,
mode 16 bit).
THỰC HIỆN:
BEGIN: CPL P1.0
CALL DL300mS
SJMP
BEGIN
P1.0
12Mhz
SJMP
BEGIN
DL300mS:
……….
RET
41
CHƯƠNG
TRÌ
NH CON DELAY
300
S
CHƯƠNG
TRÌ
NH
CON
DELAY
300
m
S
DL
300
mS:
#
C
ấ
u
trú
cl
ặ
pNl
ầ
n(N
<=
255
):
DL
300
mS:
PUSH 05
MOV TMOD,#01H
#
C
ấ
u
trú
c
l
ặ
p
N
l
ầ
n
(N
255
):
MOV Ri, #N
<Nhãn>:
MOV
R
5,#6
X1: MOV TH0,#HIGH(15536)
MOV TL0,#LOW(15536)
; LỆNH LẶP
DJNZ
Ri
<
Nhã
>
SETB TR0
CLR TF0
JNB
TF
0
,$
;
ch
ờ trà
n
DJNZ
Ri
,
<
Nhã
n
>
# Hoạt động của timer 0, mode 1:
JNB
TF
0
,$
;
ch
ờ
trà
n
DJNZ R5, X1
POP 05
15536 655350
&
1
TF0
RET
42
VÍ DỤ Ứ
NG
DỤ
NG CH
Ế ĐỘ
2
8
BITS AUTORELOAD
VÍ
DỤ
Ứ
NG
DỤ
NG
CH
Ế
ĐỘ
2
:
8
BITS
AUTORELOAD
ª
Ch
ế
đ
ộ
2
:
8
bit autoreload
8951
ª
Ch
ế
đ
ộ
2
:
8
bit
autoreload
YÊU CẦU: Viết chương trình xuất
chuỗi xung 500Hz ra loa (delay sử
dụ
ng
timer
1
mode
2
)
P2.5
dụ
ng
timer
1
,
mode
2
)
.
THỰC HIỆN:
BEGIN: CPL P2.5
12Mhz
CALL DL1mS
SJMP BEGIN
DL
1
S
DL
1
m
S
:
……….
RET
43
CHƯƠNG
TRÌ
NH CON DELAY
1
S
CHƯƠNG
TRÌ
NH
CON
DELAY
1
m
S
#
C
ấ
u
trú
cl
ặ
pNl
ầ
n(N
<=
255
):
DL
1
mS:
#
C
ấ
u
trú
c
l
ặ
p
N
l
ầ
n
(N
255
):
MOV Ri, #N
<Nhãn>:
DL
1
mS:
PUSH 07
MOV TMOD,#20H
; LỆNH LẶP
DJNZ
Ri
<
Nhã
>
MOV
R
7,#5
MOV TH1,#56
MOV TL1,#56
DJNZ
Ri
,
<
Nhã
n
>
# Hoạt động của timer 1, mode 2:
SETB TR1
X1: CLR TF1
JNB
TF
1
,$
;
ch
ờ trà
n
TL1 = 56 255
TH1 = 56
JNB
TF
1
,$
;
ch
ờ
trà
n
DJNZ R7, X1
POP 07
TF1
1
RET
44