Tải bản đầy đủ (.pdf) (9 trang)

Đề thi vi xử lý có đáp án 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (335.15 KB, 9 trang )

VXL_Thi HK_AY1213-S2_trang 1/9
ĐHQG TPHCM–ĐH Bách Khoa
Khoa Đ-ĐT–BM Điện Tử

Điểm Đề thi HK 2 – NH:2012-2013
Môn:
Vi xử lý – Mã MH: 402030
Ngày thi:
29/05/2013 – Thời gian làm bài: 110 phút
Đề có 8 trang (có 2 trang tóm tắt) và SV làm trực tiếp trên đề.
Tổng số câu là 10, tổng số điểm là 11, và SV chỉ cần làm đạt 10.
(SV KHÔNG được dùng tài liệu
SV KHÔNG được dùng ĐTDĐ, 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ỹ
Chú ý: Xem phụ lục để biết các cách giải khác nếu có.
Câu 1: (1 đ) Cho trước mạch giải mã địa chỉ của hệ thống dùng VXL 8051:

a) (0.5 đ) Xác định vùng địa chỉ của các SRAM:
 Vùng địa chỉ của SRAM thứ nhất (U1): 5800H – 5FFFH
 Vùng địa chỉ của SRAM thứ hai (U2): 7000H – 77FFH

b) (0.5đ) Viết các lệnh 8051 để chép 10 byte bắt đầu từ địa chỉ đầu của SRAM thứ nhất (U1) vào RAM
nội của 8051 bắt đầu từ địa chỉ 30H:


MOV DPTR,#5800H
MOV R0,#30H
MOV R1.#10
Loop:
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R1,Loop
SJMP $
Cách 2: dùng CJNE
MOV DPTR,#5800H
MOV R0,#30H
Loop:
MOVX A,@DPTR
MOV @R0,A
INC R0
INC DPTR
CJNE R0,#3AH,Loop
SJMP $
VXL_Thi HK_AY1213-S2_trang 2/9
Câu 2: (1.5 đ) Điền vào các chỗ trống trong các cột địa chỉ ROM chương trình, mã máy và 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 D2 80 SETB P0.0

0002 75 90 FF MOV
P
1,#0FFH
Trực tiếp (byte) Tức thời
0005 E5 90 LL: MOV A,P1

0007 60 04
J
Z Nxt

0009 30 80 01
J
NB P0.0,Nxt
Trực tiếp (bit) Tương đối
000C F4 CPL A

000D F5 A0 Nxt: MOV P2,A

000F 80 F4 SJMP LL

0011 END

Câu 3: (1 đ)
a) (0.5 đ) Viết chương trình con hợp ngữ 8051 có tên là MAX_XY để thực hiện hàm max(X,Y) (nếu X  Y
thì kết quả X; nếu ngược lại, kết quả là Y) với X và Y là các số nguyên 8 bit không dấu, X là thanh ghi A,
Y là số trong RAM nội có địa chỉ trong thanh ghi R0 và kết quả đặt trở lại vào A. Nếu chương trình con
này có dùng các thanh ghi khác A và R0 thì phải bảo lưu giá trị của nó sau khi ra khỏi chương trình con.
b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051

dùng chương trình con MAX_XY để tìm cực đại của 16 số
nguyên 8 bit không dấu ở trong RAM nội có địa chỉ đầu là 30H và kết quả được cất vào ô nhớ ở RAM
nội có địa chỉ 40H. Đầ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ỉ 60H.
Bài giải.
a) b)
Cách 2
: dùng CJNE
MAX
_
XY: MOV SP,#5FH MOV SP,#5FH
PUSH B MOV R0,#30H MOV R0,#30H
MOV B,@R0 MOV R1,#16 MOV A,@R0
CJNE A,B,Nxt MOV A,@R0
L
oop:
Nxt: JC LT Loop: ACALL MAX
_
XY
SJMP Fin ACALL MAX
_
XY INC R0
LT: MOV A,B INC R0 CJNE R0,#40H,Loop
Fin: POP B DJNZ R1,Loop MOV @R0,A
RET MOV @R0,A SJMP $

S
JMP $
Câu 4: (1 đ) Xét 1 mạch 8051 với các công tắc: SW1 được nối với P1.0, SW2 được nối với P1.1. SW3
được nối với P1.2, SW4 được nối với P1.3 và P1.7 được nối với điện trở 300 nối tiếp LED nối lên +5V.

Hãy viết chương trình hợp ngữ cho mạch này. Qui luật hoạt động của mạch như sau:
P1.1 P1.0 Phép toán P1.1 P1.0 Phép toán Chú thích
0 0 F = NOT(X) 1 0 F = X OR Y F = P1.7
X = P1.2 và Y = P1.3
0 1 F = X AND Y 1 1 F = X XOR Y
Bài giải.
ORG 0 MOV C,X SJMP Fin
TT EQU 20H
C
JNE A,#0,CP1
E
Q3: JNB Y, Fin
X EQU TT.2 CPL C CPL C
Y EQU TT.3
S
JMP Fin
F
in: MOV F,C
F EQU P1.7 CP1: CJNE A,#1,CP2 SJMP Loop
MOV P1,#0FH ANL C,Y END
Loop: MOV A,P1
S
JMP Fin
MOV TT,A CP2: CJNE A,#2,EQ3
ANL A,#03H
O
RL C,
Y

VXL_Thi HK_AY1213-S2_trang 3/9

Câu 5: (1 đ) 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) = 85H, (32H) = 97H
Lệnh 8051 Lần lặp 1 Lần lặp 2 Lần lặp 3
MOV R0,#30H

MOV R1,#3
MOV R2,#0
Loop:
MO
V
A,@R0 A
=

4
6
H
A
=

8
5
H
A =
9
7
H
JNB ACC.7,Next
INC R2
R
2 =

0
0
H

R
2 =
0
1
H
R2 =
0
2
H

Next:
INC R0
R
0 =
3
1
H

R
0 =
3
2
H
R0 =
3
3

H
DJNZ R1,Loop
MOV @R0,2
SJMP $
a) (0.5 đ) Hãy điền vào các giá trị của A, R2, và R0 cứ sau thực thi lệnh cùng hàng trong bàng trên.
Khi thực thi đến lệnh “SJMP $” thì nội dung của ô nhớ sau có trị số là: (33H) = 02H
b) (0.5 đ) Ý nghĩa của đoạn chương trình trên là:
Đếm các số âm trong N số đầu tiên (N trong R1) của mảng có địa chỉ
đầu trong RO và cất kết quả vào phần tử N+1

Câu 6: (1 đ) Cho trước mạch sau với ngõ ra P0 của 8051 lái LED 7 đoạn loại CA:


Mạch này hoạt động như sau:
P1.0 = Count = khi có cạnh xuống thì giá trị hiển thị của LED được tăng thêm 1.
Chuỗi số hiển thị ở LED 7 đoạn tương tự như bộ đếm lên khi có các cạnh xuống liên tục ở P1.0:
0, 1, 2, 3, . . . , 9, 0, 1, 2, . . .
a) (0.5 đ) Viết chương trình con
BCD2LED7S hiển thị 1 ký số BCD trong thanh ghi A ra LED 7 đoạn. Nội
dung của thanh ghi A không bị thay đổi sau khi gọi chương trình con này.
b) (0.5 đ) Viết chương trình làm việc theo yêu cầu trên dùng thanh ghi A chứa số đếm và dùng chương trình
con
BCD2LED7S để hiển thị.
Bài giải.
a) ; đ

n
h ngh
ĩ
a hi


n
th

b)
BCD2LED7S:
O
RG 1
0
0H
C
ount EQU P1.0
PUSH ACC
LED7S: ; hgfedcba MOV P1,#01H
MOV DPTR,#LED7S
DB 11000000B;
0
CLR A
MOVC A,@A+DPTR
DB 11111001B;
1
Loop:
MOV P0,A
DB 10100100B;
2
ACALL BCD2LED7S
POP ACC
DB 10110000B;
3
JNB Count,$; đợi =1

RET
DB 10011001B;
4
JB Count,$; đợi =0

DB 10010010B; 5 INC A

DB 10000010B; 6 CJNE A,#10,Loop

DB 11111000B; 7 CLR A

DB 10000000B; 8 SJMP Loop

DB 10010000B; 9
VXL_Thi HK_AY1213-S2_trang 4/9
Câu 7: (1.5 đ) Xét 8051 với XTAL = 12 MHz và cho trước chương trình con Delay sau:
Chương trình con Delay Số MC
Delay: MOV R1,#250 1
L1: MOV R0,#250 1
L2: NOP 1
NOP 1
DJNZ R0, L2 2
DJNZ R1, L1 2
R
ET 2
a) (0.5 đ) Hãy ghi số chu kỳ máy (MC) cho mỗi lệnh trong bảng trên và từ đó suy ra thời gian trễ của
chương trình con này. Nếu muốn làm trễ 150 ms thì ta phải nạp cho R1 giá trị là bao nhiêu?
b) (0.5 đ) Hãy viết lại chương trình con làm trễ 150 ms dùng Timer 0 (không dùng ngắt Timer).
c) (0.5 đ) Hãy viết lại chương trình con làm trễ 150 ms dùng ngắt Timer 0.
Bài giải.

a) 1 MC = 12/(12MHz) = 1 s
Thời gian trễ T được tính như sau:
T = 1 + (1 + (1 + 1 + 2) x 250 + 2) x 250 + 2 MC = 250753 s  250 ms
Để c
ó T = 150 ms thì phải nạp giá trị cho R1 là 150.
b) CT con làm trễ 150 ms hỏi vòng cờ TF0: c) CT con làm trễ 150 ms dùng ngắt Timer 0:
Delay
_
150ms:
D
elay
_
150ms:
MOV TMOD,#1 MOV TMOD,#1
MOV R2,#3 MOV R2,#4
Loop:
C
LR F0
MOV TL0,#LOW(–50000)
SETB EA
SETB ET0
MOV TH0,#LOW(–50000)
S
ETB TF0
SETB TR0
J
NB F0,$
JNB TF0
R
ET

CLR TR0
DJNZ R2,Loop
T
0
_
ISR:
RET
D
JNZ R2,Skip

C
LR TR0

S
ETB F0

C
LR ET0

R
ET
I

S
kip: CLR TR0
MOV TL0,#LOW(–50000)
MOV TH0,#LOW(–50000)

S
ETB TR0


R
ET
I


C
hú ý:
t

i
đ

a
ch

0BH có

O
RG
0
BH

L
JMP
T
0
_
ISR


Câu 8: (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 liên tục 1 số BCD nén có 2 ký số từ cổng P1 (giả sử ngõ vào ở
P1 luôn được cung cấp số BCD nén 2 ký số hợp lệ) và gửi nối tiếp số này đến M2, M2 có nhiệm vụ nhận nối
tiếp liên tục số này và tính tổng bình phương của mỗi k
ý số BCD và xuất ra P2. Thí dụ như nếu ở ngõ vào P1
của M1 có giá trị 25H (biểu diễn BCD nén của số 25) thì ngõ ra P2 của M2 ta sẽ thấy số 29 (vì 2
2
+ 5
2
= 4 +
25 = 29).Cả 2 VXL đều sử dụng cổng nối tiếp có tốc độ baud là 9600 và XTAL = 11.059 MHz. Chú ý ta
không dùng ngắt nối tiếp mà chỉ hỏi vòng RI và TI.
VXL_Thi HK_AY1213-S2_trang 5/9
Thi VXL_AY1213 – Họ và tên SV: __________________________ MSSV: ____________ Nhóm: ____
Bài giải.
Chương trình 8051 ở M1 Chương trình 8051 ở M2
Các chương trình con gửi/nhận1
byte nối tiếp và tra bảng tính A
2

ORG 0 ORG 0 SP_TRANSMIT:
; Khởi động Timer 1 để ; Khởi động Timer 1 để
JNB TI, $
; có tốc độ baud 9600 ; có tốc độ baud 9600
CLR TI
MOV TMOD,#20H MOV TMOD,#20H
MOV SBUF, A
MOV TH1,#–3 MOV TH1,#–3
RET

SETB TR1 SETB TR1
; Đặt cấu hình chỉ phát ; Đặt cấu hình chỉ thu
Chú ý:
MOV SCON,#01000010B MOV SCON,#01010000B
Nếu ban đầu cho TI=0
MOV P1,#0FFH L2:
thì CTC này là:
L1: ACALL SP_RECEIVE
MOV SBUF, A
MOV A,P1 MOV B, A
JNB TI, $
ACALL SP_TRANSMIT ANL A,#0FH
CLR TI
SJMP L1 ACALL A_SQUARE
RET
MOV R1,A

MOV A, B SP_RECEIVE:
SWAP A
JNB RI, $
ANL A,#0FH
CLR RI
ACALL A_SQUARE
MOV A, SBUF

ADD A,R1
RET

MOV P2,A



SJMP L2


A_SQUARE:
MOV DPTR,#TBL
MOVC A,@A+DPTR
RET
TBL: DB 0, 1, 4, 9, 16
DB 25,36,49,64,81

Câu 9: (1 đ)
Viết chương trình hợp ngữ 8051 (XTAL=12MHz) để tạo xung vuông (có T
ON
= T
OFF
) ở ngõ ra P1.5 như sau:
 Sau khi reset thì ngõ ra P1.5 có xung xuông với chu kỳ T = 50 ms.
 Nếu có cạnh xuống ở chân ngắt ngoài 0 (/INT0) thì từ đó ngõ ra P1.5 có xung với chu kỳ T = 50 ms.
 Nếu có cạnh xuống ở chân ngắt ngoài 1 (/INT1) thì từ đó ngõ ra P1.5 có xung với chu kỳ T = 100 ms.
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.
Bài giải.
ORG 0 Loop: JB F0,Load_1
LJMP Main Load_0: MOV TH0,#HIGH(–25000)
EX0_ISR: CLR F0 MOV TL0,#LOW(–25000)
RETI SJMP Continue
ORG 0013H Load_1: MOV TH0,#HIGH(–50000)
EX1_ISR: SETB F0 MOV TL0,#LOW(–50000)
RETI Continue:
Main: SETB TR0

SETB P3.2 ; /INT0 JNB TF0,$
SETB P3.3 ; /INT1 CLR TR0
MOV TMOD,#1 CLR TF0
MOV IE,#85H CPL P1.5
SETB IT0 SJMP Loop
SETB IT1 END


VXL_Thi HK_AY1213-S2_trang 6/9
Câu 10: (1 đ)
Viết chương trình hợp ngữ hoặc C (chỉ chọn một)
cho 8051 để làm sáng các LED đơn được nối với cổng P1
(hình tròn đen tương ứng LED sáng và ngõ ra của 8051 ở mức 0 làm LED sáng). Nếu ngõ vào P0.0 = 0 thì
sáng theo qui luật ở mẫu 1 (TD: trước hết tất cả các LED tắt trong 150 ms, kế tiếp chỉ có các LED ở P1.3 và
P1.4 sáng trong 150 ms, , cuối cùng chỉ có các LED ở P1.7 và P1.0 sáng trong 150 ms, và lặp lại) , và nếu
ngõ vào P0.0 = 1 thì sáng theo qui luật ở mẫu 2.
Các LED ở P1.7 . . . P1.0 Thời điểm (ms)







. . .
Các LED ở P1.7 . . . P1.0 Thời điểm (ms)








. . .
Mẫu 1 Mẫu 2
Giả sử cho trước chương trình con Delay_150ms (làm trễ 150 ms).
Bài giải.
Chương trình hợp ngữ Chương trình C (Keil C)
ORG 0
SETB P0.0
MOV DPTR,#STATE_TBL
MOV R0,#0 ; PTR cho mẩu 1
MOV R1,#0 ; PTR cho mẩu 2
; R0 và R1 chỉ trạng thái mấy
Loop:
JB P0.0, Pattern_2
Pattern_1:
MOV A,R0
MOVC A,@A+DPTR
MOV P1,A
ACALL Delay_150ms
INC R0
CJNE R0,#6,Loop
MOV R0,#0
SJMP LOOP
Pattern_2:
MOV A,R1
ADD A,#6
MOVC A,@A+DPTR
MOV P1,A

ACALL Delay_150ms
INC R1
CJNE R1,#6,Loop
MOV R1,#0
SJMP LOOP
STATE_TBL:
DB 0FFH,0E7H,0C3H,99H,3CH,7EH
DB 0FFH,7EH,3CH,99H,0C3H,0E7H
END

#include <reg51.h>
#define STATES 6
sbit control = P0^0;
void Delay_150ms();
// cho trước CTC làm trễ 150 ms

void main()
{
char pattern[2][STATES]=
{{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E},
{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}};
char index[2]={–1,–1};
char select;
char i;

control = 1; // Input pin

while(1)
{
select =(control != 1)? 0:1;

index[select]=(index[select]+1)%STATES;
P1 = pattern[select][index[select]];
Delay_150ms();
} // End of while
} // End of Main

Kết thúc bài thi HK
150
0
300
450
600
750
900
150
0
300
450
600
750
900
VXL_Thi HK_AY1213-S2_trang 7/9
Phụ lục
Câu 4:
Cách 2
: dùng JMP @A+DPTR
ORG 0
TT EQU 20H
X EQU TT.2
Y EQU TT.3

F EQU P1.7
MOV P1,#0FH
MOV DPTR,#JMP_TABLE
Loop: MOV A,P1
MOV TT,A
MOV C,X
ANL A,#03H
RL A
JMP @A+DPTR
JMP_TABLE:
AJMP Case0
AJMP Case1
AJMP Case2
AJMP Case3
C
ase0:
CPL C
SJMP Fin
Case1:
ANL C,Y
SJMP Fin
Case2:
ORL C,Y
SJMP Fin
Case3:
JNB Y, Fin
CPL C
Fin:
MOV F,C
SJMP Loop

END




Cách 3:
kiểm tra từng bit vào dùng JB và JNB
ORG 0
TT EQU 20H
B0 EQU TT.0 ; chứa P1.0
B1 EQU TT.1 ; chứa P1.1
X EQU TT.2
Y EQU TT.3
F EQU P1.7
MOV P1,#0FH
MOV DPTR,#JMP_TABLE
Loop:
MOV A,P1
MOV TT,A
MOV C,X
JB B1,Case_1_B0
Case_0_B0: ; P1.1 = 0
JNB B0,Case0
SJMP Case1
Case_1_B0: ; P1.1 = 1
JNB B0,Case2
SJMP Case3

Case0:
CPL C

SJMP Fin
Case1:
ANL C,Y
SJMP Fin
Case2:
ORL C,Y
SJMP Fin
Case3:
JNB Y, Fin
CPL C
Fin:
MOV F,C
SJMP Loop
END


VXL_Thi HK_AY1213-S2_trang 8/9
Câu 10: Chương trình hợp ngữ
Cách 2:
dùng 2 bảng
ORG 0
SETB P0.0
MOV R0,#0 ;Pointer cho mẩu 1
MOV R1,#0 ;Pointer cho mẩu 2
; R0 và R1 chỉ trạng thái mấy
Loop: JB P0.0, Pattern_2
Pattern_1:
MOV A,R0
MOV DPTR,#STATE_TBL1
MOVC A,@A+DPTR

MOV P1,A
ACALL Delay_150ms
INC R0
CJNE R0,#6,Loop
MOV R0,#0
SJMP LOOP
Pattern_2:
MOV A,R1
MOV DPTR,#STATE_TBL2
MOVC A,@A+DPTR
MOV P1,A
ACALL Delay_150ms
INC R1
CJNE R1,#6,Loop
MOV R1,#0
SJMP LOOP
STATE_TBL1: DB 0FFH,0E7H,0C3H,99H,3CH,7EH
STATE_TBL2: DB 0FFH,7EH,3CH,99H,0C3H,0E7H
END

Cách 3:
xuất hết mẫu rồi mới kiểm tra P0.0
ORG 0
SETB P0.0
MOV R0,#0 ;Pointer cho mẩu 1 hoặc 2
Loop: JB P0.0, Pattern_2
Pattern_1:
MOV A,R0
MOV DPTR,#STATE_TBL1
MOVC A,@A+DPTR

MOV P1,A
ACALL Delay_150ms
INC R0
CJNE R0,#6,Pattern_1
MOV R0,#0
SJMP LOOP
Pattern_2:
MOV A,R0
MOV DPTR,#STATE_TBL2
MOVC A,@A+DPTR
MOV P1,A
ACALL Delay_150ms
INC R0
CJNE R0,#6,Pattern_2
MOV R0,#0
SJMP LOOP
STATE_TBL1: DB 0FFH,0E7H,0C3H,99H,3CH,7EH
STATE_TBL2: DB 0FFH,7EH,3CH,99H,0C3H,0E7H
END
VXL_Thi HK_AY1213-S2_trang 9/9
Câu 10: Chương trình C (Keil C)
Cách 2: dùng 2 bảng
#include <reg51.h>
#define STATES 6
sbit control = P0^0;
void Delay_150ms(); // cho trước CTC làm trễ 150 ms

void main()
{
char pattern_1[STATES]= {{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E}};

char pattern_2[STATES]= {{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}};
char index_1, index_2; char select;

control = 1; // Input pin
index_1 =0; index_2 = 0;
while(1)
{
select =(control != 1)? 0:1;
if (select == 0)
{
P1 = pattern_1[index_1];
index_1 = (index_1 + 1)%STATES;
}
else
{
P1 = pattern_2[index_2];
index_2 = (index_2 + 1)%STATES;
}
Delay_150ms();
} // End of while
} // End of Main

Cách 3
: xuất hết mẫu rồi mới kiểm tra P0.0
#include <reg51.h>
#define STATES 6
sbit control = P0^0;
void Delay_150ms(); // cho trước CTC làm trễ 150 ms

void main()

{
char pattern_1[STATES]= {{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E}};
char pattern_2[STATES]= {{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}};
char index_1, index_2, select, i;
control = 1; // Input pin
index_1 =0; index_2 = 0;
while(1)
{
select =(control != 1)? 0:1;
if (select == 0)
{
for (i = 0; i < STATES; i++)
{
P1 = pattern_1[index_1];
index_1 = (index_1 + 1)%STATES;
Delay_150ms();
}
}
else
{
for (i = 0; i < STATES; i++)
{
P1 = pattern_2[index_2];
index_2 = (index_2 + 1)%STATES;
}
}
} // End of while
} // End of Main


×