Đề thi học kỳ 2 môn Vi xử lý - Năm học 2012-2013 - Hồ Trung Mỹ
Đ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
Chữ ký giám thị
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)
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 $
VXL_Thi HK_AY1213-S2_trang 1/8
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ỉ:
Cách định địa chỉ của toán hạng
Địa chỉ
ROM (hex)
Mã máy (hex)
Lệnh 8051
thứ nhất
thứ hai
Tức thời
Tương đối
ORG
0
0000
0002
0005
0007
0009
000C
000D
000F
0011
D2 80
75 90 FF
E5 90
60 04
30 80 01
F4
SETB P0.0
MOV
LL: MOV
JZ
P1,#0FFH
A,P1
Nxt
Trực tiếp (byte)
Trực tiếp (bit)
JNB
CPL
P0.0,Nxt
A
F5 A0
80 F4
Nxt: MOV
P2,A
SJMP LL
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)
MAX_XY:
MOV SP,#5FH
MOV R0,#30H
MOV R1,#16
MOV A,@R0
PUSH
MOV
CJNE A,B,Nxt
B
B,@R0
Nxt: JC
LT
Loop:
SJMP Fin
ACALL MAX_XY
INC R0
DJNZ R1,Loop
MOV @R0,A
LT: MOV
A,B
B
Fin: POP
RET
SJMP
$
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
F = NOT(X)
F = X AND Y
P1.1
P1.0
Phép toán
F = X OR Y
Chú thích
F = P1.7
X = P1.2 và Y = P1.3
0
0
0
1
1
1
0
1
F = X XOR Y
Bài giải.
ORG
0
MOV C,X
CJNE A,#0,CP1
CPL
SJMP Fin
EQ3: JNB Y, Fin
TT
X
EQU 20H
EQU TT.2
EQU TT.3
EQU P1.7
MOV P1,#0FH
C
CPL
C
Y
F
SJMP Fin
CP1: CJNE A,#1,CP2
ANL C,Y
Fin: MOV F,C
SJMP Loop
END
Loop: MOV A,P1
MOV TT,A
SJMP Fin
CP2: CJNE A,#2,EQ3
ORL C,Y
ANL A,#03H
VXL_Thi HK_AY1213-S2_trang 2/8
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:
Next:
MOV A,@R0
JNB ACC.7,Next
INC R2
A
=
46H
A
=
85H
A
=
97H
R2 = 00H
R0 = 31H
R2 = 01H
R0 = 32H
R2 = 02H
R0 = 33H
INC R0
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.1:
0, 1, 2, 3, . . . , 9, 0, 1, 2, . . .
a) (0.5 đ) Viết chương trình con BCD2LED7Shiể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)
; định nghĩa hiển thị
ORG 100H
b)
BCD2LED7S:
Count EQU P1.0
PUSH ACC
MOV DPTR,#LED7S
MOVC A,@A+DPTR
LED7S: ; hgfedcba
MOV P1,#01H
DB
DB
DB
DB
DB
DB
DB
DB
DB
DB
11000000B; 0
11111001B; 1
10100100B; 2
10110000B; 3
10011001B; 4
10010010B; 5
10000010B; 6
11111000B; 7
10000000B; 8
10010000B; 9
CLR
A
Loop:
MOV
POP
RET
P1,A
ACC
ACALL BCD2LED7S
JNB Count,$; đợi =1
JB
Count,$; đợi =0
INC
A
CJNE A,#10,Loop
CLR
SJMP Loop
A
VXL_Thi HK_AY1213-S2_trang 3/8
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:
L1:
L2:
MOV R1,#250
MOV R0,#250
NOP
1
1
1
1
2
2
2
NOP
DJNZ R0, L2
DJNZ R1, L1
RET
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)= 1s
Thời gian trễ T được tính như sau:
T = 1 + (1 + (1 + 1 + 2) x 250 + 2) x 250 + 2MC = 250753s 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:
Delay_150ms:
c) CT con làm trễ 150 ms dùng ngắt Timer 0:
Delay_150ms:
MOV TMOD,#1
MOV R2,#4
CLR F0
MOV TMOD,#1
MOV R2,#3
Loop:
SETB EA
MOV TL0,#LOW(–50000)
MOV TH0,#LOW(–50000)
SETB TR0
SETB ET0
SETB TF0
JNB F0,$
RET
JNB TF0
CLR TR0
DJNZ R2,Loop
RET
T0_ISR:
DJNZ R2,Skip
CLR TR0
SETB F0
CLR ET0
RETI
Skip:
CLR TR0
MOV TL0,#LOW(–50000)
MOV TH0,#LOW(–50000)
SETB TR0
RETI
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ì 22 + 52 = 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 4/8
Thi VXL_AY1213 – Họ và tên SV: __________________________ MSSV: ____________ Nhóm: ____
Bài giải.
Các chương trình con gửi/nhận1
Chương trình 8051 ở M1
Chương trình 8051 ở M2
byte nối tiếp và tra bảng tính A2
ORG 0
ORG 0
SP_TRANSMIT:
JNB TI, $
CLR TI
; Khởi động Timer 1 để
; có tốc độ baud 9600
MOV TMOD,#20H
MOV TH1,#–3
; Khởi động Timer 1 để
; có tốc độ baud 9600
MOV TMOD,#20H
MOV TH1,#–3
MOV SBUF, A
RET
SETB TR1
SETB TR1
; Đặt cấu hình chỉ phát
MOV SCON,#01000010B
MOV P1,#0FFH
; Đặt cấu hình chỉ thu
MOV SCON,#01010000B
L2:
Chú ý:
Nếu ban đầu cho TI=0
thì CTC này là:
MOV SBUF, A
JNB TI, $
CLR TI
L1:
ACALL SP_RECEIVE
MOV B, A
ANL A,#0FH
ACALL A_SQUARE
MOV R1,A
MOV A,P1
ACALL SP_TRANSMIT
SJMP L1
RET
MOV A, B
SWAP A
ANL A,#0FH
SP_RECEIVE:
JNB RI, $
CLR RI
ACALL A_SQUARE
ADD A,R1
MOV P2,A
MOV A, SBUF
RET
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ó TON = TOFF) ở 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
Load_1:
MOV
TH0,#HIGH(–50000)
LJMP Main
MOV
TL0,#LOW(–50000)
EX0_ISR:
CLR
RETI
ORG
F0
Continue:
SETB TR0
0013H
JNB
CLR
CLR
CPL
SJMP Loop
END
TF0,$
TR0
TF0
P1.5
EX1_ISR:
Main:
SETB F0
RETI
MOV
MOV
TMOD,#1
IE,#85H
SETB IT0
SETB IT1
Loop:
JB
F0,Load_1
Load_0:
MOV
MOV
TH0,#HIGH(–25000)
TL0,#LOW(–25000)
SJMP Continue
VXL_Thi HK_AY1213-S2_trang 5/8
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
#include <reg51.h>
#define STATES 6
MOV
MOV
MOV
DPTR,#STATE_TBL
R0,#0 ; PTR cho mẩu 1 void Delay_150ms();
R1,#0 ; PTR cho mẩu 2 // cho trước CTC làm trễ 150 ms
sbit control = P0^0;
; R0 và R1 chỉ trạng thái mấy
Loop:
void main()
JB
Pattern_1:
MOV
P0.0, Pattern_2
{
char pattern[2][STATES]=
{{0xFF, 0xE7, 0xC3, 0x99, 0x3C, 0x7E},
{0xFF, 0x7E, 0x3C, 0x99, 0xC3, 0xE7}};
char index[2]={–1,–1};
char select;
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
ADD
MOVC A,@A+DPTR
MOV P1,A
ACALL Delay_150ms
INC R1
CJNE R1,#6,Loop
MOV R1,#0
SJMP LOOP
STATE_TBL:
char i;
control = 1; // Input pin
while(1)
{
A,R1
A,#6
select =(control != 1)? 0:1;
index[select]=(index[select]+1)%STATES;
P1 = pattern[select][index[select]];
Delay_150ms();
} // End of while
} // End of Main
DB
DB
0FFH,0E7H,0C3H,99H,3CH,7EH
0FFH,7EH,3CH,99H,0C3H,0E7H
END
Kết thúc bài thi HK
VXL_Thi HK_AY1213-S2_trang 6/8
Phụ lục
Câu 4: Cách 2 dùng JMP @A+DPTR
ORG
EQU 20H
EQU TT.2
EQU TT.3
EQU P1.7
0
Case0:
Case1:
Case2:
Case3:
Fin:
TT
X
Y
CPL
C
SJMP Fin
F
ANL C,Y
SJMP Fin
MOV P1,#0FH
MOV DPTR,#JMP_TABLE
MOV A,P1
Loop:
ORL C,Y
SJMP Fin
MOV TT,A
MOV C,X
ANL A,#03H
JNB Y, Fin
RL
A
CPL
C
JMP @A+DPTR
JMP_TABLE:
MOV F,C
SJMP Loop
END
AJMP Case0
AJMP Case1
AJMP Case2
AJMP Case3
Câu 10: Chương trình hợp ngữ
Cách 2 (dùng 2 bảng)
Cách 3 (xuất hết mẫu rồi mới kiểm tra P0.0)
ORG 0
ORG 0
SETB P0.0
MOV
MOV
R0,#0 ;Pointer cho mẩu 1
R1,#0 ;Pointer cho mẩu 2
; R0 và R1 chỉ trạng thái mấy
; R0 và R1 chỉ trạng thái mấy
Loop:
Loop:
JB
Pattern_1:
MOV
P0.0, Pattern_2
JB
Pattern_1:
MOV
P0.0, Pattern_2
A,R0
A,R0
MOV
DPTR,#STATE_TBL1
MOV
DPTR,#STATE_TBL1
MOVC A,@A+DPTR
MOVC A,@A+DPTR
MOV
P1,A
MOV
P1,A
ACALL Delay_150ms
INC R0
CJNE R0,#6,Loop
MOV R0,#0
SJMP LOOP
Pattern_2:
MOV
MOV
ACALL Delay_150ms
INC R0
CJNE R0,#6,Pattern_1
MOV R0,#0
SJMP LOOP
Pattern_2:
MOV
MOV
A,R1
DPTR,#STATE_TBL2
A,R1
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
MOVC A,@A+DPTR
MOV P1,A
ACALL Delay_150ms
INC R1
CJNE R1,#6,Pattern_2
MOV R1,#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 7/8
Câu 10: Chương trình C (Keil C)
Cách 2 (dùng 2 bảng)
Cách 3 (xuất hết mẫu rồi mới kiểm tra P0.0)
#include <reg51.h>
#include <reg51.h>
#define STATES 6
#define STATES 6
sbit control = P0^0;
void Delay_150ms();
// cho trước CTC làm trễ 150 ms
sbit control = P0^0;
void Delay_150ms();
// cho trước CTC làm trễ 150 ms
void main()
void main()
{
{
char pattern_1[STATES]=
{{0xFF, 0xE7, 0xC3, 0x99, 0x3C,
0x7E}};
char pattern_2[STATES]=
{{0xFF, 0x7E, 0x3C, 0x99, 0xC3,
0xE7}};
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;
char index_1, index_2;
char select;
char i;
control = 1; // Input pin
control = 1; // Input pin
index_1 =0; index_2 = 0;
index_1 =0; index_2 = 0;
while(1)
while(1)
{
{
select =(control != 1)? 0:1;
select =(control != 1)? 0:1;
if (select == 0)
if (select == 0)
{
{
for (i = 0; I < STATES; i++)
P1 = pattern_1[index_1];
{
index_1 = (index_1 + 1)%STATES;
P1 = pattern_1[index_1];
index_1 = (index_1 + 1)%STATES;
}
else
Delay_150ms();
{
}
P1 = pattern_2[index_2];
index_2 = (index_2 + 1)%STATES;
}
}
else
{
Delay_150ms();
for (i = 0; I < STATES; i++)
} // End of while
} // End of Main
{
P1 = pattern_2[index_2];
index_2 = (index_2 + 1)%STATES;
}
}
} // End of while
} // End of Main
VXL_Thi HK_AY1213-S2_trang 8/8
Bạn đang xem tài liệu "Đề thi học kỳ 2 môn Vi xử lý - Năm học 2012-2013 - 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:
de_thi_hoc_ky_2_mon_vi_xu_ly_nam_hoc_2012_2013_ho_trung_my.pdf

