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
ứ
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 đ
ố
i000A C0 05
DELAY: PUSH 5
000C 00
AGAIN: NOP
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
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
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
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
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 ; . . .
ử
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
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,#
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 $
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
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,
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:
; 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
ạ
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
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)!