ĐHBK Tp HCM–BMĐT
GVPT: Hồ Trung Mỹ
Bài tập Vi Xử Lý – Chương 3
Bài tập trong chương này được chia làm 7 phần: Tóm tắt phần cứng
(3.1+3.2), Tập lệnh (3.3+3.4), Timer (3.5), Cổng nối tiếp (3.6), Ngắt (3.7),
Assembler (3.8) và tổng hợp.
Phần 1 – Tóm tắt phần cứng
1.1Kể tên các nhà sản xuất khác (ngoài Intel) có chế tạo MCU 8051?
1.2Ta sử dụng lệnh gì để đặt LSB của byte ở địa chỉ 25H lên 1?
1.3Hãy viết các lệnh dùng để OR các bit có địa chỉ là 00H và 01H, kết quả cất vào
bit có địa chỉ 02H?
1.4Sau khi thực thi các lệnh sau thì những bit nào có giá trị 1?
MOV R0, #26H
MOV @R0, #7AH
1.5Hãy tìm lệnh 1 byte có cùng hiệu ứng như lệnh 2 byte sau:
MOV 0E0H, #55H
1.6Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H.
1.7Có bao nhiêu thanh ghi chức năng đặc biệt được định nghĩa trong 8051, 8052?
1.8Sau khi reset hệ thống, giá trị của SP của 8051 là bao nhiêu?
1.9Ta có thể sử dụng lệnh gì để khởi tạo trị cho SP của 8031 để tạo stack 64 byte ở
đỉnh của RAM nội?
1.10 Một chương trình con sử dụng các thanh ghi R0-R7 mở rộng. Hãy minh họa
làm cách nào chương trình con này chuyển sang sử dụng các thanh ghi R ở
bank 3 khi vào chương trình con này và trả lại bank thanh ghi cũ khi kết thúc
chương trình con đó?
BT-VXL-Ch 3 – trang 1
1.11 MCU 80C31BH–1 hoạt động với thạch anh 16MHz nối vào các ngõ vào
XTAL1 và XTAL2 của nó. Nếu không có sử dụng lệnh MOVX, tần số của tín
hiệu ALE là bao nhiêu?
1.12 8051 được sử dụng với thạch anh 4MHz, khi đó chu kỳ máy là bao nhiêu?
1.13 Chu kỳ nhiệm vụ của ALE là bao nhiêu? Giả sử phần mềm không truy cập
RAM ngoài. (chú ý là chu kỳ nhiệm vụ = chu kỳ bổn phận = chu kỳ làm việc =
duty cycle = thời gian ON / chu kỳ của tín hiệu)
1.14 Ta biết rằng 8051 bị reset nếu chân RST được giữ ở mức cao trong tối thiểu 2
chu kỳ máy. (chú ý là với đặc tính DC của 8051 thì mức cao ở RST tối thiểu là
2.5V)
a) Nếu 8051 hoạt động với thạch anh 8MHz, khoảng thời gian tối thiểu
giữ cho RST ở mức cao để reset hệ thống là bao nhiêu?
b) Hình 2-15a cho thấy mạch RC dùng để reset bằng tay. Trong khi đang
ấn nút reset thì RST=5V và hệ thống được giữ ở trạng thái reset. Như
vậy sau khi nút reset được nhả ra thì 8051 sẽ vẫn giữ ở trạng thái reset
trong bao lâu?
1.15 Chân cổng P1.7 (chân 8) có thể lái được bao nhiêu tải Schottky công suất thấp
(LS)?
1.16 Liệt kê các tín hiệu điều khiển bus của 8051 để chọn các EPROM ngoài và các
RAM ngoài.
1.17 Địa chỉ bit của MSB của byte ở địa chỉ 25H trong vùng dữ liệu nội của 8051 là
bao nhiêu?
1.18 Hãy liệt kê những lệnh dùng để đặt LSB của thanh ghi tích lũy lên 1 mà không
ảnh hưởng 7 bit khác?
1.19 Giả sử lệnh sau vừa được thực thi:
MOV A, #55H
Giá trị của bit P trong PSW là bao nhiêu?
1.20 Hãy viết các lệnh dùng để sao chép nội dung của R7 vào ô nhớ 100H ở RAM
ngoài.
1.21 Giả sử ta đang dùng bank 0, hãy ghi các giá trị trong RAM nội của 8051 sau khi
thực thi đoạn mã sau:
MOV R4, #32H
BT-VXL-Ch 3 – trang 2
MOV R0, #12H
MOV R7, #3FH
MOV R5, #55H
1.22 Sau khi cấp điện cho VXL, hãy cho biết bằng cách nào chọn bank 2 bằng một
lệnh.
1.23 Giả sử lệnh thứ nhất được thực thi sau khi reset hệ thống là gọi chương trình
con. Nội dung của PC được cất ở những địa chỉ nào trong RAM nội trước khi rẽ
nhánh chương trình?
1.24 Sự khác biệt giữa chế độ nghỉ (idle) và chế độ tắt nguồn?
1.25 Lệnh gì dùng để đưa 8051 vào chế độ tắt nguồn?
1.26 Tất cả các thanh ghi R0–R7 rộng bao nhiêu bit? Phần lớn các thanh ghi trong
8051 rộng bao nhiêu bit? Kể tên các thanh ghi 16 bit trong 8051.
1.27 Bit P của PSW là bao nhiêu sau khi thực thi mỗi lệnh sau:
a) CLR C
b) MOV A, #0CH c) MOV A, #0ABH
1.28 Những địa chỉ bit nào sau đây có giá trị là 1 sau khi thực thi (các) lệnh:
a) MOV 26H, #26H
MOV A, #13H
e) MOV 30H, #55H
XRL 30H, #0AAH
b) SETB P1.1
c) MOV P3, #0CH d)
f) MOV R0, #26H
MOV @R0, #7AH
1.29 Sau khi thực thi lệnh này thì bank thanh ghi nào được chọn?
a) MOV PSW, #0C8H b) MOV PSW, #50H
c) MOV PSW, #10H
1.30 Hãy minh họa làm cách nào có thể giao tiếp 2 RAM tĩnh (mỗi RAM 32KB) với
8051 để chúng có thể chiếm toàn bộ vùng dữ liệu ngoài 64K.
1.31 Với hình 3.15 trong sách, giả sử RAM ngoài có dung lượng là 211x8, các
chân P2.0, P2.1, và P2.2 được nối vào các chân A8, A9, và A10 tương ứng
của RAM. Hãy cho biết:
a) với cách nối này RAM được chia làm bao nhiêu trang?
b) muốn truy cập đến byte thứ 8 (thứ tự kể từ 0) của trang 5 thì làm
cách nào?
BT-VXL-Ch 3 – trang 3
c) địa chỉ thật của byte trên là bao nhiêu?
d) viết đoạn chương trình để gán trị 56H vào địa chỉ 548H.
1.32 Với hệ thống dùng 8051, hãy thiết kế mạch giải mã địa chỉ cho các trường
hợp sau: (giả sử tín hiệu chọn chip đều là tích cực thấp [/CS])
Trường hợp 1
Tầm địa chỉ
Trường hợp 2
Thiết bị
Địa chỉ bắt
đầu
Kích
thước
Thiết bị
0000H–
3FFFH
RAM
0000H
8Kx8
ROM
8000H–
9FFFH
ROM
4000H
16 K x 8
RAM 1
E000H–
FFFFH
I/O (8255 PIA)
8000H
16 K x 8
RAM 2
FF00H
256 x 8
I/O (8255
PIA)
Phần 2 – Tập lệnh
2.1 Hãy cho biết cách định địa chỉ của các lệnh sau
a) MOV R1, A c) MOV A,
#12H
e) MOV R6,
#28H
g) MOVX A,
@DPTR
i) LJMP
0548H
b) MOV A,
@R1
f) SJMP
LOOP
h) ACALL
SUB1
j) PUSH B
d) MOV A,
12H
2.2 Mã máy dạng hex của lệnh sau là gì?
INC DPTR
2.3 Mã máy dạng hex của lệnh sau là gì?
DEC R6
2.4 Lệnh nào được biểu diễn bởi mã máy 5DH?
2.5 Lệnh nào được biểu diễn bởi mã máy FFH?
2.6 Liệt kê tất cả các lệnh 3 byte của 8051 có mã máy tận cùng là 5H.
BT-VXL-Ch 3 – trang 4
2.7 Hãy minh họa bằng cách nào ta có thể chuyển nội dung của địa chỉ nội 50H
vào thanh ghi tích lũy A với định địa chỉ gián tiếp?
2.8 Mã lệnh nào không được định nghĩa trong 8051?
2.9 Để nạp vào R4 giá 65H thì có cần dấu “#” trong lệnh: MOV R4, #65H không?
2.10 Ta xét lệnh sau:
MOV 50H, #0FFH
a) Mã lệnh của lệnh này là bao nhiêu?
b) Lệnh này dài bao nhiêu byte?
c) Giải thích mỗi byte của lệnh này.
d) MCU phải cần bao nhiêu chu kỳ máy để thực hiện lệnh này?
e) Nếu 8051 hoạt động với thạch anh 16 MHz, MCU phải mất bao lâu
mới thực thi xong lệnh này?
2.11 Offset tương đối của lệnh sau là bao nhiêu?
SJMP
AHEAD
nếu lệnh này đang ở ô nhớ 0400H và 0401H, và nhãn AHEAD biểu diễn
lệnh ở địa chỉ 041FH.
2.12 Offset tương đối của lệnh sau là bao nhiêu?
SJMP
BACK
nếu lệnh này đang ở ô nhớ A050H và A051H, và nhãn BACK biểu diễn
lệnh ở địa chỉ 9FE0H.
2.13 Giả sử lệnh
AJMP
AHEAD
ở bộ nhớ chương trình tại địa chỉ 2FF0H và 2FF1H, và nhãn AHEAD
tương ứng với lệnh ở địa chỉ 2F96H. Những byte mã máy (dạng số hex) của
lệnh này là gì?
BT-VXL-Ch 3 – trang 5
2.14 Tại một chỗ trong chương trình, nếu ta muốn chương trình rẽ nhánh đến nhãn
EXIT nếu thanh ghi A bằng mã ASCII của “carriage return”. Thì ta phải sử
dụng (những) lệnh gì?
2.15 Lệnh
SJMP
BACK
ở bộ nhớ chương trình tại địa chỉ 0100H và 0101H, và nhãn BACK tương
ứng với lệnh ở địa chỉ 00AEH. Những byte mã máy (dạng số hex) của lệnh
này là gì?
2.16 Lệnh sau thực hiện gì ?
SETB 0D7H
Có cách nào tốt hơn thực hiện cùng tác vụ này? Tại sao?
2.17 Sự khác biệt giữa 2 lệnh sau là gì?
INC A
INC ACC
2.18 Hãy viết những byte mã máy cho lệnh sau
LJMP
ONWARD
nếu nhãn ONWARD biểu diễn lệnh ở địa chỉ 0A0F6H.
2.19 Giả sử thanh ghi tích lũy A chứa 5AH. Nội dung trong thanh ghi A là gì sau khi
thực thi lệnh:
XRL A, #0FFH
2.20 Giả sử PSW chứa 0C0H và thanh ghi A chứa 50H trước khi thực thi lệnh RLC
A. Nội dung của thanh ghi A sau khi thực thi lệnh trên là bao nhiêu?
2.21 Hãy viết (các) lệnh tương đương để thực hiện:
a) Xóa nội dung thanh ghi A
b) Lấy bù 1 giá trị ở thanh ghi A và cất lại vào A
2.22 Hãy viết các lệnh thực hiện:
a) Chia nguyên nôïi dung của A cho 16 (giả sử A < 256).
BT-VXL-Ch 3 – trang 6
b) Nhân nguyên nội dung của A cho 8 (giả sử A <32).
2.23 Nội dung của thanh ghi A là bao nhiêu sau khi 8051 thực hiện các lệnh sau:
a)
MOV A, #15H
c)
MOV A, #15
e) MOV
A,
#7FH
MOV R2, #13H
MOV R5, #15
MOV
50H, #29H
ADD A, R2
ADD A, R5
MOV R0,
#50H
b)
MOV R4, #25H
d)
MOV A, #25
XCHD A,
@R0
MOV A, #1FH
MOV R7, #18H
ADD A, R4
ADD A, R7
2.24 Hãy viết mã máy cho các đoạn chương trình trong 2.23, giả sử là đang sử dụng
bank thanh ghi 0.
2.25 Các lệnh nào không hợp lệ trong các lệnh sau?
1) MOV R3, #500
5) MOV R1,
#50
9) MOV A,
#255H
13) MOV R7,
#00
2) MOV A, #50H
6) MOV A,
#F5H
10) ADD R3,
#50H
14) MOV R9,
#50H
3) ADD A, R5
7) ADD A,
#50H
11) ADD A,
#F5H
15) ADD R7,
R4
4) ADD
A
8) ADD
#255H
12) MOV A,
@R3
16) PUSH A
R3,
A,
2.26 Mỗi lệnh sau chiếm bao nhiêu byte và thực hiện trong bao lâu (giả sử XTAL
12MHz):
a) MOV
A, #55H
b) MOV
R3, #3
e) MOV
A, R1
f) MOV
R3, A
A, R2
c) INC
R2
h) ADD
d) ADD
A, #0
i) MOVX A, @DPTR
2.27 Giá trị của cờ CY sau đoạn mã sau:
BT-VXL-Ch 3 – trang 7
a) CLR
C
b) MOV A, #54H c) MOV A, #00
CPL
C
ADD
#0C4H
A,
ADD A,
#0FFH
d) MOV A,
#250
ADD
#05
A,
2.28 Viết các đoạn chương trình 8051:
a)
Điền giá trị 48H vào các ô nhớ trong RAM nội từ địa chỉ 40H đến 89H
bằng cách dùng lệnh định địa chỉ gián tiếp và vòng lặp.
b)
Xóa 20 ô nhớ trong RAM nội với địa chỉ bắt đầu là 80H.
c)
Sao chép 10 ô nhớ từ RAM nội có địa chỉ đầu là 35H đến vùng nhớ khác
có địa chỉ đầu là 60H.
2.29 Viết chương trình cộng 2 số 16 bit. Các số là 3CE7H và 3B8DH. Đặt byte cao
của tổng ở R7 và byte thấp của tổng ở R6.
2.30 Viết các lệnh 8051 để thực hiện các tác vụ sau:
a) Chuyển giá trị dữ liệu 55H vào cổng 1
b) Đặt bit 3 của Port 3 lên 1
c) Cộng dữ liệu ở địa chỉ được chứa trong R0 vào thanh ghi tích lũy.
d) So sánh dữ liệu trong R0 với giá trị 10H và nhảy đến nhãn Label1 nếu chúng
khác nhau.
e) Đợi ở địa chỉ hiện hành cho đến khi ở Port 3 bit 0 thay đổi từ 1 sang 0.
2.31 Viết chương trình lấy dữ liệu hex (có giá trị 00H–FFH) từ cổng P1 và đổi
nó sang thập phân. Cất các số lần lượt vào các thanh ghi R5 (chứa hàng
trăm), R6 (chứa hàng chục), R7 (chứa đơn vị).
2.32 Giả sử có 5 dữ liệu BCD 2 ký số (digit) được đặt liên tiếp trong RAM nội với
địa chỉ bắt đầu là 40H. Hãy viết chương trình tính tổng của 5 dữ liệu này, kết
quả được cất vào RAM nội với địa chỉ bắt đầu là 50H (byte thấp để ở địa chỉ
BT-VXL-Ch 3 – trang 8
thấp). Giả sử các dữ liệu BCD là: (40H)=71H, (41H)=11H, (42H)=65H,
(43H)=59H và (44h)=37H; hãy kiểm tra lại chương trình với các dữ liệu này.
2.33 Nội dung của các thanh ghi và các ô nhớ trong 8051 là:
Thanh ghi
Nội dung
Địa chỉ bộ nhớ
nội
Nội dung
A
42H
22H
25H
B
5AH
23H
F5H
R0 (bank 0)
15H
24H
17H
R1 (bank 0)
09H
25H
5CH
SP
22H
26H
8AH
PC
B100H
27H
06H
Sau khi thực thi đọan chương trình sau thì bảng giá trị trên sẽ thay đổi như thế
nào?
MOV A, #1H
MOV B, #8H
MUL AB
MOV R0, #27H
ADD A, @R0
PUSH
ACC
Giả sử XTAL=12MHz, hãy viết mã máy đọan chương trình trên và cho biết
đoạn chương trình trên được thực thi trong bao lâu?
2.34 Nội dung của các thanh ghi và các ô nhớ trong 8051 là:
Thanh ghi
Nội dung
Địa chỉ bộ nhớ
nội
Nội dung
A
42H
2FH
25H
B
5AH
30H
F5H
R0 (bank 0)
33H
31H
17H
SP
2FH
32H
05H
BT-VXL-Ch 3 – trang 9
PC
8100H
33H
06H
Sau khi thực thi đoạn chương trình sau thì bảng giá trị trên sẽ thay đổi như thế
nào?
PUSHACC
MOV A, 32H
ADD A, @R0
MOV 31H, A
RL
A
ANL A, #0F6H
DEC R0
MOV @R0, B
Giả sử XTAL=12MHz, hãy viết mã máy đoạn chương trình trên và cho biết
đoạn chương trình trên được thực thi trong bao lâu?
2.35 Hãy biểu diễn các trị số ở stack và con trỏ ngăn xếp cho mỗi dòng của đoạn
chương trình sau:
ORG 0
MOV R0, #66H
MOV R3, #7FH
MOV R7, #5DH
PUSH 0
PUSH 3
PUSH 7
CLR A
MOV R3, A
MOV R7, A
POP 3
POP 7
POP 0
BT-VXL-Ch 3 – trang 10
Đoạn chương trình có trả lại các trị cũ cho các thanh ghi R0, R3, và R7 không?
Nếu không thì phải đổi gì để lưu lại giá trị.
2.36 Hãy viết các lệnh dùng để tạo ra xung xuống mức thấp trong 5 µs ở P1.7? Giả
sử P1.7 ban đầu ở mức cao và 8051 làm việc với thạch anh 12MHz.
2.37 Viết chương trình tạo ra sóngvuông 83.3KHz ở P1.0 (giả sử hoạt động
12MHz).
2.38 Viết chương trình tạo ra xung mức cao trong 4 µs ở chân P1.7 cứ sau 200 µs.
2.39 Viết các chương trình để cài đặt các phép toán logic như ở hình E.3-1.
Hình E.3-1. Các bài toán lập trình logic: (a) NOR 3 ngõ vào; (b) NAND 8 ngõ
vào; và (c) Phép toán logic dùng 3 cổng.
2.40 Với hình E.3-1(a), thời gian trì hoãn truyền trường hợp xấu nhất từ lúc có
chuyển tiếp ở ngõ vào đến lúc có chuyển tiếp ở ngõ ra là bao nhiêu?
2.41 Sau khi thực thi nhóm lệnh sau, nội dung của thanh ghi A là bao nhiêu?
MOV A, #7FH
MOV 50H, #29H
MOV R0, #50H
XCHD
A, @R0
BT-VXL-Ch 3 – trang 11
2.42 Hãy viết những byte mã máy cho lệnh sau?
SETB P2.6
2.43 Ta phải sử dụng những lệnh gì để chép cờ 0 (F0) trong PSW vào chân cổng
P1.5?
2.44 Dưới tình huống nào thì ASM51 (của Intel) sẽ chuyển lệnh JMP chung
(tổng quát) thành LJMP?
2.45 Bộ nhớ nội của 8051 được khởi tạo trị như sau, ngay trước khi thực thi
lệnh RET:
Địa chỉ nội Nội dung SFRs Nội dung
0BH
9AH
SP
0BH
0AH
78H
PC
0200H
09H
56H
A
55H
08H
34H
07H
12H
Nội dung của PC sau khi thực thi lệnh RET là bao nhiêu?
2.46 Viết một đoạn ngắn mã 8051 đọc liên tục 1 byte dữ liệu từ Port 1 và ghi nó
ra Port 2, cho đến khi byte đọc được bằng 4AH thì dừng lại.
2.47 Cho đoạn mã sau:
RTN: PUSH
LOOP:
PSW
MOV A, @R0
MOV
@R1, A
INC R0
INC R1
DJNZ
B, LOOP
BT-VXL-Ch 3 – trang 12
POP PSW
RET
a) Chương trình con RTN làm gì?
b) Thanh ghi nào được dùng làm địa chỉ nguồn?
c) Thanh ghi nào được dùng làm địa chỉ đích?
d) Thanh ghi B được dùng làm gì trong chương trình con?
e) Ta nên thay đổi chương trình con trên như thế nào để không ảnh
hưởng đến các thanh ghi trong chương trình gọi RTN?
2.48 Cho chương trình con 8051 như sau:
SUB: MOV R0, #20H
LOOP:
MOV @R0, #0
INC R0
CJNE R0, #80H, LOOP
RET
a)
Chương trình con này làm gì?
b)
Mỗi lệnh trong chương trình con trên thực thi mất mấy chu kỳ máy?
c)
Mỗi lệnh dài bao nhiêu byte?
d)
Chương trình con trên thực thi mấy bao nhiêu? (giả sử hoạt động
12MHz)
2.49 Một DIP switch 4 bit và LED 7 đoạn anode chung được nối vào 8051 như
được chỉ trong hình E.3-2. Hãy viết chương trình liên tục đọc mã 4 bit từ
DIP switch và cập nhật các LED để hiển thị ký tự hex thích hợp. Thí dụ,
nếu đọc được mã 1100B thì sẽ xuất hiện ký tự hex “C”, như vậy các đoạn
từ a đến g tương ứng sẽ là ON, OFF, OFF, ON, ON, ON, và OFF. Chú ý là
việc đặt chân cổng ở 8051 là 1 sẽ làm cho đoạn
tương ứng ON.
BT-VXL-Ch 3 – trang 13
Hình E.3-2. 8051 giao tiếp với DIP SW và LED 7 đoạn.
2.50 Xét chương trình sau:
MOV
R0, #20H
MOV
R1, #30H
MOV
R2, #2
CLR
C
NEXT:
MOV
; ###
A, @R0
ADDC
A, @R1
MOV
@R0, A
INC
R0
INC
R1
DJNZ
R2, NEXT ; ***
a) Sau khi thực thi lệnh thứ ba (có chú thích ###), nội dung của R0, R1, và
R2 là bao nhiêu?
b) Lệnh có nhãn NEXT được thực thi bao nhiêu lần?
c) Sau khi hoàn tất chương trình trên thì nội dung của R0, R1, và R2 là bao
nhiêu?
BT-VXL-Ch 3 – trang 14
d) Nếu nội dung của các ô nhớ như sau:
(20H) = 45H
(21H) = 23
(30H) = 89H
(31H) = 67H
•
Cho biết nội dung của các ô nhớ trên sau khi thực thi chương trình
trên?
•
Chức năng của chương trình trên?
•
Các toán hạng được cất trong bộ nhớ như thế nào?
2.51 Xét chương trình 8051 sau:
start: MOV R0, #05H
MOV R1, #40H
MOV R2, #0H
; ###
MOV @R1, #0H
again:
MOV DPTR, #TABLE
MOV A, R2
MOVC
A, @A + DPTR
ADD A, @R1
MOV @R1, A
INC R2
DJNZ R0, again
AJMP
TABLE:
EXIT
DB
10H, 11H, 12H, 13H, 14H
EXIT:END
a) Sau khi thực thi lệnh (có chú thích ###) thì nội dung của R0, R1, và R2 là
bao nhiêu?
BT-VXL-Ch 3 – trang 15
b) Lệnh có nhãn again được thực thi bao nhiêu lần?
c) Sau khi hoàn tất chương trình trên thì nội dung của R0, R1, và R2 là bao
nhiêu?
d) Nội dung của ô nhớ 40H sau khi thực thi chương trình trên?
e) Chức năng của chương trình trên?
f) Nếu kết quả của chương trình trên được cất vào ô nhớ 50H thì lệnh nào
cần sửa đổi và đổi như thế nào?
2.52 Xét chương trình sau (giả sử LED là địa chỉ của 1 bit xuất nào đó).
BLINK: CPL LED
CALL DELAY
JMP BLINK
DELAY: MOV
R1, #145
DLY2: MOV
R2, #199
DLY1: MOV
R3, #210
DJNZ
R3, $
DJNZ R2, DLY1
DJNZ R1, DLY2
RET
a) Giả sử XTAL có tần số 6MHz, hãy tính thời gian ON và thời gian OFF
của LED
b) Tính thời gian ON của LED trong đoạn sau với XTAL là 12MHz
DELAY: MOV
R1, #136
DLY2: MOV
R2, #136
DLY1: MOV
R3, #136
DJNZ
R3, $
DJNZ R2, DLY1
DJNZ R1, DLY2
BT-VXL-Ch 3 – trang 16
RET
2.53 Cho đoạn mã sau:
RTN: PUSH
B
LP: MOV B, @R0
CJNE
A, B, NEXT
MOV R1, #01H
SJMP
NEXT:
FIN
INC R0
DJNZ
R1, LP
MOV R1, #0H
FIN: POP B
RET
a) Chương trình con RTN làm gì?
b) Thanh ghi nào được dùng làm mẫu dữ liệu tìm kiếm?
c) Thanh ghi nào được dùng chứa kết quả?
d) Thanh ghi B được dùng làm gì trong chương trình con?
e) Giải thích hoạt động của các lệnh PUSH và POP trong chương trình
con.
2.54 Các ô nhớ RAM nội với địa chỉ 3FH và 40H chứa các giá trị 42H và 04H tương
ứng. Hãy tìm các giá trị các các thanh ghi sau khi thực thi đoạn chương trình
sau:
- các thanh ghi A & B và cờ CY sau khi thực thi lệnh MUL
- các thanh ghi A & B và cờ CY sau khi thực thi lệnh DIV
MOV A, 3FH
MOV 0F0H, 40H
MUL AB
DIV AB
BT-VXL-Ch 3 – trang 17
2.55 Hãy cho biết các giá trị cờ trong PSW của 8051 sau khi thực thi các lệnh sau:
(giả sử giá trị đầu của PSW là 00H)
MOV A, #7FH
MOV 0F0H, #21H
ADD A, B
MOV 0F0H, #80H
SUBB
A, B
2.56 Viết chương trình tìm kiếm trong 1 bảng chứa 16 byte dữ liệu bắt đầu ở
địa chỉ 40H trong RAM nội của 8051 với byte dữ liệu được đọc từ Port 2
a) Khi hoàn tất tìm kiếm thì đặt bit 1 của Port 1 lên 1.
b) Nếu tìm thấy dữ liệu thì đặt bit 2 của Port 1 lên 1.
c) Nếu không tìm thấy dữ liệu thì xóa bit 2 của Port 1 về 0.
2.57 Cho trước đoạn chương trình 8051 sau và các giá trị đầu, hãy tìm các giá trị
trong các thanh ghi và các ô nhớ. Các giá trị đầu ở các ô nhớ là: (55H) = 03H,
(A003H) = 05H, (A005H) = 07H.
MOV R1, 55H
MOV A, R1
MOV DPTR, #0A000H
MOVC A, @A+DPTR
MOVC A, @A+DPTR
MOV R1, A
MOV 55H, R1
2.58 Cho trước đoạn chương trình 8051 sau, hãy tìm
a) Các ô nhớ bị ảnh hưởng và các giá trị của chúng.
b) Tổng số byte cần cho chương trình
BT-VXL-Ch 3 – trang 18
c) Tổng thời gian cần để thực thi đoạn chương trình này (kể cả lệnh RET và
giả sử tần số thạch anh là 12MHz)
RTN: MOV R0, #80H
LOOP1: MOV @R0, #0FFH
DEC R0
CJNE R0, #20H, LOOP1
MOV R1, #90H
LOOP2: MOV @R1, #00H
INC R1
CJNE R1, #0F0H, LOOP2
RET
2.59 Hãy viết mã máy cho đoạn chương trình sau:
ORG 300H
MOV A, #20H
MOV R0, #34H
MOV DPTR, #LABEL
ADD A, R0
AJMP LABEL
ORG 400H
LABEL: LJMP 0300H
2.60 Đoạn chương trình sau chạy vô tận. Giả sử dùng XTAL 6MHz cho clock của
8031. Như vậy ta đọc được tần số bao nhiêu ở scope nếu đo ở chân P1.0
CLR
C
LOOP1:
MOV
A, #47
LOOP2:
DJNZ
A, LOOP2
MOV
P1.0, C
BT-VXL-Ch 3 – trang 19
CPL
C
AJMP
LOOP1
Với cùng chương trình trên thì tần số ở chân ALE là bao nhiêu?
2.61 Viết chương trình con đổi 1 ký số BCD trong thanh ghi A thành biểu diễn
ASCII tương ứng trong ô nhớ được chỉ bởi thanh ghi R0. Nếu giá trị trong
A không phải BCD thì đặt bit có địa chỉ 00H có giá trị 1. Từ đó hãy phát
triển thành chương trình con đổi 2 ký số BCD trong thanh ghi A thành
biểu diễn ASCII của chúng, kết quả được cất vào các ô nhớ có địa chỉ bắt
đầu cho trong R0, ký số BCD có trọng số cao sẽ được cất ở địa chỉ thấp.
Làm lại với chuyển đổi số Hex sang ASCII.
2.62 Viết chương trình con đổi biểu diễn ASCII được cất trong ô nhớ được chỉ
bởi thanh ghi R0 thành ký số BCD tương ứng trong thanh ghi A. Nếu giá
trị trong A không phải BCD thì đặt bit có địa chỉ 00H có giá trị 1. Từ đó
hãy phát triển thành chương trình con đổi 2 ký số dạng ASCII được cất
trong ô nhớ được chỉ bởi thanh ghi R0 (ký số có trọng số cao sẽ được cất ở
địa chỉ thấp). thành BCD trong thanh ghi A. Làm lại với chuyển đổi ASCII
sang số Hex.
2.63 Viết chương trình con BINTOBCD đổi 1 số nhị phân 8 bit thành biểu diễn
BCD tương ứng của nó (3 ký số BCD) để trong các ô nhớ có địa chỉ bắt đầu ở
trong R0, ký số BCD có trọng số cao nhất sẽ ở địa chỉ thấp nhất.
2.64 Viết chương trình con BCDTOBIN đổi số BCD có 2 ký số trong thanh ghi A
thành số nhị phân trong ô nhớ được chỉ bởi R0.
2.65 Viết chương trình xác định xem có bao nhiêu byte có trị là 0, < 0, > 0 trong một
khối bộ nhớ; ô nhớ 40H sẽ chứa số byte có trị bằng 0, ô nhớ 41H sẽ chứa số
byte có trị < 0, ô nhớ 42H sẽ chứa số byte có trị > 0. Ô nhớ 43H chứa địa chỉ
đầu khối bộ nhớ, ô nhớ 44H chứa số byte trong khối đó (chiều dài khối). Thí
dụ: (43H)=45H, (44H)=06, (45H)=68H, (46H)=F2H, (47H)=87H, (48H)=00H,
(49H)=59H, (50H)=2AH thì sau khi chạy đoạn chương trình này thì (41H)=1,
(42H)=2, (43H)=3.
2.66 Tính bù 2 của một số 16 bit có địa chỉ đầu được chỉ bởi R6 (byte cao ở địa chỉ
thấp) và kết quả được cất vào bộ nhớ với địa chỉ đầu được chỉ bởi R7. Thí dụ:
BT-VXL-Ch 3 – trang 20
(R6)=40H, (R7)=42H, (40H)=45H, (41H)=2AH thì kết quả ở (42H)=BAH,
(43H)=D6H. Hãy trình bày các giải pháp có thể có.
2.67 Viết chương trình tìm phần tử nhỏ nhất trong 1 khối dữ liệu. Chiều dài của khối
dữ liệu ở trong ô nhớ 41H và địa chỉ bắt đầu khối ở trong ô nhớ 42H. Chứa
phần tử nhỏ nhất đó trong ô nhớ 40H, giả sử khối dữ liệu chứa các số nhị phân
không dấu. Làm lại với tìm phần tử lớn nhất.
2.68 Viết chương trình SORT sắp thứ các số trong 1 khối dữ liệu. Chiều dài của khối
dữ liệu ở trong ô nhớ 41H và địa chỉ bắt đầu khối ở trong ô nhớ 42H. Kết quả
được lưu vào trong vùng nhớ khối dữ liệu ban đầu. (HD: dùng phương pháp
bubble sort, xem trong các sách về cấu trúc dữ liệu và giải thuật)
2.69 Viết chương trình con nhân 2 số nguyên 8 bit có dấu là nội dung thanh ghi
R4 và R5, dùng bù 2 để biểu diễn cho các số âm. Kết quả là số nguyên 16
bit có dấu để trong thanh ghi R6 (byte cao) và R7 (byte thấp).
2.70 Viết chương trình con trừ số nguyên 16 bit có dấu X (được cất ở R6 và R7,
byte cao ở R6) với số nguyên 16 bit có dấu Y (được cất ở R4 và R5, byte cao ở
R4), dùng biểu diễn bù 2 cho các số âm.
2.71 Viết chương trình con SOSANH nhận 2 tham số 8 bit và so sánh chúng với
nhau. Kết quả được đặt ở thanh ghi ACC. Nếu gọi các tham số là X và Y thì kết
quả cất trong thanh ghi ACC là: -1 nếu X < Y; 0 nếu X = Y; và 1 nếu X > Y.
2.72 Viết chương trình con tính tổng số bit 1 trong 1 byte cho trước ở thanh ghi A.
Làm lại với tính tổng số bit 0. Hãy viết chương trình con cho kết quả tổng số
bit 1 và tổng số bit 0 trong thanh ghi A.
2.73 Viết chương trình con tính trung bình cộng của một dãy các trị số 1 byte không
dấu với số đầu có địa chỉ ở R6, chiều dài của dãy số ở R7. Kết quả được cất
vào R5.
2.74 Hãy mô tả stack, SP và nội dung của các thanh ghi bị ảnh hưởng trong đoạn
chương trìnhsau. Giả sử ban đầu (SP)=07H.
MOV R2, #55H
MOV R5, #0CCH
MOV R1, #0ADH
BT-VXL-Ch 3 – trang 21
PUSH
2
PUSH5
PUSH1
POP 2
POP 1
POP 5
2.75 Viết chương trình xóa ACC và cộng 5H vào ACC 10 lần bằng cách dùng vòng
lặp.
2.76 Có 2KB RAM dữ liệu được gắn vào 8051 (bắt đầu ở địa chỉ 8000H). Viết
chương trình (bắt đầu từ 2030H): a) Điền toàn bộ RAM 2K với trị 55H; b)
kiểm tra lại giá trị ở mỗi ô nhớ có bằng 55H không? Nếu có sai thì cho
P1.1=1 và cho biết bao nhiêu ô nhớ bị sai (cất vào R7).
2.77 Viết chương trình con ATOH đổi 1 byte ASCII sang số hex tương ứng (0–9
và A–F; tương ứng ASCII là 30H–39H và 41H–46H). Nếu byte ASCII
không thuộc 30H–39H hay 41H–46H thì đặt cờ C lên 1. Aùp dụng chương
trình con ATOH để đổi 2 byte ASCII liên tiếp trong RAM nội của 8051 (thí
dụ byte cao ở 40H và byte thấp ở 41H) thành mã hex 1 byte ở 1 ô nhớ
trong RAM nội 8051 (thí dụ ở 42H). Thí dụ: (40H)=36H và (41H)=42H thì
kết quả (42H)=6BH.
2.78 Viết chương trình cài đặt logic cho các hàm sau theo 2 cách: bằng các lệnh xử
lý logic với biến Boole, và bằng các lệnh rẽ nhánh theo điều kiện với bit. Giả
sử các biến X, Y, Z, V, W và F tương ứng với các chân P0.0 đến P0.5.
a) F = (X(Y+Z)). Z. (V+W)
b) F = (XYZ)’ + Z + V + W
c) F = X’Y+ Y’Z+ Z’V’W
d) F = (X’+Y’)(Z+V)(X+W’)
e) F = ((XY + X’Z )’⊕ V)’
BT-VXL-Ch 3 – trang 22
2.79 Viết chương trình copy 16 byte trong bộ nhớ mã ngoài (1000H–100FH)
đến RAM nội từ 30H–3FH.
2.80 Viết chương trình copy 16 byte bộ nhớ dữ liệu ngoài (1000H–100FH) đến
RAM nội từ 30H–3FH.
2.81 Viết chương trình con đổi 1 số BCD 2 ký số thành 2 mã (LED) 7 đoạn. Số
BCD được đọc từ cổng P0 và kết quả được xuất ra P1 và P2 (P1 ứng với ký
số hàng chục, P2 ứng hàng đơn vị). Dạng kết nối phần cứng cho P1 và P2
tương tự trong hình E.2.81.
Hình E.2.81
BT-VXL-Ch 3 – trang 23
Phần 3 – Timer
Trong phần Timer này, ta sẽ giả sử là 8051 được sử dụng với thạch anh 12MHz nếu
bài tập không cho biết tần số thạch anh.
3.1 Viết chương trình 8051 tạo sóng vuông ở P1.5 có tần số 100KHz (Hướng dẫn:
Không sử dụng timer).
3.2 Hiệu ứng của lệnh sau là gì ?
a) SETB
8EH
b) MOV
TMOD, #11010101B
3.3 Hãy cho biết cần nạp trị cho TMOD là bao nhiêu để
a)
Timer 1 chạy chế độ 2, Timer 0 chạy chế độ 1
b)
Timer 1 chạy chế độ 0, Timer 0 chạy chế độ 2
3.4 Có bao nhiêu cách để dừng Timer đang chạy?
3.5 Xét chương trình 3 lệnh ở thí dụ tạo dạng xung (thí dụ đầu trong phần 3.5.8).
Tần số và chu kỳ nhiệm vụ của dạng sóng được tạo ra ở chân P1.0 của 8051
hoạt động với thạch anh 16MHz?
3.6 Hãy tính thời gian trì hoãn của chương trình con DELAY sau với tần số thạch
anh là: a) 12 MHz và b) 11.0592 MHz.
DELAY:
MOV R3,#250
HERE:
;
NOP
1 MC (1 chu kỳ máy)
;
NOP
;
1 MC
NOP
;
1 MC
NOP
;
1 MC
DJNZ R3,HERE
;
2 MC
RET
;
1 MC
1 MC
3.7 Viết lại bài giải của thí dụ giao tiếp buzzer (thí dụ cuối trong phần 3.5.8).
để bao gồm chế độ “restart” (bắt đầu lại). Nếu chuyển tiếp 1 sang 0 xảy ra
BT-VXL-Ch 3 – trang 24
khi buzzer phát tiếng kêu, bắt đầu lại vòng định thì để tiếp tục cho buzzer
kêu trong giây kế, xem minh họa ở hình E.3.7.
Hình E.3.7
3.8 Viết chương trình 8051 tạo sóng vuông ở P1.2 có tần số 12KHz theo cách: a)
dùng Timer 0; và b) không dùng timer.
3.9 Viết chương trình 8051 dùng timer 1 để tăng nội dung của ô nhớ TIME (trong
RAM nội) thêm 1 cứ sau 20 ms.
3.10 Viết chương trình con MOTGIAY theo 2 cách: a) dùng Timer 0; và b)
không dùng timer. Aùp dụng chương trình con trên để tạo dạng sóng
vuông tuần hoàn có chu kỳ 10 s, 20 s và 30 s tương ứng với các chân P1.0,
P1.1 và P1.2.
3.11 Viết chương trình 8051 dùng timer:
a) để tạo xung vuông 500Hz có chu kỳ nhiệm vụ là 70% ở chân P1.0.
b) Tương tự a) nhưng chu kỳ nhiệm vụ là 40% và xung này chỉ tồn tại
trong 10s.
3.12 Thiết kế ứng dụng “cửa xoay” (turnstile) dùng Timer 1 để phát hiện lúc
nào có người thứ
10 000 đi vào khu vực hội chợ. Giả sử (a) cảm biến cửa xoay nối vào T1 và
tạo ra 1 xung khi có người đi vào làm xoay cửa, và (b) đèn được nối vào
chân P1.7 (chú ý thực tế có thêm mạch giao tiếp từ P1.7 với đèn) và sáng
khi P1.7=1 và tắt khi P1.7=0. Như vậy 8051 sẽ đếm số “sự kiện” ở T1 và
BT-VXL-Ch 3 – trang 25