Professional Documents
Culture Documents
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, …):
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
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.
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).
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.
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
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.