Đề 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)  
0
0
  
  
  
  
  
  
  
  
  
  
  
  
150  
300  
450  
600  
750  
900  
150  
300  
450  
600  
750  
900  
  
  
. . .  
. . .  
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  
pdf 8 trang myanh 13400 Free
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:

  • pdfde_thi_hoc_ky_2_mon_vi_xu_ly_nam_hoc_2012_2013_ho_trung_my.pdf