VXL_Đáp án của đề Thi HK_AY1112-S2_trang 1/8 
ĐHQG TPHCM–ĐH Bách Khoa 
Khoa Đ-ĐT–BM Điện Tử 
 
Điểm
 Đáp án của Đề thi HK 2 – NH:2011-2012 
Môn:
 Vi xử lý – Mã MH:402030 
Ngày thi:
 22/06/2012 – Thời gian làm bài: 110 phút 
Đề có 6 trang và SV làm trực tiếp trên đề. 
Tổng số câu là 9, tổng số điểm là 11, và SV chỉ cần làm đạt 10. 
(SV được sử dụng tài liệu của mình, 
SV KHÔNG được dùng PC, Laptop, iPad và PC Tablet) 
Chữ ký giám thị
 
Họ và tên SV: __________________________ MSSV: ____________ Nhóm: ______ 
Bộ môn Điện Tử duyệt GV ra đề 
 
 
 
 
 
Hồ Trung Mỹ 
 
Câu 1:
 (1 đ) 
Cho trước mạch giải mã địa chỉ của hệ thống dùng VXL 8051: 
 
a) Xác định vùng địa chỉ của các SRAM: (0.75 đ) 
 Vùng địa chỉ của SRAM thứ nhất (U1): 0800H–0FFFH 
 Vùng địa chỉ của SRAM thứ hai (U2): 3000H–37FFH 
b) Viết các lệnh 8051 để chép 1 byte từ địa chỉ đầu của SRAM thứ nhất vào byte có địa chỉ cuối của 
SRAM thứ hai (0.25đ): 
MOV DPTR,#0800H 
MOVX A,@DPTR 
MOV DPTR,#37FFH 
MOVX @DPTR, A   
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 2/8 
Câu 2:
 (1.5 đ) 
Điền vào các chỗ trống trong cột địa chỉ ROM chương trình, cột mã máy và cột các cách địa chỉ: 
Địa chỉ 
ROM (hex) 
Mã máy (hex) Lệnh 8051 
Cách định địa chỉ của toán hạng 
thứ nhất thứ hai  
 ORG 0  
0000 75 81 40 
 MOV SP, #40H 
T
r
ự
c
 ti
ế
p T
ứ
c th
ờ
i
0003 7D 80 
 MOV R5, #80H 
T
hanh ghi T
ứ
c th
ờ
i
0005 12 00 0A 
 LCALL DELAY 
D
ài 
0008 80 FE 
 SJMP $ 
T
ương đ
ố
i  
000A C0 05 
DELAY: PUSH 5  
000C 00 
AGAIN: NOP 
 000D DD FD 
 DJNZ R5,AGAIN  
000F D0 05 
 POP 5  
0011 22 
 RET    
 END   
Câu 3:
 (1.5 đ) 
a) (1 đ) Viết chương trình con hợp ngữ 8051 có tên là SS4bit để so sánh 4 bit cao và 4 bit thấp của 
thanh ghi A, sau khi gọi chương trình con này thì nội dung của thanh ghi A vẫn nhu cũ. Kết quả so sánh 
tác động đến R7 theo quy ước sau: 
 4 bit cao của A < 4 bit thấp của A thì R7 = 01H 
 4 bit cao của A = 4 bit thấp của A thì R7 = 02H 
 4 bit cao của A > 4 bit thấp của A thì R7 = 04H 
b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051 đọc liên tục giá trị ở cổ
ng P0 và dùng chương trình con 
SS4bit để so sánh 4 bit cao và 4 bit thấp của P0 rồi xuất kết quả ra cổng P1. Đầu đoạn chương trình 
này ta phải gán trị SP để cho stack có thể cất dữ liệu vào stack từ địa chỉ 30H. 
Bài giải. 
a)SS4bit:  
b)
PUSH ACC AGTB: ORG 0 
MOV R1,A MOV
R
7, #4 MOV SP,#2FH
ANL A,#0FH 
S
JMP 
D
ONE MOV P0,#0FFH
MOV B,A ALTB:
L
OOP:
MOV A,R1 MOV
R
7, #1 MOV A,P0 
SWAP A DONE: ACALL SS4bit
ANL A,#0FH 
P
OP ACC MOV P1,R7
CJNE A,B, ANEB 
R
ET SJMP LOOP 
AEQ: 
MOV R7, #2 
SJMP DONE 
ANEB: 
JC ALTB   
Câu 4: (1.5 đ) 
Viết chương trình con hợp ngữ 8051 có tên là Menu_R0 thực hiện các phép tính sau theo nội dung của 
thanh ghi R0 (nếu không thuộc bảng sau, nghĩa là R0 > 3 thì R2 = 0) 
R0 Phép toán Chú thích (R1 là số không dấu có giá trị nhỏ hơn 64) 
0 R2 = R1 * 4 SV không đ
ư
ợ
c
 dùng l
ệ
n
h MUL mà ph
ả
i
 áp dụng d
ị
c
h bit
1 R2 = R1 / 4 SV không đ
ư
ợ
c
 dùng l
ệ
n
h DIV mà ph
ả
i
 áp dụng d
ị
c
h bit
2 R2 = bù 2 của R1 
3 R2 = swap của R1 R2 có tr
ị
l
à hoán đ
ổ
i
 4 bit th
ấ
p và 4 bit cao c
ủ
a
 R1
Bài giải. (Coi thêm phần phụ lục với cách khác) 
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 3/8 
Menu
_
R0: CASE0:
C
ASE2: 
MOV DTPR,#JMP
_
TABLE MOV A,R1 MOV A,R1 
MOV A,R0 
R
L A CPL A 
CJNE A,#4,NEXT 
R
L A INC A 
NEXT: MOV R2,A MOV R2,A 
JC CONT 
R
ET RET 
MOV R2,#0 
RET CASE1:
C
ASE3: 
CONT: MOV A,R1 MOV A,R1 
RL A 
C
LR ACC.0 SWAP A 
JMP @A+DPTR 
R
R A MOV R2,A 
JMP
_
TABLE: 
C
LR ACC.0 RET 
AJMP CASE0 
R
R A
AJMP CASE1 MOV R2,A
AJMP CASE2 
R
ET
AJMP CASE3  
 Câu 5:
 (1 đ) Phân tích đoạn chương trình hợp ngữ 8051H sau bằng cách ghi các giá trị hex vào các chỗ 
trống. Giả sử trước khi thực thi chương trình này, nội dung của 1 số ô nhớ trong RAM nội: 
(30H) = 46H, (31H) = 75H, (40H) = 57H, (41H) = 89H 
Lệnh 8051 
L
ầ
n
 l
ặ
p 1 Lần lặp 2
MOV R0,#30H 
MOV R1,#40H 
MOV R2,#2 
CLR C 
LOOP: MOV A,@R0 A = 
4
6
H
 A = 75H 
ADDC A,@R1 A = 
9
D
H
 A = FFH 
DA A A = 
0
3
H
v
à c
ờ
C
 = 
1
 A = 65H và c
ờ
C
 = 
1
MOV @R0,A 
INC R0 
INC R1 
DJNZ R2, LOOP 
CLR A 
ADDC A,#0 
MOV @R0,A 
SJMP $ 
Sau khi thực thi đoạn chương trình trên thì nội dung của các ô nhớ sau có trị số mới là: 
(32H) = 01H (31H) = 65H (30H) = 03H 
Ý nghĩa của đoạn chương trình trên là: (0.5 đ) 
 Tính tổng 2 số BCD nén với 2K ký số với R0 là con trỏ chỉ đến byte 
thấp của toán hạng 1, R1 là con trỏ chỉ đến byte thấp của toán hạng 2, 
R2 chứa giá trị K, và kết quả cất lại vào vùng nhớ toán hạng 1. 
Câu 6:
 (1.5 đ) Cho trước mạch sau với các chân ra 1Y1 nối với đoạn a,1Y2 nối với đoạn b, ,2Y3 nối với 
đoạn g của LED 7 đoạn (CC) với các điện trở hạn dòng là 330. Biết 8051 hoạt động với XTAL=12MHz  
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 4/8 
a) (1 đ) Viết chương trình con 
DELAY_500MS làm trễ 500 ms dùng Timer 0 (không dùng ngắt timer) và 
chương trình con 
BCD2LED7S hiển thị 1 ký số BCD trong thanh ghi A ra LED 7 đoạn. 
DELAY_500MS: BCD2LED7S:
;
 đ
ị
n
h nghĩa hiể
n
 th
ị
LAP EQU 10 
MOV DPTR,#LED7S
ORG 200H 
SD EQU 50000 
MOVC A,@A+DPTR
L
ED7S: ; -gfedcba
 MOV R7,#LAP 
MOV P1,A
DB 00111111B; 
0 
 MOV TMOD,#01H 
R
ET
D
B 0000011
0
B
;
1 
DL1:  
DB 01011011B; 
2 
 MOV TL0,#LOW(-SD)  
DB 01001111B; 
3 
 MOV TH0,#HIGH(-SD)  
DB 01100110B; 4 
 SETB TR0  
DB 01101101B; 5 
 JNB TF0, $  
D
B 0111110
1
B;
6
 CLR TF0  
DB 00000111B; 7 
 CLR TR0  
DB 01111111B; 8 
 DJNZ R7, DL1  
DB 01101111B; 9 
 RET  
; Chú ý 74LS244 là IC đệm 
; Chú ý các trị số khác ; 3 trạng thái, IC này 
; hợp lệ cho LAP và SD:  
; cung cấp đủ dùng để 
l
ái 
; LAP x SD = 500000  
; LED. TD: Khi P1.0 = 1 
; 20 x 25000 ; thì đoạn a sáng. 
; 50 x 10000   
; 200 x 2500   
; . . .    
b) (0.5 đ) Viết chương trình có dùng các chương trình con ở a) để mạch hoạt động như sau: 
 Khi có cạnh xuống ở P2.0 lần thứ 1 (3, 5,…) thì hiện lần lượt các số từ 0 đến 9 với thời gian hiện 1 
số là 500 ms và quay lại kiểm tra cạnh xuống ở P2.0. Khi hiển thị từ 0 đến 9 thì các cạnh xuống ở 
P2.0 sẽ không được kể đến! 
 Khi có cạnh xuống ở P2.0 lầ
n thứ 2 (4, 6,…) thì chỉ hiện số 0 trong 1s và quay lại kiểm tra P2.0. 
Chương trình: (Coi thêm phần phụ lục với cách khác) 
ORG 0 P20_EVEN
:
C
hú ý
: 
SETB P2.0 ; X
ử
l
ý khi s
ố
l
ầ
n
 c
ạ
n
h
P
h
ầ
n
 x
ử
 lý khi s
ố
l
ầ
n 
CLR C ; xu
ố
n
g 
ở
P
2.0 là ch
ẵ
n
c
ạ
n
h
x
uống ở P2.0 là 
l
ẻ
LOOP: MOV A,#0
C
ó th
ể
 viết cách khác:
JNB P2.0, $ ACALL BCD2LED7S MOV R0,#0 
JB P2.0, $ ACALL DELAY_500MS
L
1:
; Có cạnh xuống tại P2.0 ACALL DELAY_500MS MOV A, R0 
CPL C 
S
JMP LOOP ACALL BCD2LED7S
JNC P20_EVEN ACALL DELAY_500MS
; X
ử
 lý khi số lần cạnh INC R0 
; xuống ở P2.0 là lẻ CJNE R0,#10, L1
MOV R0,#0 SJMP LOOP
MOV R1,#10 
L1: 
MOV A, R0 
ACALL BCD2LED7S 
ACALL DELAY_500MS 
INC R0 
DJNZ R1, L1 
SJMP LOOP   
Câu 7:
 (1 đ) 
Xét 1 hệ thống gồm 2 vi xử lý 8051 M1 và M2 được kết nối theo kiểu modem rỗng (null modem) để truyền 
nối tiếp với nhau. M1 có nhiệm vụ đọc 1 chuỗi ký tự (kết thúc bằng ký tự rỗng (NULL) = 00H) từ ROM 
chương trình bắt đầu từ địa chỉ 200H và xuất nối tiếp đến M2, M2 có nhiệm vụ nhận nối tiếp chuỗi ký tự 
này và cất chuỗi vào RAM nội bắt đầu từ 
địa chỉ 30H. Cả 2 VXL đều sử dụng cổng nối tiếp có tốc độ baud 
là 4800 và XTAL = 11.0592 MHz. Chú ý ta không dùng ngắt nối tiếp mà chỉ hỏi vòng RI và TI. 
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 5/8 
Bài giải. (Coi thêm phần phụ lục với cách khác) 
Chương trình 8051 ở M1 Chương trình 8051 ở M2 CT con gửi/nhận1 byte nối tiếp 
ORG 0 
O
RG 0
S
P_TRANSMIT: 
; Khởi động Timer 1 để ; Kh
ở
i
 đ
ộ
n
g Timer 1 đ
ể
JNB TI, $ 
; có tốc độ baud 4800 ; có t
ố
c
 đ
ộ
ba
u
d 4800
CLR TI 
MOV TMOD,#20H MOV TMOD,#20H
MOV SBUF, A
MOV TH1,#–6 MOV TH1,#
–
6
RET 
SETB TR1 
S
ETB TR1
; Đặt cấu hình chỉ phát ; Đ
ặ
t
 c
ấ
u
 hình ch
ỉ
t
hu
C
hú ý: 
MOV SCON,#01000010B MOV 
S
C
ON,
#
01010000B
N
ế
u
 ban đầu cho TI=0
MOV DPTR,#0200H MOV R0,#30H 
t
hì CTC này là:
L1: L2:
MOV SBUF, A 
CLR A ACALL SP_RECEIVE
JNB TI, $
MOVC A,@A+DPTR MOV 
@
R0, A
CLR TI 
ACALL SP_TRANSMIT 
J
Z 
E
XIT_M2
RET 
JZ EXIT_M1 
I
NC R0
INC DPT
R 
S
JMP L2
S
P_RECEIVE: 
SJMP L1 EXIT_M2:
JNB RI, $
EXIT_M1: 
S
JMP $
CLR RI 
SJMP $ 
MOV A, SBUF 
RET                    
Câu 8:
 (1 đ) 
Viết chương trình hợp ngữ 8051 để tạo 1 số xung ở ngõ ra như sau: 
 Nếu có cạnh xuống ở chân ngắt ngoài 0 (/INT0) thì ngõ ra P1.0 sẽ có 5 xung dương (5 cạnh lên) 
 Nếu có cạnh xuống ở chân ngắt ngoài 1 (/INT1) thì ngõ ra P1.1 sẽ có 3 xung dương (3 cạnh lên) 
 Nếu không có cạnh xuống ở /INT0, /INT1 thì P1.0=0 và P1.1=0. 
Giả sử các xung kích cạnh xuống ở các ngõ INT0 và INT1 không bao giờ xảy ra đồng thời. Xung dương ở 
ngõ ra có được bằng lệnh SETB sau 
đó CLR. 
Bài giải. 
Chương trình chính Chương trình phục vụ ngắt INT0 Chương trình phục vụ ngắt INT1 
ORG 0 
EX0
_
ISR:
E
X1
_
ISR: 
LJMP MAIN MO
V 
R
1, #5 MO
V
 R1, #3
ORG 0003H L1:
L
2:
LJMP EX0
_
ISR 
S
ETB P1.0 SETB P1.1 
ORG 0013H 
C
LR P1.0 CLR P1.1 
LJMP EX1
_
ISR 
D
JNZ R1, L1 DJNZ R1, L2
MAIN: RETI RETI 
SETB P3.2  
SETB P3.3  
SETB IT0  
SETB IT1  
CLR P1.0  
CLR P1.1  
MOV IE,#85H  
SJMP $    
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 6/8 
Câu 9:
 (1 đ) 
Viết chương trình hợp ngữ hoặc C
 cho 8051 để tạo dạng sóng tuần hoàn sau ở cổng P1: 
 Giả sử cho trước chương trình con
 DELAY_1S (làm trễ 1 giây). 
Bài giải. (Coi thêm phần phụ lục với cách khác) 
Chương trình hợp ngữ Chương trình C (Keil C)   
ORG 0 
 MOV DPTR,#STATE_TBL 
 MOV R0,#0 
; R0 chỉ thị đang ở trạng thái mấy 
LOOP: 
 MOV A, R0 
 MOVC A,@A+DPTR 
 MOV P2,A 
ACALL DELAY_1S 
 INC R0 
 CJNE R0,#6,LOOP 
 MOV R0,#0 
 SJMP LOOP 
STATE_TBL: 
 DB 05H,06H,0AH,05H,0EH,02H 
 END 
#include <reg51.h> 
void delay_1s(); 
// cho trước CTC làm trễ 1 giây  
void main() 
{ 
char state[6]={0x05, 0x06, 0x0A, 
0x05, 0x0E, 0x02};  
char i;  
while(1) 
 { 
 for( i = 0; i < 6; i++) 
 { 
 P1 = state[i]; 
 delay_1s(); 
 } 
 } 
} 
Kết thúc bài thi HK 
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 7/8 
Phụ lục:
 Một số cách giải khác 
Câu 3: 
 Tối ưu mã cho chương trình con SS4bit 
a)SS4bit: 
PUSH ACC 
MOV B,#16 
DIV AB 
CJNE A,B, ANEB 
AEQ: MOV R7, #2 
SJMP DONE 
ANEB: JC ALTB 
AGTB: MOV R7, #4 
 SJMP DONE 
ALTB: MOV R7, #1 
DONE: POP ACC 
RET  
Câu 4:
 Dùng toàn CJNE 
Cách 2: 
Menu_R0: R0NE0:
R
0NE2: 
MOV A,R1 CJNE R0,#3,D
O
NE
CJNE R0,#4,NEXT 
C
JNE R0,#1,R0NE1
C
ASE3: 
NEXT: CASE1: SWAP A 
JC CONT 
C
LR ACC.0 MOV R2,A 
MOV R2,#0 
R
R A
D
ONE:
RET 
C
LR ACC.0 RET 
CONT: 
R
R A 
CJNE R0,#0,R0NE0 MOV R2,A 
CASE0: 
R
ET 
RL A R0NE1: 
RL A 
C
JNE R0,#2,R0NE2 
MOV R2,A CASE2:
RET 
C
PL A
; Đặt tên nhãn R0NEX 
I
NC A
; có nghĩa là R0  X 
MOV R2,A 
R
ET 
Cách 3: 
Menu_R0: 
; Đặt tên nhãn R0NEX R0NE1:
R
0NE3
:
 ; R0 > 3 
; có nghĩa là R0  X 
C
JNE R0,#2,R0NE2 MOV R2,#0 
MOV A,R1 CASE2: RET 
CJNE R0,#0,R0NE0 
C
PL A 
CASE0: 
I
NC A 
RL A MOV R2,A
RL A 
R
ET 
MOV R2,A 
RET 
R0NE0: R0NE2: 
CJNE R0,#1,R0NE1 
C
JNE R0,#3,
R
0NE3 
CASE1: CASE3:
CLR ACC.0 
S
WAP A
RR A MOV R2,A
CLR ACC.0 
R
ET
RR A 
MOV R2,A 
RET  
VXL_Đáp án của đề Thi HK_AY1112-S2_trang 8/8 
Câu 6:
 Một cách giải khác cho câu b) (không dùng cờ C để phân biệt chẳn lẽ) 
ORG 0 P20_ODD:
P
20_EVEN: 
SETB P2.0 ; X
ử
l
ý khi s
ố
l
ầ
n
 c
ạ
n
h
;
 X
ử
l
ý khi số l
ầ
n
 c
ạ
n
h
LOOP: ; xu
ố
n
g 
ở
P
2.0 là 
l
ẻ
;
 xu
ố
n
g ở P2.0 là ch
ẵ
n
JNB P2.0, $ MOV R0,#0 MOV A,#0 
JB P2.0, $ MOV R1,#10 ACALL BCD2LED7S
; Có cạnh xuống tại P2.0 L1: ACALL DELAY_500MS
ACALL P20_ODD MOV A, R0 ACALL DELAY_500MS
JNB P2.0, $ ACALL BCD2LED7S RET 
JB P2.0, $ ACALL DELAY_500MS 
; Có cạnh xuống tại P2.0 
I
NC R0 
ACALL P20_EVEN 
D
JNZ R1, L1 
SJMP LOOP 
R
ET  
Câu 7: 
1) Nhắc lại về thanh ghi SCON:  
 Với 8051 phát nối tiếp (M1) với chế độ 1 thì SCON được nạp 1 trong các giá trị sau xem như đúng: 
MOV SCON,#01000000B ; hoặc 40H (không cho thu nối tiếp)và TI=1 
MOV SCON,#01000010B ; hoặc 42H (không cho thu nối tiếp)và TI=1 
MOV SCON,#01010000B ; hoặc 50H (cho thu nối tiếp) và TI = 0 
MOV SCON,#01010010B ; hoặc 52H (cho thu nối tiếp) và TI = 0 
 Với 8051 thu nối tiếp (M2) với chế độ 1 thì SCON được nạp 1 trong các giá trị sau xem như đúng: 
MOV SCON,#01010000B ; hoặc 50H (cho thu nối tiếp)và TI = 0 
MOV SCON,#01010010B ; hoặc 52H (cho thu nối tiếp)và TI = 1 
2) Nếu đặt SMOD lên 1 thì có thể gán trị cho TH1 với trị –12 
MOV A,PCON 
SETB ACC.7 
MOV PCON,A 
MOV TH1,#–12  
Câu 9: 
LOOP: 
MOV P1,#05H 
 ACALL DELAY_1S 
MOV P1,#06H 
 ACALL DELAY_1S 
MOV P1,#0AH 
 ACALL DELAY_1S 
MOV P1,#05H 
 ACALL DELAY_1S 
MOV P1,#0EH 
 ACALL DELAY_1S 
MOV P1,#02H 
 ACALL DELAY_1S 
 SJMP LOOP 
Hoặc cách khác dùng lệnh SETB và CLR để thay đổi P1 (cách này viết dài)!