You are on page 1of 8

(Ngày ra đề) (Ngày duyệt đề)

Giảng viên ra đề: Người phê duyệt:


(Chữ ký và Họ tên) (Chữ ký, Chức vụ và Họ tên)

Học kỳ/năm học 2 2019-2020


THI CUỐI KỲ Ngày thi 23/7/2020
Môn học Vi xử lý
TRƯỜNG ĐH BÁCH KHOA – ĐHQG-HCM Mã môn học EE2013
KHOA ĐIỆN-ĐIỆN TỬ
Thời lượng 120 phút Mã đề
Ghi - Sinh viên KHÔNG được sử dụng tài liệu
chú: - Tất cả các lệnh MCU8051 phải được viết bằng hợp ngữ (không sử dụng ngôn ngữ C)
- Đề thi gồm 03 trang và 02 trang phụ lục.

Câu hỏi 1) (L.O.1, L.O.2, L.O.3, L.O.4) (4.0đ): Gồm 5 câu nhỏ đánh số từ 1 đến 5
1. (0.5đ) Viết các lệnh để bit SMOD=1 (SMOD là MSB của thanh ghi PCON) mà không ảnh hưởng đến
các bit còn lại trong thanh ghi PCON.
MOV A, PCON Cách khác:
SETB ACC.7 ORL PCON, #80H
MOV PCON, A
2. (0.5đ) Giả sử cổng nối tiếp được khởi động mode 1 và tốc độ baud được cung cấp bởi tốc độ tràn của
Timer1. Cho Fosc=11.059Mhz, SMOD=0, xem các dòng lệnh sau:
MOV TMOD,#20H
MOV TH1,#-6
a. (0.25đ) Tính tốc độ tràn Timer1?
 Tốc độ tràn Timer1 = 1/(6MC) = 1/[6x(12/11.059)] = 153597 Hz = 153.597 Khz
b. (0.25đ) Tính tốc độ baud (baudrate)?
 Tính tốc độ baud (baudrate) = 2SMOD x (Tốc độ tràn Timer1/32) = 4800 bps
3. (1.0đ) Cho biết thứ tự thực hiện các dòng lệnh trong chương trình sau (Ví dụ: 1, 2, 3, 4, 5, …):

STT CHƯƠNG TRÌNH STT CHƯƠNG TRÌNH


ORG 0000H 7 MAIN: MOV IE,#82H
1 LJMP MAIN 8 ACALL DL
ORG 000BH 9 SETB TF0
2 SETB TF1 10 SJMP $
3 CPL A 11 DL: INC R7
4 RETI 12 RET
ORG 001BH END
5 CPL P1.0
6 RETI

 SV trả lời đúng thứ tự: 1, 7, 8  0.25đ


 SV trả lời đúng thứ tự: 1, 7, 8, 11, 12  0.5đ
 SV trả lời đúng thứ tự: 1, 7, 8, 11, 12, 9, 2  0.75đ
 SV trả lời đúng thứ tự: 1, 7, 8, 11, 12, 9, 2, 3, 4, 10  1.0đ
4. (1.0đ) Viết chương trình con tên SS16 thực hiện so sánh 2 số nhị phân 16 bit không dấu cất trong B_A
(thanh ghi B là byte cao) và R7_R6 (R7 là byte cao). Kết quả so sánh trả về cờ carry như sau:
 Cờ carry = 0: nếu B_A ≥ R7_R6
 Cờ carry = 1: nếu B_A < R7_R6
Lưu ý: bảo toàn nội dung các thanh ghi trên khi thoát khỏi chương trình con.
Cách 1 (giả sử bank0 là bank tích cực hiện hành): Cách 2: Cách 3:
SS16: PUSH ACC SS16: XCH A, B SS16: PUSH ACC
MOV A, B MOV 30H, R7 CLR C
CJNE A, 7, TT CJNE A, 30H, QUIT SUBB A, R6
SJMP KT_L XCH A, B MOV A, B
TT: POP ACC MOV 30H, R6 SUBB A, R7
SJMP THOAT CJNE A, 30H, $+3 POP ACC
KT_L: POP ACC SJMP EXIT RET
CJNE A, 6, THOAT QUIT: XCH A, B
THOAT:RET EXIT: RET

 So sánh đúng 2 byte và (C) đúng (0.5đ),bảo toàn nội dung các thanh ghi (0.5đ)
5. (1.0đ) MCU8051 kết nối với 2 ngõ vào SW1 và SW2 được nối tương ứng đến chân P1.7 và P1.6.
a. (0.5đ) Viết chương trình liên tục kiểm tra trạng thái SW1 để thực hiện các nhiệm vụ sau:
 SW1 = 0: xuất mã ASCII của ký tự N ra Port 2
 SW1 = 1: xuất mã ASCII của ký tự Y ra Port 2

ORG 0
LAP: JB P1.7, XUAT_Y
MOV P2, #’N’
SJMP LAP
XUAT_Y: MOV P2, #’Y’
SJMP LAP
END

b. (0.5đ) Viết chương trình liên tục kiểm tra trạng thái SW1 và SW2 để thực hiện nhiệm vụ theo
bảng sau:
SW1 SW2 Xuất ra Port 2 mã ASCII của ký tự
0 0 0
0 1 1
1 0 2
1 1 3

ORG 0 Cách khác:


LAP: JB P1.7, T1X ORG 0
JB P1.6, T01 LAP: MOV A, P1
MOV P2,#’0’ ANL A, #0C0H
SJMP LAP RL A
T01: MOV P2,#’1’ RL A
SJMP LAP ADD A, #30H
T1X: JB P1.6, T11 MOV P2, A
MOV P2,#’2’ SJMP LAP
SJMP LAP END
T11: MOV P2,#’3’
SJMP LAP
END

Câu hỏi 2) (L.O.5, L.O.6) (2.0đ): Gồm 4 câu nhỏ đánh số từ 1 đến 4
Cho sơ đồ kết nối giữa MCU8051 vớicác LED đơn như sau:

MCU 8051
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

8 x 330
1. (0.5đ) Sử dụng Timer0, viết chương trình con có tên DL200 có chức năng tạo trễ 200ms. Cho
Fosc = 12Mhz. SV khai báo mode Timer trong chương trình con.

 Fosc = 12Mhz  MC=1s


 Tdelay = 200ms = 4 x 50.000 MC
DL200:
MOV TMOD,#01H
MOV R5,#4
LOOP: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R5,LOOP
RET

2. (0.5đ) Viết chương trình thực hiện tuần tự các công việc sau (không sử dụng ngắt):
a. Kiểm tra chuyển trạng thái từ 1 xuống 0 trên chân P3.3 của MCU8051.
b. Nếu có chuyển trạng thái từ 1 xuống 0 sẽ thực hiện xuất lần lượt chuỗi dữ liệu: 18H, 3CH, 7EH,
FFH được lưu trong bộ nhớ chương trình ra Port1 của MCU8051. Thời gian giữa 2 lần xuất dữ
liệu là 200ms (sử dụng chương trình con DL200 ở câu trên, không cần viết lại chương trình con).
c. Thực hiện lại liên tục các công việc a, b.
ORG 0000H Cách khác:
MOV DPTR,#TABLE
ORG 0000H
LAP: JNB P3.3, LAP
LAP: JNB P3.3, LAP
JB P3.3,$
JB P3.3, $
MOV R0,#0
MOV DPTR, #TABLE
START:
LP: CLR A
MOV A,R0
MOVC A, @A+DPTR
MOVC A,@A+DPTR
MOV P1, A
MOV P1,A
CALL DL200
CALL DL200
INC DPTR
INC R0
CJNE A, #0FFH, LP
CJNE R0,#4,START
JMP LAP
JMP LAP
DL200: …… DL200: ……
RET RET

TABLE: DB 18H, 3CH, 7EH, 0FFH TABLE: DB 18H, 3CH, 7EH, 0FFH

END END

3.(0.5đ) Thực hiện lại câu trên bằng cách sử dụng ngắt ngoài 1. Nhận xét đáp ứng của MCU8051 so với
câu trên (trường hợp không dùng ngắt)?
ORG 0000H EX1_ISR:
JMP MAIN MOV R0,#0
START:MOV A,R0
ORG 0013H MOVC A,@A+DPTR
JMP EX1_ISR MOV P1,A
CALL DL200
MAIN: INC R0
MOV DPTR,#TABLE CJNE R0,#4,START
MOV IE,#84H RETI
SETB IT1 DL200:
JMP $ ……
RET
TABLE: DB 18H, 3CH, 7EH, 0FFH
END
 Cách khác:trong ISR /INT1 chỉ cần set cờ F0, chương trình chính chỉ cần thêm khởi động ngắt
Và kiểm tra cờ F0
ORG 0 TIEP: CLR A
JMP MAIN MOVC A,@A+DPTR
ORG 0013H MOV P1,A
SETB F0 CALL DL200
RETI INC DPTR
ORG 0030H CJNE A,#0FFH,TIEP
MAIN: MOV IE,#84H SJMP START
SETB IT1 DL200: ---
START: JNB F0,$ RET
CLR F0 TAB: DB 18H,3CH,7FH,0FFH
MOV DPTR,#TAB END

Nhận xét:
Đối với chương trình có sử dụng ngắt, nếu trong lúc đang xuất dữ liệu mà có 1 hoặc nhiều lần ngắt
xảy ra thì khi trở về chương trình chính sẽ thực hiện xuất dữ liệu 1 lần nữa (do cờ IE1 = 1), rồi tiếp
tục chờ ngắt.

4. (0.5đ) Cho biết hiệu ứng của các đèn LED trên Port1 khi có chuyển trạng thái từ 1 xuống 0 trên chân
P3.3?
Tạo hiệu ứng cho dãy LED sáng từ giữa ra 2 biên. (LED tích cực ở mức 1).

Câu hỏi 3) (L.O.5) (2.0đ): Gồm 2 câu nhỏ đánh số từ 1 đến 2


1. (1.0đ) Sử dụng Timer0 (không dùng ngắt timer), viết 2 chương trình con có tên XUNG25 và XUNG75
có cùng chức năng tạo 1 xung vuông ở ngõ ra P1.7 có chu kỳ T = 1ms. Trong đó, XUNG25 có chu kỳ
nhiệm vụ là 25% và XUNG75 có chu kỳ nhiệm vụ 75%. Cho Fosc = 12Mhz.
Minh họa 1 xung vuông: TH TL Chu kỳ nhiệm vụ = TH/T (%)
T
Lưu ý: Giả sử thanh ghi TMOD đã thiết lập timer0 hoạt động ở mode 1 (16 bit) trong chương trình
chính. Trong các chương trình con không cần khởi tạo giá trị cho TMOD.
T= 1ms : XUNG25: DC = 25% => TH = 250 MC, TL = 750 MC
XUNG75: DC = 75% => TH = 750 MC, TL = 250 MC

XUNG75: SETB P1.7


XUNG25: SETB P1.7 MOV TL0, #LOW(-750)
MOV TL0, #LOW(-250) MOV TH0, #HIGH(-750)
MOV TH0, #HIGH(-250) SETB TR0
SETB TR0 JNB TF0, $
JNB TF0, $ CLR TF0
CLR TF0 CLR TR0
CLR TR0 CLR P1.7
CLR P1.7 MOV TL0, #LOW(-250)
MOV TL0, #LOW(-750) MOV TH0, #HIGH(-250)
MOV TH0, #HIGH(-750) SETB TR0
SETB TR0 JNB TF0, $
JNB TF0, $ CLR TF0
CLR TF0 CLR TR0
CLR TR0 RET
RET
Cách khác:
XUNG25: SETB P1.7
CALL DL250 XUNG75: SETB P1.7
CLR P1.7 MOV R7, #3
MOV R7, #3 LAP75: CALL DL250
LAP25: CALL DL250 DJNZ R7, LAP75
DJNZ R7, LAP25 CLR P1.7
RET CALL DL250
RET
DL250: MOV TL0, #LOW(-250)
MOV TH0, #HIGH(-250)
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET

 Viết đúng mỗi chương trình con XUNG25 và XUNG75 là 0.5 điểm

2. (1.0đ) Viết chương trình thu ký tự từ port nối tiếp chế độ UART 9 bit (tốc độ baud = 1200, Fosc =
12Mhz, SMOD = 0) và tạo chuỗi xung vuông (mỗi xung có chu kỳ T = 1ms) ra chân P1.7 theo định
dạng sau:
 8 bit dữ liệu: xác định số lượng xung trong chuỗi xung vuông
 Bit thu thứ 9: xác định chu kỳ nhiệm vụ của xung vuông có T = 1ms
o Bit thu thứ 9 = 0: xung có chu kỳ nhiệm vụ 25%
o Bit thu thứ 9 = 1: xung có chu kỳ nhiệm vụ 75%
Ví dụ:  9 bit thu được = 0 00001111  tạo 15 xung vuông có chu kỳ nhiệm vụ = 25%
 9 bit thu được = 1 00001111  tạo 15 xung vuông có chu kỳ nhiệm vụ = 75%
Lưu ý:
 Sử dụng các chương trình con (XUNG25 và XUNG75) ở câu trên cho việc tạo 1 xung vuông
(không cần viết lại chương trình con).
 Khi tạo xong chuỗi xung trên chân P1.7 thì mới nhận ký tự tiếp theo từ port nối tiếp.
 Trường hợp 8 bit dữ liệu nhận được có giá trị bằng 0 thì không tạo xung mà chỉ chờ nhận ký tự
tiếp theo từ port nối tiếp.
 Quá trình này được lặp lại liên tục.
 Sinh viên cần phải thiết lập các thông số cần thiết cho việc truyền qua cổng nối tiếp trong chương
trình chính.

ORG 0 PHAT25: CALL XUNG25


MOV TMOD, #21H DJNZ ACC, PHAT25
MOV TL1, # -26 JMP LAP
MOV TH1, # -26 PHAT75: CALL XUNG75
SETB TR1 DJNZ ACC, PHAT75
MOV SCON, # 11010000B (#0D0H) JMP LAP
LAP: JNB RI, LAP XUNG25: …
CLR RI RET
MOV A, SBUF XUNG75: …
JZ LAP RET
JB RB8, PHAT75 END

 Viết đúng phần thiết lập TMOD, giá trị nạp Timer1 (0.25đ)
 Viết đúng phần thiết lập SCON và thu ký tự (0.25đ)
 Viết đúng phần không tạo xung và tạo xung theo RB8 và số xung (0.5đ)
Câu hỏi 4) (L.O.5, L.O.6) (2.0đ): Gồm 3 câu nhỏ đánh số từ 1 đến 3
Cho mạch điện MCU8051 đo độ rộng xung vuông và hiển thị như hình vẽ dưới đây:
 Tín hiệu cần đo độ rộng xung đưa vào ngõ P_IN=P3.2, tầm đo tối đa 250µs
 Hiển thị giá trị đo bằng 2 số HEX ra 2 LED 7 đoạn Anode chung tương ứng
 Khi nhấn SW (tích cực mức 0) phát giá trị đo ra cổng nối tiếp ngõ S_OUT=P3.1
 Hoạt động của IC74HC573(U2 và U3) như sau:
 LE=1→Qi=Di (i=0÷7)
 LE=0→Qi không đổi

1. (0.5đ) Viết một chương trình con tên DISPLAY hiển thị mã HEX cất trong thanh ghi A ra 2 LED 7
đoạn Anode chung theo đúng thứ tự high nibble (4 bit cao của thanh ghi A) và low nibble (4 bit thấp của
thanh ghi A) như hình vẽ. Cho bảng tra mã 7 đoạn Anode chung và mã ASCII (dạng số HEX) như sau:
Digit 0 1 2 3 4 5 6 7 8 9 A B C D E F
Mã LED 7 đoạn (H) 0C0 0F9 0A4 0B0 99 92 82 0F8 80 90 88 83 0C6 0A1 86 8E
Mã ASCII (H) 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46

DISPLAY: MOV DPTR,#TAB


PUSH ACC SWAP A
ANL A,#0FH ANL A,#0FH
MOVC A,@A+DPTR MOVC A,@A+DPTR
MOV P1,A MOV P1,A
SETB P2.0 SETB P2.1
CLR P2.0 CLR P2.1
POP ACC RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH
 Viết đúng chuỗi lệnh tách nibble,tra bảng và mở/đóng chốt từng bộ chốt U2&U3 (0.25đ)
 Có thể đặt bảng tra ở chương trình chính
Cách khác:
DISPLAY: PUSH ACC
MOV DPTR, #TAB
MOV B, #16
DIV AB ; A chứa 4 bit cao, B chứa 4 bit thấp
MOVC A, @A+DPTR
MOV P1, A
SETB P2.1
CLR P2.1
MOV A, B
MOVC A, @A+DPTR
MOV P1, A
SETB P2.0
CLR P2.0
POP ACC
RET
2. (0.5đ) Giả sử đã thiết lập các thông số truyền qua cổng nối tiếp trong chương trình chính. Viết một
chương trình con tên OUT_CHR phát 2 ký tự mã HEX cất trong thanh ghi A dưới dạng mã ASCII ra cổng
nối tiếp, ký tự ứng với nibble thấp (4 bit thấp của thanh ghi A) phát trước, nibble cao (4 bit cao của thanh
ghi A) phát sau.
Ví dụ: (A)=0AH→phát ra cổng nối tiếp 41H, 30H

OUT_CHR: PUSH ACC SWAP A


ANL A,#0FH ANL A,#0FH
CJNE A,#0AH,$+3 CJNE A,#0AH,$+3
JNC GT0 JNC GT1
ADD A,#30H ADD A,#30H
JMP PHAT0 JMP PHAT1
GT0: ADD A,#37H GT1: ADD A,#37H
PHAT0: JNB TI,$ PHAT1: JNB TI,$
CLR TI CLR TI
MOV SBUF,A MOV SBUF,A
POP ACC RET

 Viết đúng phần chuyển sang mã ASCII từng số HEX và phát ra cổng nối tiếp (0.25đ)
 Hoặc có thể viết gọn hơn nữa:
OUT_CHR: PUSH ACC PHAT_CHR: ANL A,#0FH
CALL PHAT_CHR CJNE A,#0AH,$+3
POP ACC JC LT10
SWAP A ADD A,#07H
CALL PHAT_CHR LT10: ADD A,#30H
RET JNB TI,$
CLR TI
MOV SBUF,A
RET

Cách khác:
OUT_CHR: MOV DPTR, #TAB_ASC
MOV B, #16
DIV AB
MOVC A, @A+DPTR
XCH A, B ; B: ASCII NIBBLE CAO
MOVC A, @A+DPTR ; A: ASCII NIBBLE THẤP
JNB TI, $
CLR TI
MOV SBUF, A
JNB TI, $
CLR TI
MOV SBUF, B
RET
TAB_ASC: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H, 38H, 39H
DB 41H, 42H, 43H, 44H, 45H, 46H
3. (1.0đ) Viết một chương trình đo độ rộng xung thực hiện các công việc sau:
 Sử dụng Timer đo độ rộng xung, sử dụng ngắt ngoài đọc giá trị đo độ rộng xung (tính theo s).
 Chương trình chính xuất giá trị đo độ rộng xung dạng mã HEX ra bộ hiển thị, và kiểm tra nếu có
nhấn SW sẽ phát 2 ký tự mã HEX đang hiển thị dưới dạng mã ASCII ra cổng nối tiếp.
 Lặp vòng liên tục các công việc trên.
 Sử dụng chương trình con DISPLAY và OUT_CHR ở 2 câu trên (chỉ cần khai báo tên chương trình
con, không cần ghi lại nội dung chi tiết).
 Cho Fosc=12Mhz, baudrate=1200, SMOD=0.
Lưu ý: Sinh viên cần phải thiết lập các thông số cần thiết cho việc truyền qua cổng nối tiếp trong chương
trình chính.

ORG 0 START: MOV B,R2


JMP MAIN MOV A,B
ORG 0003H CALL DISPLAY
JMP EX0_ISR JB P2.2,START
ORG 0030H MOV A,B
MAIN: MOV SCON,#52H CALL OUT_CHR
MOV TMOD,#2AH JMP START
MOV TH1,#-26 DISPLAY: ---
MOV TL1,TH1 RET
SETB TR1 OUT_CHR: ---
CLR P2.0 RET
CLR P2.1 EX0_ISR: MOV R2,TL0
MOV IE,#81H MOV TL0,#0
SETB IT0 RETI
SETB TR0 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H, 0A1H,86H,8EH
END
 Viết đúng phần khởi động cổng nối tiếp,TMOD,Timer1 tạo baudrate,ngắt ngoài 0 cạnh xuống
(0.25đ)
 Viết đúng phần chương trình chính (0.5đ)
 Viết đúng phần trình phục vụ ngắt ngoài 0 (0.25đ)
 Lưu ý:
- Nếu chưa khai báo bảng TAB trong CTC DISPLAY phải khai báo trong chương trình
chính,không khai báo trừ (0.25đ)
- Phải phát data đang hiển thị ra cổng nối tiếp,chính là (B) chứ không phải (R2),nếu phát trực tiếp
từ (R2) trừ (0.25đ)

You might also like