Bài tập Chương 3 môn Vi xử lý - Hồ Trung Mỹ

Đ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.1 Kể tên các nhà sản xuất khác (ngoài Intel) có chế tạo MCU 8051?  
1.2 Ta sử dụng lệnh gì để đặt LSB của byte ở địa chỉ 25H lên 1?  
1.3 Hã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.4 Sau 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.5 Hãy tìm lệnh 1 byte có cùng hiệu ứng như lệnh 2 byte sau:  
MOV 0E0H, #55H  
1.6 Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H.  
1.7 Có bao nhiêu thanh ghi chức năng đặc biệt được định nghĩa trong 8051, 8052?  
1.8 Sau khi reset hệ thống, giá trị của SP của 8051 là bao nhiêu?  
1.9 Ta 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 đó?  
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  
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:  
BT-VXL-Ch 3 – trang 1  
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  
#13H  
b) SETB P1.1  
c) MOV P3, #0CH  
d) MOV A,  
e) MOV 30H, #55H  
XRL 30H, #0AAH  
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?  
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  
Thiết bị  
Trường hợp 2  
Kích thước  
8 K x 8  
Tầm địa chỉ  
0000H–3FFFH  
8000H–9FFFH  
E000H–FFFFH  
Địa chỉ bắt đầu  
0000H  
Thiết bị  
ROM  
RAM 1  
RAM  
ROM  
I/O (8255 PIA)  
4000H  
8000H  
16 K x 8  
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  
b) MOV A, @R1  
c) MOV A, #12H  
d) MOV A, 12H  
e) MOV R6, #28H g) MOVX A, @DPTR i) LJMP 0548H  
f) SJMP LOOP h) ACALL SUB1 j) PUSH B  
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.  
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 2  
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  
INC  
A
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).  
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  
MOV R2, #13H  
ADD A, R2  
MOV R4, #25H  
MOV A, #1FH  
ADD A, R4  
c)  
MOV A, #15  
MOV R5, #15  
ADD A, R5  
MOV A, #25  
MOV R7, #18H  
ADD A, R7  
e) MOV A, #7FH  
MOV 50H, #29H  
MOV R0, #50H  
XCHD A, @R0  
b)  
d)  
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  
2) MOV A, #50H  
3) ADD A, R5  
4) ADD R3, A  
5) MOV R1, #50  
6) MOV A, #F5H  
7) ADD A, #50H  
8) ADD A, #255H  
9) MOV A, #255H 13) MOV R7, #00  
10) ADD R3, #50H  
11) ADD A, #F5H  
12) MOV A, @R3  
14) MOV R9, #50H  
15) ADD R7, R4  
16) PUSH 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  
b) MOV  
c) INC  
A, #55H  
R3, #3  
R2  
e) MOV  
f) MOV  
h) ADD  
A, R1  
R3, A  
A, R2  
d) ADD  
A, #0  
i) MOVX A, @DPTR  
2.27 Giá trị của cờ CY sau đoạn mã sau:  
a) CLR C  
CPL C  
b) MOV A, #54H  
ADD A, #0C4H  
c) MOV A, #00  
ADD A, #0FFH  
d) MOV A, #250  
ADD A, #05  
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.  
BT-VXL-Ch 3 – trang 3  
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ỉ 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  
42H  
Địa chỉ bộ nhớ nội  
Nội dung  
25H  
A
22H  
23H  
24H  
25H  
26H  
27H  
B
R0 (bank 0)  
R1 (bank 0)  
SP  
5AH  
15H  
09H  
22H  
F5H  
17H  
5CH  
8AH  
06H  
PC  
B100H  
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  
42H  
5AH  
33H  
2FH  
8100H  
Địa chỉ bộ nhớ nội  
Nội dung  
25H  
A
2FH  
30H  
31H  
32H  
33H  
B
R0 (bank 0)  
SP  
F5H  
17H  
05H  
06H  
PC  
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?  
PUSH ACC  
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 4  
Đ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  
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  
0AH  
09H  
08H  
07H  
9AH  
78H  
56H  
34H  
12H  
SP  
PC  
A
0BH  
0200H  
55H  
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 PSW  
LOOP: MOV A, @R0  
BT-VXL-Ch 3 – trang 5  
MOV @R1, A  
INC  
INC  
R0  
R1  
DJNZ B, LOOP  
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.  
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  
MOV  
MOV  
R0, #20H  
R1, #30H  
R2, #2  
; ###  
CLR  
C
NEXT: MOV  
ADDC  
A, @R0  
A, @R1  
BT-VXL-Ch 3 – trang 6  
MOV  
INC  
@R0, A  
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?  
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 EXIT  
TABLE:  
EXIT: END  
DB  
10H, 11H, 12H, 13H, 14H  
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?  
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  
BT-VXL-Ch 3 – trang 7  
DJNZ R1, DLY2  
RET  
2.53 Cho đoạn mã sau:  
RTN: PUSH B  
LP: MOV B, @R0  
CJNE A, B, NEXT  
MOV R1, #01H  
SJMP FIN  
NEXT: INC  
R0  
DJNZ R1, LP  
MOV R1, #0H  
FIN: POP  
RET  
B
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  
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  
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  
BT-VXL-Ch 3 – trang 8  
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:  
LOOP2:  
MOV  
DJNZ  
MOV  
CPL  
A, #47  
A, LOOP2  
P1.0, C  
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ụ: (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, 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).  
BT-VXL-Ch 3 – trang 9  
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  
PUSH 2  
PUSH 5  
PUSH 1  
POP  
POP  
POP  
2
1
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)’  
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.  
BT-VXL-Ch 3 – trang 10  
Hình E.2.81  
BT-VXL-Ch 3 – trang 11  
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  
b) MOV  
8EH  
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:  
HERE:  
MOV R3,#250  
NOP  
NOP  
NOP  
NOP  
DJNZ R3,HERE  
RET  
;
;
;
;
;
;
;
1 MC (1 chu kỳ máy)  
1 MC  
1 MC  
1 MC  
1 MC  
2 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 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à làm sáng đèn  
ở P1.7 khi người thứ 10 000 đi vào khu vực hội chợ (xem hình E.3.12).  
BT-VXL-Ch 3 – trang 12  
Hình E.3.12  
3.13 Chuẩn điều hưởng (hay còn gọi là cộng hưởng) quốc tế cho các thiết bị âm nhạc là “A trên D trung”  
(La trên Đô trung) ở tần số 440 Hz. Viết chương trình 8051 để tạo ra tần số điều hưởng này và phát  
ra tone 440 Hz ở loa nối ở P1.1 (xem hình E.3.13). Do việc làm tròn các giá trị đặt ở TL1/TH1, có 1  
sai số nhỏ trong tần số ra. Tần số ra chính xác là bao nhiêu và phần trăm sai số là bao nhiêu? Muốn  
có được chính xác 440 Hz với chương trình bạn đã viết thì giá trị của thạch anh là bao nhiêu?  
Hình E.3.13  
3.14 Viết chương trình 8051 để tạo ra tin hiệu 500 Hz ở P1.0 dùng timer 0. Dạng sóng có chu kỳ nhiệm vụ  
30%.  
3.15 Mạch ở hình E.3.15 sẽ cung cấp tín hiệu rất chính xác 60 Hz (với điều kiện áp AC này có tần số ổn  
định) vào T0 bằng cách lấy từ thứ cấp của một biến áp. Khởi động Timer 0 sao cho nó lấy xung nhịp  
từ T0 và tràn 1 lần/giây. Ở mỗi lần tràn, cập nhật giá trị thời gian trong ngày được chứa trong bộ nhớ  
nội của 8051 ở các vị trí 50H (giờ), 51H (phút), và 52H (giây).  
Hình E.3.15  
Phần 4 – Cổng nối tiếp (Serial Port)  
4.1 Hãy tìm giá trị của TH1 (dạng thập phân và hex) để đặt tốc độ baud cho các trường hợp sau nếu  
SMOD=1: a) 9600 baud; b) 4800 baud. Giả sử rằng XTAL=11.0592 MHz  
4.2 Tìm tốc độ baud nếu TH1=–2, SMOD = 1 và XTAL =11.0592MHz.  
4.3 Giả sử rằng cổng nối tiếp 8051 được nối vào cổng COM của máy vi tính, và ở PC ta sử dụng chương  
trình terminal.exe để gửi và nhận dữ liệu nối tiếp. P1 và P2 của 8051 được nối vào các LED và các  
công tắc tương ứng. Viết chương trình 8051 để: a) gửi đến máy vi tính thông điệp “We Are Ready!”;  
b) nhận bất cứ dữ liệu nào được gửi từ máy vi tính và xuất nó ra các LED đang gắn ở P1; và c) lấy dữ  
BT-VXL-Ch 3 – trang 13  
liệu trên các công tắc nối vào P2 và gửi nối tiếp dữ liệu đó đến máy vi tính. Chương trình thực a) một  
lần, nhưng các phần b) và c) liên tục. Sử dụng tốc độ baud là 4800.  
4.4 Giả sử XTAL=11.0592 MHz với chương trình sau, hãy cho biết: a) chương trình này làm gì, b) tính  
tần số được sử dụng bởi timer1 để đặ tốc độ baud, và c) tìm tốc độ baud của việc chuyển dữ liệu.  
MOV A, PCON  
SETB ACC.7  
MOV PCON, A  
MOV TMOD, #20H  
MOV TH1, -3  
MOV SCON, #50H  
SETB TR1  
MOV A, # “B”  
LOOP: CLR TI  
MOV SBUF, A  
JNB  
TI, $  
SJMP LOOP  
4.5 Sử dụng cổng nối tiếp làm cổng hiển thị: Cho mạch ở hình E.4.5  
Hình E.4.5 Mạch nối bên ngoài với cổng nối tiếp 8051.  
Với lệnh:  
MOV SBUF,  
A
Dữ liệu nhị phân từ ACC sẽ được truyền ra bên ngoài bắt đầu từ bit thấp nhất qua chân  
RXD của cổng nối tiếp sau khi thực thi lệnh trên. Khi kết thúc truyền bit SCON.1 sẽ tự động  
được đặt lên 1. IC 74LS164 trong hình là thanh ghi dịch 8 bit vào nối tiếp ra song song (SIPO).  
Dữ liệu nhị phân 8 bit vào nối tiếp sẽ được xuất ra song song. Các IC 74LS164 mắc kế tiếp nhau  
để giá trị ban đầu được hiện trên hiển thị sẽ dịch từ phải sang trái khi có thêm giá trị mới.  
LED 7 đoạn là loại anode chung, do đó khi đưa mức thấp vào có thể làm sáng các đoạn  
này (thí dụ: đoạn a sẽ sáng khi Q1 của 74LS164 là 0). Theo nguyên tắc này ta có thể cho hiện 1  
ký tự trên hiển thị nếu các ngõ ra tương ứng của 74LS164 ở mức thấp. Thí dụ để hiện được ký tự  
“2” thì cần làm sáng các đoạn a, b, g, e và d, vì vậy các ngõ ra tương ứng Q7, Q6, Q3, Q1 và Q0  
phải được đặt ở mức thấp và các ngõ ra Q5, Q4 và Q2 giữ ở mức cao. Do đó ta cần gửi byte 34H  
ra bộ đệm dữ liệu nối tiếp. Dữ liệu 34H được gọi là mã ký tự của ký tự “2”. Bảng mã ký tự cho  
các ký tự từ “0” đến “F” như sau:  
Ký tự  
D7 D6 D5 D4 D3 D2 D1 D0  
Mã ký tự  
BT-VXL-Ch 3 – trang 14  
b g c dp e f  
a
d
0
1
2
3
4
5
6
7
0 1 0 1 0 0 0 0  
0 1 0 1 1 1 1 1  
0 0 1 1 0 1 0 0  
0 0 0 1 1 1 0 0  
0 0 0 1 1 0 1 1  
1 0 0 1 1 0 0 0  
1 0 0 1 0 0 0 0  
0 1 0 1 1 1 0 1  
0 0 0 1 0 0 0 0  
0 0 0 1 1 0 0 1  
0 0 0 1 0 0 0 1  
1 0 0 1 0 0 1 0  
1 1 1 1 0 0 0 0  
0 0 0 1 0 1 1 0  
1 0 1 1 0 0 0 0  
1 0 1 1 0 0 0 1  
50H  
5FH  
34H  
1CH  
1BH  
98H  
90H  
5DH  
10H  
19H  
11H  
92H  
F0H  
16H  
B0H  
B1H  
8
9
A
B
C
D
E
F
Chú ý:  
o để làm cho tất cả các đoạn sáng ta ấn nút SW  
o để làm cho tất cả các đoạn tắt ta dùng lệnh MOV SBUF, #FF  
Hãy viết các lệnh để:  
a) Hiển thị các ký tự “0”, “1”, “2”, “3”, và “4” từ phải sang trái. Có nhận xét gì về kết quả  
hiển thị?  
b) Hiển thị ký tự “A” trên bảng hiển thị?  
Các vấn đề sau (4.6 đến 4.14) là các chương trình tiêu biểu để giao tiếp với các thiết bị đầu  
cuối (terminal) hoặc các thiết bị nối tiếp khác với máy vi tính. Giả sử cổng nối tiếp được khởi  
động ở mode UART 8 bit và tốc độ baud được cung cấp bởi Timer 1.  
4.6 Viết chương trình con OUTSTR gửi 1 chuỗi ký tự ASCII kết thúc bởi ký tự NULL đến thiết  
bị nối tiếp nối với cổng nối tiếp của 8051 . Giả sữ chuỗi mã ASCII ở trong bộ nhớ mã bên  
ngoài và chương trình gọi đặt địa chỉ của chuỗi trong DPTR trước khi gọi OUTSTR. Chuỗi  
ký tự kết thúc bằng NULL là chuỗi byte ASCII kết thúc với byte 00H.  
4.7 Viết chương trình con INLINE nhập 1 dòng các mã ASCII từ thiết bị nối với cổng nối toếp  
của 8051 và đặt nó vào bộ nhớ dữ liệu nội bắt đầu ở 50H. Giả sử dòng kết thúc bằng CR  
(carriage return). Đặt mã CR vào trong bộ đệm dòng cùng với các mã khác và rồi kết thúc bộ  
đệm bằng byte NULL (00H).  
4.8 Viết chương trình gửi liên tục bộ mẫu tự từ a tới z đến thiết bị gắn vào cổng nối tiếp, dùng  
chương trình con OUTCHR (có sẵn ) .  
4.9 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình gửi liên tục bộ ASCII  
hiển thị được (các mã từ 20H đến 7EH) đến thiết bị đang gắn vào cổng nối tiếp của 8051.  
4.10 Sửa đổi lại lời giải của bài tập trên để treo và cho xuất tiếp lại ra màn hình dùng các mã  
XOFF và XON nhận được từ bàn phím. Tất cả các mã khác bị bỏ qua (chú ý: XOFF =  
CONTROL-S = 13H và XON=CONTROL-Q=11H).  
4.11 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập  
các ký tự từ bàn phím và và hiển thị chúng lại trên màn hình, đổi những ký tự chữ in thường  
sang chữ in hoa.  
4.12 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập  
các ký tự từ thiết bị đang gắn ở cổng nối tiếp 8051 và hiển thị chúng lại với dấu chấm (“.”) sẽ  
thay thế cho các ký tự điều khiển (có các mã ASCII 00H đến 1FH, và 7FH).  
4.13 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình xóa màn hình VDT  
đang gắn ở cổng nối tiếp 8051 và rồi gửi tên của bạn đến VDT 10 lần trên 10 dòng. Chức  
BT-VXL-Ch 3 – trang 15  
năng xóa VDT được thực hiện bằng cách truyền CONTROL-Z với nhiều terminal hoặc  
chuỗi ký tự thoát <ESC>[2J trên terminal có hỗ trợ ANSI (American National Standards  
Institute). Sử dụng cả 2 phương pháp trong bài giải.  
4.14 Hình 3.32 trong sách minh họa kỹ thuật mở rộng khả năng xuất của 8051. Giả sử với cấu  
hình như vậy, hãy viết chương trình khởi động cổng nối tiếp với chế độ thanh ghi dịch và rồi  
ánh xạ nội dung của ô nhớ nội 20H ra 8 ngõ ra phụ, mỗi giây thực hiện 10 lần.  
Phần 5 – Ngắt (Interrupt)  
5.1 Cho biết nhiệm vụ của bit SMOD trong 8051? Hãy nêu các bước để thiết lập Timer dùng  
ngắt để trì hoãn (làm trễ) một khoảng thời gian nhất định?  
5.2 Hãy viết các lệnh để: a) cho phép ngắt nối tiếp, ngắt timer 0 và ngắt phần cứng bên ngoài 1;  
và b) cấm ngắt timer 0; và c) cấm tất cả các ngắt chỉ bằng 1 lệnh.  
5.3 Sau khi thực thi đoạn chương trình sau:  
MOV IE, #99H  
MOV IP, #10H  
a) Các ngắt nào được cho phép?  
b) Ngắt nào có ưu tiên cao nhất?  
5.4 Thứ tự phục vụ các ngắt nhứ thế nào nếu tất cả các ngắt được cho phép xảy ra đồng thời?  
5.5 Trong 1 hệ dùng 8051 cho phép các ngắt /INT0, /INT1 và Timer 1 và cấm tất cả các ngắt  
khác. Nếu ngắt /INT1 tích cực thì sẽ tạo ra sóng vuông 500 Hz ở chân P1.0 (dùng ngắt Timer  
1). Sóng vuông này sẽ chấm dứt khi /INT0 tích cực. Viết đoạn chương trình khởi tạo trị cho  
các ngắt và đợi ngắt trong chương trình chính và các chương trình ISR.  
5.6 Viết chương trình lấy liên tục dữ liệu 8 bit từ P0 và gửi nó đến P1 trong khi đó đồng thời tạo  
ra sóng vuông có chu kỳ 200 µs ở chân P2.1 (sử dụng Timer 0 để tạo sóng vuông)  
5.7 Giả sử chân /INT1 được nối vào công tắc bình thường ở mức cao, khi chân này xuống mức  
thấp thì nó sẽ làm sáng đèn LED. Đèn LED này được nối vào chân P1.3 và bình thường thì  
tắt, khi có mức thấp ở /INT1 thì nó sẽ sáng trong khi /INT1 vẫn ở mức thấp.  
5.8 Giả sử chân /INT1 được nối vào bộ tạo xung, viết chương trình nhận biết khi có cạnh xuống  
của xung thì sẽ đặt bit P1.3 lên 1 và làm cho đèn LED gắn ở P1.3 sáng (vẽ mạch cứng).  
Nghĩa là LED sẽ sáng (ON) và tắt (OFF) cùng với tốc độ của xung đưa vào chân /INT1.  
5.9 Viết chương trình 8051 lấy dữ liệu từ P1 và gửi nó đến P2 liên tục, trong khi đó dữ liệu đến  
từ cổng nối tiếp được gửi đến P0. Giả sử tốc độ baud là 9600.  
5.10 Tạo sóng vuông 1 kHz ở chân P1.7 dùng ngắt.  
5.11 Tạo xung vuông 7 kHz với chu kỳ nhiệm vụ 30% chân P1.6 dùng ngắt.  
5.12 a) Viết chương trình phục vụ ngắt cho timer 0 để 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.  
5.13 Hãy ghép chương trình “tạo sóng vuông bằng ngắt của timer” (trang 218) với chương trình  
“Xuất ký tự bằng ngắt” (trang 221) thành 1 chương trình.  
5.14 Hãy viết lại chương trình “Xuất ký tự bằng ngắt” (trang 221) sao cho gửi 1 ký tự/1 giây  
(hướng dẫn: sử dụng timer và xuất ký tự trong ISR của timer).  
Phần 6 – Assembler  
6.1 Hãy viết lại các lệnh sau với dạng dữ liệu tức thời là nhị phân:  
a) MOV  
b) MOV  
A, #255  
A, #11Q  
c) MOV  
d) MOV  
A, #1AH  
A, #’A’  
6.2 Có gì sai trong lệnh sau: ORL 80H, #F0H  
6.3 Hãy tìm các ký hiệu nào bị đặt tên sai:  
?byte.bit  
@GOOD_bye  
1ST_FLAG  
MY_PROGRAM  
6.4 Hãy viết các lệnh tương đương các lệnh sau với dữ liệu tức thời là trị số hex:  
a) MOV DPTR, # ‘0’ EQ 48  
b) MOV DPTR, # –1  
c) MOV  
d) MOV  
DPTR, #HIGH ‘AB’  
DPTR, #NOT (275 MOD 256)  
BT-VXL-Ch 3 – trang 16  
6.5 Sự khác biệt giữa DB và DW?  
6.6 Hãy ghi các giá trị ô nhớ của đoạn sau:  
ORG 0FH  
DW 5 SHL 4  
DB  
65535  
DW ‘0’  
6.7 Viết định nghĩa 1 macro dùng để điền 1 hằng số dữ liệu vào 1khối trong bộ nhớ dữ liệu  
ngoài. Truyền địa chỉ bắt đầu, chiều dài, và hằng số dữ liệu cho các tham số macro.  
6.8 Viết định nghĩa cho các macro sau:  
JGE – nhảy đến LABEL nếu thanh ghi tích lũy có trị >= VALUE  
JLT – nhảy đến LABEL nếu thanh ghi tích lũy có trị < VALUE  
JLE – nhảy đến LABEL nếu thanh ghi tích lũy có trị <= VALUE  
JOR – nhảy đến LABEL nếu thanh ghi tích lũy có trị ngoài tầm của đoạn từ LOWER đến  
UPPER.  
6.9 Viết định nghĩa 1 macro có tên là CJNE_DPTR mà sẽ nhảy đến nhãn LABEL nếu con trỏ dữ  
liệu không chứa giá trị VALUE. Định nghĩa macro sao cho nội dung của tất cả các thanh ghi  
và các ô nhớ không bị ảnh hưởng.  
BT-VXL-Ch 3 – trang 17  
pdf 17 trang myanh 22160 Free
Bạn đang xem tài liệu "Bài tập Chương 3 môn Vi xử lý - Hồ Trung Mỹ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_tap_chuong_3_mon_vi_xu_ly_ho_trung_my.pdf