Professional Documents
Culture Documents
CH3-Branch No BKG
CH3-Branch No BKG
2
Lệnh nhảy có điều kiện và nhảy không điều kiện
• Lệnh nhảy có điều kiện là một lệnh nhảy đến một địa
chỉ đích nếu nó thỏa mãn điều kiện yêu cầu.
– DJNZ, JZ, JNC...
• Lệnh nhảy không điều kiện là một lệnh nhảy đến địa
chỉ đích không cần điều kiện nào.
• Các lệnh nhảy không điều kiện:
– LJMP(Long Jump - Nhảy dài)
– SJMP(Short Jump - Nhảy ngắn)
3
Vòng lặp trong 8051
• Lặp lại một chuỗi các lệnh trong một số lần nào đó
gọi là một vòng lặp.
– Các lệnh nhảy của 8051 Khởi tạo
• Trước tiên thực hiện tác vụ Nhãn
• Sau đó kiểm tra điều kiện
Tác vụ
– DJNZ, JZ, JNC
Kiểm tra
Nhảy nếu
điều kiện
điều kiện
là đúng Không nhảy
nếu điều kiện
là sai
4
Lệnh DJNZ(1/2)
MOV R2,#02H
• Giảm và nhảy nếu không bằng 0 CLR A
6
Ví dụ 3-1
Viết một chương trình
(a) xóa ACC, sau đó
(b) cộng 3 vào thanh ghi ACC mười lần.
Giải:
;Chương trình này cộng giá trị 3 tới thanh
ghi ACC mười lần
7
Ví dụ 3-2
Hỏi số lần lặp lớn nhất của vòng lặp mà ví dụ 3-1 có thể lặp?
Giải:
8
Vòng lặp lồng nhau
• Một vòng lặp có thể lặp lại nhiều nhất là 256 lần.
• Nếu muốn lặp lại một tác vụ lớn hơn 256 lần, phải sử
dụng các vòng lặp bên trong vòng lặp.
• Đó được gọi là vòng lặp lồng. vòng lặp ngoài
• Ví dụ:
vòng lặp
– Vòng lặp trong là 256 trong
– Vòng lặp ngoài là 2
tác vụ
– Tổng số 256*2=512 lần
9
Ví dụ 3-3 (1/2)
Viết một chương trình
(a) nạp giá trị 55H vào thanh ghi tích lũy (thanh ghi ACC), và
(b) Làm phép bù thanh ghi ACC 700 lần.
Giải: MOV R3,#10
10
Ví dụ 3-3 (2/2)
MOV A,#55H ;A=55H
MOV R3,#10 ;R3=10,số đếm của vòng ngoài
NEXT: MOV R2,#70 ;R2=70,số đếm của vòng trong
AGAIN:CPL A ;lấy bù thanh ghi A
DJNZ R2,AGAIN;lặp 70 lần (cho vòng trong)
DJNZ R3,NEXT MOV R3,#10
NEXT
MOV R2,#70
AGAIN
11
Lệnh JZ
MOV A, R5
• Nhảy đến địa chỉ đích nếu A = 0
JZ đích Nhảy nếu
A=0
MOV A,R5 Kiểm tra
NEXT
– Lệnh này kiểm tra nội dung của thanh ghi ACC và nhảy
nếu ACC có giá trị 0.
12
Lệnh JNZ
MOV A, R5
• Nhảy nếu thanh ghi A khác 0
JNZ đích Nhảy nếu
A≠0
MOV A,R5 Test
JNZ NEXT
Không nhảy
MOV R5,#55H nếu A =0
NEXT: ... MOV R5,#55H
NEXT
– Lệnh này kiểm tra nội dung của thanh ghi ACC và nhảy
nếu ACC là khác 0.
13
Ví dụ 3-4
Viết một chương trình để khẳng định nếu R5 chứa giá trị 0.
Nếu vậy, đưa giá trị 55H vào trong nó.
Giải: MOV A, R5
NEXT
14
Lệnh JNC
lập(nếu CY=0)
Nhảy nếu
JNC đích CY=0 Test
MOV A,#0FFH
Không nhảy
ADD A,#01H nếu CY ≠0
JNC NEXT INC R5
INC R5
NEXT
NEXT: ...
– Cờ CY trong thanh ghi PSW.
– Lệnh này kiểm tra cờ CY, và nếu nó là 0 thì sẽ nhảy đến
địa chỉ đích. 15
Ví dụ 3-5
Tính tổng của các số 79H, F5H, và E2H.
Đặt giá trị của tổng vào thanh ghi R0 (byte thấp) và R5 (byte cao).
Giải: CY A
MOV A,#0 ;xóa A(A=0)
MOV R5,A ;xóa R5(R5=0) R5 R0
ADD A,#79H ;A=0+79H=79H
JNC N_1 ;nếu CY=0,cộng số tiếp theo
INC R5 ;nếu CY=1, tăng R5 thêm 1
N_1: ADD A,#0F5H ;A=79+F5=6E và CY=1(R5=0)
JNC N_2 ;nhảy nếu CY=0
INC R5 ;nếu CY=1, tăng R5
N_2: ADD A,#0E2H ;A=6E+E2=50 và CY=1(R5=1)
JNC OVER ;nhảy nếu CY=0
INC R5 ;nếu CY=1, tăng R5
OVER:MOV R0,A ;bây giờ R0=A=50H,và R5=02
16
Bảng 3-1: Các lệnh nhảy có điều kiện của
8051
Lệnh Tác dụng
JZ(Jump Zero) Nhảy nếu A=0
JNZ(Jump not zero) Nhảy nếu A≠0
DJNZ Rn, đích Giảm và nhảy nếu byte≠0
So sánh A với byte và nhảy nếu khác nhau
CJNE A,byte,đích
(A≠byte)
CJNE thanh ghi,#data,đích So sánh thanh ghi với #data và nhảy nếu
không bằng nhau (byte ≠ #data)
JC(Jump carry) Nhảy nếu CY=1
JNC(Jump no carry) Nhảy nếu CY=0
JB(Jump bit) Nhảy nếu bit=1
JNB(Jump no bit) Nhảy nếu bit=0
JBC(jump bit clear bit) Nhảy nếu bit=1 và xóa bit 17
Lệnh nhảy dài(LJMP - Long Jump)
ROM address
0000
• Là một lệnh 3-byte
– Byte đầu tiên là opcode
1120 LJMP Đích
– Hai byte tiếp theo là các địa 1123 CPL A
chỉ đích (địa chỉ thực)
• LJMP được sử dụng để A010 Đích: MOV R0,A
nhảy tới vị trí địa chỉ trong
không gian 64K byte mã FFFF
lệnh của 8051. Đích=A010 opcode=02A010
Bits 23 16 15 8 7 0
opcode = 02 địa chỉ đích
18
LJMP
19
Lệnh nhảy ngắn (SJMP - Short Jump)
Nhảy tiến
ROM address
• Là lệnh 2-byte 0000
– Byte đầu tiên là opcode.
Opcode 8030H
– Byte thứ hai là địa chỉ tương đối. 1120 SJMP Đích
– Địa chỉ này được quy chiếu tới 1122 CPL A
như là một địa chỉ tương đối vì
địa chỉ đích là có quan hệ tương 1152 Đích: MOV R0,A
đối với PC.
– Địa chỉ tương đối là một số có FFFF
dấu 8-bit.
Bits 15 8 7 0 Khi dịch: PC=1122, đích=1152
ĐCTĐ = đích-PC=1152-1122=30H
opcode = 80 địa chỉ tương đối
Khi chạy: PC=1122, ĐCTĐ=30
đích=PC+ĐCTĐ=1122+30=1152H
20
SJMP
• Đôi khi, ta muốn vi điều khiển dừng lại và chờ đợi tại
một vị trí trong chương trình.
• Ta có thể sử dụng
Dòng PC Opcode Mnemonic Toán hạng
17 0015 80FE HERE: SJMP HERE
18 0017 END
• Ta cũng có thể sử dụng lệnh dưới đây:
SJMP $
22
Địa chỉ tương đối (Relative Address)
23
Lệnh nhảy tuyệt đối AJMP
Bits 15 13 12 8 7 0
ĐC đích opcode địa chỉ đích
00001
24
Ví dụ 3-6 (1)
Sử dụng file list dưới đây, kiểm tra lại sự tính toán các địa chỉ
nhảy tiến của trình dịch.
Line PC Opcode Mnemonic Operand
01 0000 ORG OOOO
02 0000 7800 MOV R0,#0
03 0002 7455 MOV A,#55H
04 0004 6003 JZ NEXT
05 0006 08 INC R0
06 0007 04 AGAIN: INC A
07 0008 04 INC A
08 0009 2477 NEXT: ADD A,#77H
09 000B 5005 JNC OVER
10 000D E4 CLR A
11 000E F8 MOV R0,A
12 OOOF F9 MOV R1,A
13 OO1O FA MOV R2,A
14 OO11 FB MOV R3,A
15 OO12 2B OVER: ADD A,R3
16 OO13 50F2 JNC AGAIN
17 0015 80FE HERE: SJMP HERE
18 OO17 END 25
Ví dụ 3-6 (2)
Giải:
Khi địa chỉ đích > PC nhảy tiến
JZ NEXT (6003H)
Opcode=60; địa chỉ đích=NEXT=0009H; PC=0006H Dịch
Địa chỉ tương đối
= địa chỉ đích-PC=0009-0006=0003
Địa chỉ đích=0006H+0003H=0009H Chạy
JNC OVER (5005H)
Opcode=50; địa chỉ đích=OVER=0012H; PC=000DH Dịch
26
Ví dụ 3-7
Kiểm tra lại sự tính toán các địa chỉ nhảy lùi trong ví dụ 3-6.
Giải:
Địa chỉ đích < PC nhảy lùi
JNC AGAIN (50F2H)
Opcode=50; địa chỉ đích=AGAIN=0007H; PC=0015H Dịch
Địa chỉ tương đối
= địa chỉ đích-PC=0007H-0015H=-14=FFF2H
Địa chỉ đích =0015H + FFF2H = 0007H Chạy
28
Lệnh CALL
Chương trình
chính
31
Lệnh LCALL (Long Call)
• Là lệnh 3-byte
– Byte đầu là opcode.
– Hai byte tiếp sau là địa chỉ đích.
• LCALL được sử dụng để nhảy tới một vị trí địa chỉ
bất kỳ trong 64K byte của không gian bộ nhớ chương
trình của 8051.
Bits 23 16 15 8 7 0
opcode = 12 địa chỉ đích
32
LCALL
Chương trình
ROM addr. chính
0000 Chương trình
ROM addr. con DELAY
0300 MOV R5,#0FFH;
34
Ví dụ 3-8
Viết một chương trình bật tắt các bit của cổng P1 bằng cách gửi
tới nó các giá trị 55H và AAH xen kẽ nhau. Đặt một khoảng thời
gian trễ giữa các lần gửi dữ liệu tới cổng P1.
Giải:
ORG 0
BACK: MOV A,#55H ;nạp vào A giá trị 55H
MOV P1,A ;gửi 55H tới cổng 1
LCALL DELAY ;trễ một thơi gian
MOV A,#0AAH ;nạp vào A giá trị AA
MOV P1,A ;gửi AAH tới cổng 1
LCALL DELAY
SJMP BACK ;lặp lại
Giải: (b)
Khi lệnh LCALL đầu được thực hiện, địa chỉ địa chỉ Nội
stack dung
của lệnh “MOV A,#0AAH” được cất vào
stack. Chú ý rằng byte thấp của địa chỉ được 0A
cất trước và byte cao được cất vào sau. Lệnh
09 00
cuối cùng của chương trình con được gọi
phải là lệnh RET để ra lệnh cho CPU lấy các 08 07
byte trên đỉnh của stack đưa tới PC và lại tiếp
tục thực hiện lệnh ở địa chỉ 07. Biểu đồ hình SP = 09
bên minh họa cho nội dung trong stack sau
khi thực hiện lệnh LCALL đầu tiên.
37
Phương thức gọi một chương trình con
• Sau khi thực hiện chương trình con, 8051 cần phải
biết nơi quay về trong chương trình chính.
• Phương thức gọi một chương trình con:
– Một chương trình con được gọi bằng các lệnh CALL.
– 8051 đẩy PC hiện thời vào stack.
– 8051 copy địa chỉ đích tới PC.
– 8051 nạp các lệnh từ vị trí địa chỉ mới.
– Khi lệnh RET được nạp, chương trình con kết thúc.
– 8051 lấy địa chỉ quay về từ stack.
– 8051 copy địa chỉ quay về tới PC.
– 8051 nạp các lệnh từ địa chỉ mới. 38
Ví dụ 3-10 (1/3)
Xem xét nội dung của stack sau khi thực hiện lệnh LCALL đầu
tiên trong chương trình sau đây.
01 0000 ORG 0
02 0000 7455 BACK: MOV A,#55H ;nạp 55H vào A
03 0002 F590 MOV P1,A ;gửi 55H ra port1
04 0004 7C99 MOV R4,#99H
05 0006 7D67 MOV R5,#67H
06 0008 120300 LCALL DELAY ;gọi trễ
07 000B 74AA MOV A,#0AAH ;nạp AAH vào A
08 000D F590 MOV P1,A ;gửi AAH ra port 1
09 000F 120300 LCALL DELAY
10 0012 80EC SJMP BACK ;lặp
11 0014 ;---chương trình con
12 0300 ORG 300H
13 0300 C004 DELAY:PUSH 4 ;PUSH RAM 04H
14 0302 C005 PUSH 5 ;PUSH RAM 05H
15 0304 7CFF MOV R4,#0FFH;R4=FFH
16 0306 7DFF NEXT: MOV R5,#0FFH;R5=255
17 0308 DDFE AGAIN:DJNZ R5,AGAIN
18 030A DCFA DJNZ R4,NEXT
19 030C D005 POP 5 ;POP tới RAM 05H
20 030E D004 POP 4 ;POP tới RAM 04H
21 0310 22 RET ;quay về CT chính
22 0311 END ;kết thúc file 39
Ví dụ 3-10 (2/3)
Giải:
Stack quản lý nơi CPU sẽ trở về sau khi hoàn thành chương trình
con. Vì lý do này, số các lệnh PUSH và lệnh POP phải luôn bằng
nhau trong bất kỳ một chương trình con nào.
0B 0B 0B 67 R5
0A 0A 99 R4 0A 99 R4
0B 0B 0B
0A 99 R4 0A 0A
09 00 PCH 09 00 PCH 09
08 0B PCL 08 0B PCL 08
• Là lệnh 2-byte
– Địa chỉ đích phải trong khoảng 2K bytes của bộ nhớ
chương trình.
– Sử dụng ACALL có thể tiết kiệm không gian bộ nhớ hơn
so với sử dụng LCALL.
– Opcode (theo byte) của ACALL là 11H, 31H,…,F1H
Bits 15 13 12 8 7 0
đích opcode địa chỉ đích
10001
42
ACALL
Trả lời:
44
Ví dụ 3-12
Viết lại chương trình ở ví dụ 3-8 sao cho hiệu quả hơn.
Giải:
ORG 0
MOV A,#55H ;A=01010101B=55H
BACK: MOV P1,A ;đưa tgh. A tới port 1
ACALL DELAY ;gọi delay
CPL A ;A=10101010B=0AAH ;bù
SJMP BACK ;lặp vô hạn
;---đây là chương trình con delay
DELAY: MOV R5,#OFFH ;R5=255, số đếm
AGAIN: DJNZ R5,AGAIN ;nhảy nếu R5 giảm về 0
RET ;trở về CT gọi
END ;kết thúc
45
3.3 Tính toán
khoảng thời gian trễ
46
Chu kỳ máy(1/2)
47
Chu kỳ máy(2/2)
C1
XTAL1 Chu kỳ của MC
30pF = 12 × chu kỳ dao động ngoài
Tần số của MC
GND
= 1/12 × tần số dao động ngoài
dao động ngoài
chu kỳ máy 49
Ví dụ 3-13
Dưới đây là tần số của các thạch anh sử dụng cho 3 hệ thống
8051. Tính chu kỳ của chu kỳ máy cho mỗi hệ thống.
(a) 11.0592 MHz (b) 16 MHz (c) 20 MHz
Giải:
50
Ví dụ 3-14
Một hệ thống 8051 sử dụng dao động 11.0592 MHz, tính thời gian
để nó thực hiện mỗi lệnh dưới đây.
(a) MOV R3,#55 (b) DEC R3 (c) DJNZ R2, target
(d) LJMP (e) SJMP (f) NOP (g) MUL AB
Giải:
Chu kỳ máy cho hệ thống 11.0952 MHz là 1.085 s.
Tham khảo số chu kỳ máy cho mỗi lệnh của 8051, tính được.
Giải:
(a) 11.0592MHz/12 = 921.6 KHz
MC là 1/921.6 KHz = 1.085 s (micro giây) = 1085 ns
(b) 11.0592MHz/6 =1.8432 MHz, MC là 1/1.8432MHz = 542 ns
(c) 11.0592MHz/4 =2.7648 MHz, MC là 1/2.7648MHz = 360 ns
(d) 11.0592MHz/1 =11.0592 MHz, MC là 1/11.0592MHz =90 ns
57
Tính trễ cho Vi điều khiển DS89C4x0
62
Ví dụ 3-22(1/2)
Viết một chương trình bật tắt các bit của cổng P1 sau mỗi 200ms
(như ví dụ 3-21) cho chip DS89C4x0. Thạch anh là 11.0592 MHz.
Giải:
MOV A,#55H
AGAIN: MOV P1,A
ACALL DELAY
CPL A
SJMP AGAIN
DELAY: MOV R5,#9 2
HERE1: MOV R4,#242 2
HERE2: MOV R3,#255 2
HERE3: DJNZ R3,HERE3 4
DJNZ R4,HERE2 4
DJNZ R5,HERE1 4
RET 63
Ví dụ 3-22 (2/2)
Nếu chỉ tính trễ do lệnh DJNZ.
Giá trị xấp xỉ của thời gian trễ bên trong vòng lặp HERE1 là:
vòng lặp HERE1 = 9 × 242 × 255 × 4MC × 90 ns
= 199940 ns
Cần chính xác hơn, cộng thêm trễ do các lệnh MOV trong các vòng
HERE1/HERE2/HERE3 và AGAIN .
64
Bộ định thời (Timer)
• Việc sử dụng các lệnh để phát ra thời gian trễ không
phải là phương pháp thiết thực nhất.
• Để đạt được thời gian trễ chính xác hơn, chúng ta sử
dụng bộ định thời (timer) sẽ trình bày ở phần sau.
• Khi cần ứng dụng yêu cầu thời gian trễ chính xác đối
với bộ vi điều khiển 8051, ta phải sử dụng
oscilloscope để đo lường chính xác khoảng thời gian
trễ.
65