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 B
Trang 1ĐHQG TPHCM–ĐH Bách Khoa
Khoa Đ-ĐT–BM Điện Tử
GV soạn đáp án: Hồ Trung Mỹ
Điểm Đáp án của Đề thi HK 2 – NH:2013-2014
Môn: Vi xử lý – Mã MH: 402030 Ngày thi: 02/06/2014 – 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Đ, Laptop, iPad và PC Tablet)
Chữ ký giám thị
Họ và tên SV: MSSV: Nhóm:
Hồ Trung Mỹ
Xem phụ lục để biết 1 số cách giải khá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): A000H – A7FFH
Vùng địa chỉ của SRAM thứ hai (U2): B800H – BFFFH
b) (0.5đ) Viết các lệnh 8051 để chép khối dữ liệu 10 byte bắt đầu từ địa chỉ đầu của SRAM thứ nhất (U1)
vào 10 byte đầu tiên của SRAM thứ hai:
MOV DPL,#0 MOV R1.#10 Loop: MOV DPH,#0A0H
MOVX A,@DPTR MOV DPH,#0B8H MOVX @DPTR,A INC DPL DJNZ R1,Loop SJMP $
Cách 2: dùng CJNE
MOV DPL,#0 MOV R0,#11 Loop: MOV DPH,#0A0H
MOVX A,@DPTR MOV DPH,#0B8H MOVX @DPTR,A INC DPL CJNE R0,#11,Loop SJMP $
Trang 2VXL_Thi HK_AY1314-S2_trang 2/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ỉ:
Đị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 78 30 MOV R0,#30H
000D D9 F8 Skip: DJNZ R1, Loop
END Câu 3: (1 đ)
a) (0.5 đ) Viết chương trình con hợp ngữ 8051 có tên là Is_LC để kiểm tra xem nội dung thanh ghi A có thuộc
dải ký tự chữ in thường (‘a’ đến ‘z’) thì cờ C = 1, ngược lại thì cờ C = 0 (‘a’ = 61H và ‘z’= 7AH)
b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051 để đọc 1 chuỗi ký tự được đặt trong bộ nhớ chương trình bắt đầu từ địa chỉ 100H, chuỗi ký tự này được kết thúc bằng ký tự NULL (=0) và cất vào RAM nội của 8051 từ
địa chỉ 30H; mỗi lần đọc 1 ký tự thì dùng chương trình con Is_LC để kiểm tra, nếu cờ C = 1 thì sẽ đổi ký tự
này sang chữ in hoa.(“A’ = 41H và ‘Z’ = 5AH)
TD: Chuỗi là “AbCde!”,0 thì trong RAM nội sẽ chứa “ABCDE!”,0
Bài giải
Câu 4: (1 đ) Xét 1 mạch 8051 để cài đặt (hiện thực) mạch tổ hợp sau: (không rút gọn hàm Boole)
Bài giải
Trang 3Câu 5: (1 đ) Hãy hoàn tất chương trình hợp ngữ 8051 sau dựa theo các chú thích đi kèm tại mỗi lệnh:
(giả sử cho trước chương trình con OUTPUT sẽ xuất nội dung R1 ra mạch hiển thị)
ORG 200H ; Chương trình bắt đầu từ địa chỉ 200H
MOV SP,#4FH ; nạp trị cho SP để stack bắt đầu cất từ địa chỉ 50H
MOV P1,#3 ; đặt cấu hình để chân P1.0 và P1.1 là chân nhập
JNZ SW1 ; Nếu A khác zero thì nhảy đến nhãn SW1
SJMP Display ; nhảy đến nhãn Display SW1: JB P1.0,SW2 ; nếu P1.0 = 1 thì nhảy đến nhãn SW2
SJMP Display ; nhảy đến nhãn Display SW2: JB P1.1,SW_ALL ; nếu P1.1 = 1 thì nhảy đến nhãn Loop
SJMP Display ; nhảy đến nhãn Display Display: ACALL OUTPUT ; gọi chương trình con OUPUT
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 2 (giá trị đầu 1)
Chuỗi số hiển thị ở LED 7 đoạn tương tự như bộ đếm lên (số lẻ) khi có các cạnh xuống liên tục ở P1.0:
1, 3, 5 , 7, 9, 1, 3, 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
PUSH ACC;=MOV R1,A LED7S: ; hgfedcba MOV P1,#01H
MOV DPTR,#LED7S DB 11000000B; 0 MOV A,#1
MOVC A,@A+DPTR DB 11111001B; 1 Loop:
MOV P0,A DB 10100100B; 2 ACALL BCD2LED7S
POP ACC;= MOV A,R1 DB 10110000B; 3 JNB Count,$;đợi =1
DB 10010010B; 5 ADD A,#2; = 2 lần INC A
DB 10000010B; 6 CJNE A,#11,Loop
DB 10010000B; 9
Trang 4VXL_Thi HK_AY1314-S2_trang 4/8
Câu 7: (1.5 đ) Xét 8051 với XTAL = 12 MHz và ta muốn có sóng tuần hoàn sau tại các chân P1.0 và P1.1:
P1.0 1s P1.1 1.75s
a) (0.75 đ) Hãy viết chương trình tạo dạng sóng trên dùng Timer 0 (không dùng ngắt Timer)
b) (0.75 đ) Hãy viết lại chương trình tạo dạng sóng trên dùng ngắt Timer 0
Bài giải
a) CT hỏi vòng cờ TF0: b) CT dùng ngắt Timer 0:
MOV TH0,#HIGH(–50000) T0_ISR:
RETI Skip: CLR TR0
MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–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 5 byte trong RAM nội từ địa chỉ 50H (mỗi byte này là 1 số BCD nén có 2 ký số) và gửi nối tiếp các byte này số này đến M2, M2 có nhiệm vụ nhận nối tiếp các byte này, mỗi lần nhận 1 byte thì đổi mỗi ký số BCD ra ký tự ASCII tương ứng(‘0’ = 30H) và xuất số BCD hàng chục ra cổng P1
và BCD hàng đơn vị ra cổng P0 Thí dụ như nếu M1 gửi byte có giá trị 25H (biểu diễn BCD nén của số 25) thì các ngõ ra của M2 khi đó: P1 = ‘2’ = 32H và P0 =’5’= 35H Cả 2 VXL đều sử dụng cổng nối tiếp có tốc độ baud là 2400 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
Trang 5Thi VXL_AY1314 – 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ận 1 byte nối tiếp
; Khởi động Timer 1 để ; Khởi động Timer 1 để JNB TI, $
; có tốc độ baud 2400 ; có tốc độ baud 2400 CLR TI
; Đặt cấu hình chỉ phát ; Đặt cấu hình chỉ thu
MOV SCON,#01000010B MOV SCON,#01010000B
ACALL SP_TRANSMIT ANL A,#0FH
; ACALL SP_TRANSMIT SJMP L2
; CJNE R0,#55H,M1_Loop SJMP $
Câu 9: (1 đ)
Viết chương trình hợp ngữ 8051 (XTAL=12MHz) dùng các ngắt ngoài như sau::
Trong chương trình chính thì liên tục xuất nội dung của thanh ghi R1 (gán trị đầu là 0) ra cổng P1
Nếu có cạnh xuống ở chân ngắt ngoài 0 (/INT0) R1 = R1 + 1 và nếu lớn 9 thì xóa về 0
Nếu có cạnh xuống ở chân ngắt ngoài 1 (/INT1) R1 = R1 + 2 và nếu lớn 9 thì R1 = R1 – 10 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
SETB P3.2 ; /INT0 EX1_ISR: INC R1
Loop: MOV P1,R1 Reset_2: MOV A,R1
END
Trang 6VXL_Thi HK_AY1314-S2_trang 6/8
Câu 10: (1 đ)
Viết chương trình hợp ngữ hoặc C (chỉ chọn một) cho 8051 để thực hiện các phép tính sau theo nội dung đọc
được từ cổng P0 (nếu P0 > 3 thì cổng xuất P3 = 0)
P0 Phép toán
0 P3 = P1 + P2
1 P3 = P1 – P2
2 P3 = max(P1, P2)
3 P3 = bù 2 của P1 Sau khi thực hiện xong phép toán thì đợi 200 ms và tiếp tục đọc lại P0 và thực hiện bảng hoạt động trên.Công
việc này được thực hiện liên tục
Giả sử cho trước chương trình con Delay_200ms (làm trễ 200 ms)
Bài giải
Cách 1: Chương trình hợp ngữ Cách 1: Chương trình C
P3 = y;
Delay_200ms();
} }
Kết thúc bài thi
Trang 7Phụ lục – Cách các giải khác
Câu 1:
Cách 3:
MOV R1,#10 MOV R2,#0A0H MOV R3,#0B8H Loop: MOV DPH,R2
MOVX A,@DPTR MOV DPH,R3 MOVX @DPTR,A INC DPL DJNZ R1,Loop SJMP $
Cách 4:
MOV R0,#10 MOV R1,#0A0H MOV R2,#0 MOV R3,#0B8H MOV R4,#0 ; = MOV R4,2 Loop: MOV DPH,R1
MOV DPL,R1 MOVX A,@DPTR INC DPTR MOV R1,DPH MOV R2,DPL MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL DJNZ R0,Loop SJMP $
Câu 3:
Cách 2:
org 0
MOV R0,#30H
MOV DPTR,#String
Loop: CLR A
MOVC A,@A+DPTR
JZ Finish
ACALL Is_Lower_case
JNC Skip
ADD A,# 'A'-'a' ; = ADD A,#0E0H
Skip: MOV @R0,A
INC R0
INC DPTR
SJMP Loop
MOV @R0,A
Finish: SJMP $
Is_Lower_Case:
; kiem tra xem neu A thuoc 'a' den 'z' thi co C = 1
PUSH ACC ; hoac MOV B, A ADD A,# -'a' ; = ADD A,#9FH
JB ACC.7,Outside ADD A,# -('z'-'a')-1 ; = ADD A,#0E6H JNB ACC.7,Outside
SETB C SJMP LC_Fin Outside:
CLR C LC_Fin:
POP ACC ; hoac MOV A, B
RET ; org 100H String: DB "ABcdE!",0 END
Câu 4: Cách 2: Cách 3:
W EQU B.0
X EQU B.1
Y EQU B.2
Z EQU B.3
F EQU P1.7
MOV P1,#0FH Loop: MOV B,P1
MOV C,X ORL C,/W ANL C,Y CPL C MOV F0,C MOV C,Z
JB Y,Skip CPL C Skip: ORL C,F0
MOV F,C SJMP Loop END
; Dùng byte có địa chỉ bit để xử lý
; TD: B, 20H-2FH
W EQU B.0
X EQU B.1
Y EQU B.2
Z EQU B.3
F EQU P1.7
MOV P1,#0FH Loop:
MOV B, P1
JNB Y, Feq1 JNB W, FeqZ JNB X, Feq1 FeqZ: MOV C,Z
MOV F,C SJMP Loop Feq1: SETB F
SJMP Loop END
Trang 8VXL_Thi HK_AY1314-S2_trang 8/8
Câu 7: Cách 2:
a) CT hỏi vòng cờ TF0: b) CT dùng ngắt Timer 0:
MOV TH0,#HIGH(–50000) T0_ISR:
RETI Skip: CLR TR0
MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–50000)
SETB TR0 RETI
Câu 8: Cách 2: ASM Cách 2: C
ORG 0 P0_eq_0: #include <reg51.h>
MOV A,#0FFH MOV A, R1 void Delay_200ms();
Loop: MOV A, R1 P0 = 0xFF; // P0, P1, và P2
MOV A, P0 CLR C P1 = 0xFF; // là cổng nhập
CJNE A, #4, $+3 MOV A, R1 x = P0; v1 = P1; v2 = P2;
JC Menu_A CJNE A, 02H, $+3 if (x == 0)
Menu_A: SJMP Output y = v1 - v2;
MOV DPTR,#JMPTAB P0_eq_3: if (x == 2)
RL A MOV A, R1 y = v1 > v2? v1:v2;
AJMP P0_eq_2 ACALL Delay_200ms P3 = y;
} // end of while } // end of main