ĐHQG TPHCM–ĐH Bách Khoa Khoa Đ-ĐT–BM Điện Tử Điểm Đáp án Đề thi HK – NH:2011-2012 Chữ ký giám thị Môn: Vi xử lý – Mã MH:402030 Ngày thi: 22/06/2012 – Thời gian làm bài: 110 phút Đề có trang SV làm trực tiếp đề Tổng số câu 9, tổng số điểm 11, SV cần làm đạt 10 (SV sử dụng tài liệu mình, SV KHƠNG dùng PC, Laptop, iPad PC Tablet) Họ tên SV: MSSV: Nhóm: Bộ mơn Điện Tử duyệt GV đề Hồ Trung Mỹ Câu 1: (1 đ) Cho trước mạch giải mã địa hệ thống dùng VXL 8051: a) Xác định vùng địa SRAM: (0.75 đ) Vùng địa SRAM thứ (U1): 0800H–0FFFH Vùng địa SRAM thứ hai (U2): 3000H–37FFH b) Viết lệnh 8051 để chép byte từ địa đầu SRAM thứ vào byte có địa cuối SRAM thứ hai (0.25đ): MOV DPTR,#0800H MOVX A,@DPTR MOV DPTR,#37FFH MOVX @DPTR, A VXL_Đáp án đề Thi HK_AY1112-S2_trang 1/8 Câu 2: (1.5 đ) Điền vào chỗ trống cột địa ROM chương trình, cột mã máy cột cách địa chỉ: Địa Cách định địa toán hạng Mã máy (hex) Lệnh 8051 ROM (hex) thứ thứ hai 0000 0003 0005 0008 000A 000C 000D 000F 0011 75 7D 12 80 C0 00 DD D0 22 81 80 00 FE 05 40 0A FD 05 ORG MOV SP, #40H MOV R5, #80H LCALL DELAY SJMP $ DELAY: PUSH AGAIN: NOP DJNZ R5,AGAIN POP RET END Trực tiếp Thanh ghi Dài Tương đối Tức thời Tức thời Câu 3: (1.5 đ) a) (1 đ) Viết chương trình hợp ngữ 8051 có tên SS4bit để so sánh bit cao bit thấp ghi A, sau gọi chương trình nội dung ghi A nhu cũ Kết so sánh tác động đến R7 theo quy ước sau: bit cao A < bit thấp A R7 = 01H bit cao A = bit thấp A R7 = 02H bit cao A > bit thấp A R7 = 04H b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051 đọc liên tục giá trị cổng P0 dùng chương trình SS4bit để so sánh bit cao bit thấp P0 xuất kết cổng P1 Đầu đoạn chương trình ta phải gán trị SP stack cất liệu vào stack từ địa 30H Bài giải b) a)SS4bit: PUSH MOV ANL MOV MOV SWAP ANL CJNE ACC R1,A A,#0FH B,A A,R1 A A,#0FH A,B, ANEB AGTB: ORG MOV SP,#2FH MOV P0,#0FFH MOV R7, #4 SJMP DONE ALTB: LOOP: MOV R7, #1 POP RET ACC DONE: MOV ACALL MOV SJMP A,P0 SS4bit P1,R7 LOOP AEQ: MOV R7, #2 SJMP DONE ANEB: JC ALTB Câu 4: (1.5 đ) Viết chương trình hợp ngữ 8051 có tên Menu_R0 thực phép tính sau theo nội dung ghi R0 (nếu không thuộc bảng sau, nghĩa R0 > R2 = 0) R0 Chú thích (R1 số khơng dấu có giá trị nhỏ 64) Phép toán R2 R2 R2 R2 = = = = R1 * R1 / bù swap 4 R1 R1 SV không dùng lệnh MUL mà phải áp dụng dịch bit SV không dùng lệnh DIV mà phải áp dụng dịch bit R2 có trị hoán đổi bit thấp bit cao R1 Bài giải (Coi thêm phần phụ lục với cách khác) VXL_Đáp án đề Thi HK_AY1112-S2_trang 2/8 Menu_R0: MOV DTPR,#JMP_TABLE MOV A,R0 CJNE A,#4,NEXT NEXT: JC CONT MOV R2,#0 RET CONT: RL A JMP @A+DPTR JMP_TABLE: AJMP CASE0 AJMP CASE1 AJMP CASE2 AJMP CASE3 CASE0: MOV A,R1 RL A RL A MOV R2,A RET CASE2: MOV CPL INC MOV RET CASE1: MOV A,R1 CLR ACC.0 RR A CLR ACC.0 RR A MOV R2,A RET CASE3: MOV A,R1 SWAP A MOV R2,A RET A,R1 A A R2,A Câu 5: (1 đ) Phân tích đoạn chương trình hợp ngữ 8051H sau cách ghi giá trị hex vào chỗ trống Giả sử trước thực thi chương trình này, nội dung số ô nhớ RAM nội: (30H) = 46H, (31H) = 75H, (40H) = 57H, (41H) = 89H Lệnh 8051 MOV R0,#30H MOV R1,#40H MOV R2,#2 CLR C LOOP: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A,#0 MOV @R0,A SJMP $ Lần lặp A = A = A = 46H 9DH 03H cờ C = Lần lặp A = A = A = 75H FFH 65H cờ C = Sau thực thi đoạn chương trình nội dung nhớ sau có trị số là: (32H) = 01H (31H) = 65H (30H) = 03H Ý nghĩa đoạn chương trình là: (0.5 đ) Tính tổng số BCD nén với 2K ký số với R0 trỏ đến byte thấp toán hạng 1, R1 trỏ đến byte thấp toán hạng 2, R2 chứa giá trị K, kết cất lại vào vùng nhớ toán hạng Câu 6: (1.5 đ) Cho trước mạch sau với chân 1Y1 nối với đoạn a,1Y2 nối với đoạn b, ,2Y3 nối với đoạn g LED đoạn (CC) với điện trở hạn dòng 330 Biết 8051 hoạt động với XTAL=12MHz VXL_Đáp án đề Thi HK_AY1112-S2_trang 3/8 a) (1 đ) Viết chương trình DELAY_500MS làm trễ 500 ms dùng Timer (không dùng ngắt timer) chương trình BCD2LED7S hiển thị ký số BCD ghi A LED đoạn DELAY_500MS: LAP EQU 10 SD EQU 50000 MOV R7,#LAP MOV TMOD,#01H DL1: MOV TL0,#LOW(-SD) MOV TH0,#HIGH(-SD) SETB TR0 JNB TF0, $ CLR TF0 CLR TR0 DJNZ R7, DL1 RET ; Chú ý trị số khác ; hợp lệ cho LAP SD: ; LAP x SD = 500000 ; 20 x 25000 ; 50 x 10000 ; 200 x 2500 ; BCD2LED7S: MOV MOVC MOV RET DPTR,#LED7S A,@A+DPTR P1,A ; định nghĩa hiển thị ORG 200H LED7S: ; -gfedcba DB 00111111B; DB 00000110B; DB 01011011B; DB 01001111B; DB 01100110B; DB 01101101B; DB 01111101B; DB 00000111B; DB 01111111B; DB 01101111B; ; Chú ý 74LS244 IC đệm ; trạng thái, IC ; cung cấp đủ dùng để lái ; LED TD: Khi P1.0 = ; đoạn a sáng b) (0.5 đ) Viết chương trình có dùng chương trình a) để mạch hoạt động sau: Khi có cạnh xuống P2.0 lần thứ (3, 5,…) số từ đến với thời gian số 500 ms quay lại kiểm tra cạnh xuống P2.0 Khi hiển thị từ đến cạnh xuống P2.0 khơng kể đến! Khi có cạnh xuống P2.0 lần thứ (4, 6,…) số 1s quay lại kiểm tra P2.0 Chương trình: ORG SETB P2.0 CLR C LOOP: JNB P2.0, $ JB P2.0, $ ; Có cạnh xuống P2.0 CPL C JNC P20_EVEN ; Xử lý số lần cạnh ; xuống P2.0 lẻ MOV R0,#0 MOV R1,#10 L1: MOV A, R0 ACALL BCD2LED7S ACALL DELAY_500MS INC R0 DJNZ R1, L1 SJMP LOOP P20_EVEN: ; Xử lý số lần cạnh ; xuống P2.0 chẵn MOV A,#0 ACALL BCD2LED7S ACALL DELAY_500MS ACALL DELAY_500MS SJMP LOOP Chú ý: Phần xử lý số lần cạnh xuống P2.0 lẻ Có thể viết cách khác: MOV R0,#0 L1: MOV A, R0 ACALL BCD2LED7S ACALL DELAY_500MS INC R0 CJNE R0,#10, L1 SJMP LOOP Câu 7: (1 đ) Xét hệ thống gồm vi xử lý 8051 M1 M2 kết nối theo kiểu modem rỗng (null modem) để truyền nối tiếp với M1 có nhiệm vụ đọc chuỗi ký tự (kết thúc ký tự rỗng (NULL) = 00H) từ ROM chương trình địa 200H xuất nối tiếp đến M2, M2 có nhiệm vụ nhận nối tiếp chuỗi ký tự cất chuỗi vào RAM nội địa 30H Cả VXL sử dụng cổng nối tiếp có tốc độ baud 4800 XTAL = 11.0592 MHz Chú ý ta không dùng ngắt nối tiếp mà hỏi vòng RI TI VXL_Đáp án đề Thi HK_AY1112-S2_trang 4/8 Bài giải (Coi thêm phần phụ lục với cách khác) Chương trình 8051 M1 Chương trình 8051 M2 ORG ; Khởi động Timer để ; có tốc độ baud 4800 MOV TMOD,#20H MOV TH1,#–6 SETB TR1 ; Đặt cấu hình phát MOV SCON,#01000010B MOV DPTR,#0200H L1: CLR A MOVC A,@A+DPTR ACALL SP_TRANSMIT JZ EXIT_M1 INC DPTR SJMP L1 EXIT_M1: SJMP $ ORG ; Khởi động Timer để ; có tốc độ baud 4800 MOV TMOD,#20H MOV TH1,#–6 SETB TR1 ; Đặt cấu hình thu MOV SCON,#01010000B MOV R0,#30H L2: ACALL SP_RECEIVE MOV @R0, A JZ EXIT_M2 INC R0 SJMP L2 EXIT_M2: SJMP $ CT gửi/nhận1 byte nối tiếp SP_TRANSMIT: JNB CLR MOV RET TI, $ TI SBUF, A Chú ý: Nếu ban đầu cho TI=0 CTC là: MOV SBUF, A JNB TI, $ CLR TI RET SP_RECEIVE: JNB CLR MOV RET RI, $ RI A, SBUF Câu 8: (1 đ) Viết chương trình hợp ngữ 8051 để tạo số xung ngõ sau: Nếu có cạnh xuống chân ngắt ngồi (/INT0) ngõ P1.0 có xung dương (5 cạnh lên) Nếu có cạnh xuống chân ngắt ngồi (/INT1) ngõ P1.1 có xung dương (3 cạnh lên) Nếu khơng có cạnh xuống /INT0, /INT1 P1.0=0 P1.1=0 Giả sử xung kích cạnh xuống ngõ INT0 INT1 không xảy đồng thời Xung dương ngõ có lệnh SETB sau CLR Bài giải Chương trình ORG LJMP MAIN ORG 0003H LJMP EX0_ISR ORG 0013H LJMP EX1_ISR MAIN: SETB SETB SETB SETB CLR CLR MOV SJMP Chương trình phục vụ ngắt INT0 EX0_ISR: MOV Chương trình phục vụ ngắt INT1 EX1_ISR: R1, #5 L1: MOV R1, #3 L2: SETB P1.0 CLR P1.0 DJNZ R1, L1 RET P3.2 P3.3 IT0 IT1 P1.0 P1.1 IE,#85H $ VXL_Đáp án đề Thi HK_AY1112-S2_trang 5/8 SETB P1.1 CLR P1.1 DJNZ R1, L2 RET Câu 9: (1 đ) Viết chương trình hợp ngữ C cho 8051 để tạo dạng sóng tuần hồn sau cổng P1: Giả sử cho trước chương trình DELAY_1S (làm trễ giây) Bài giải (Coi thêm phần phụ lục với cách khác) Chương trình hợp ngữ Chương trình C (Keil C) ORG MOV DPTR,#STATE_TBL MOV R0,#0 ; R0 thị trạng thái LOOP: MOV A, R0 MOVC A,@A+DPTR MOV P2,A ACALL DELAY_1S INC R0 CJNE R0,#6,LOOP MOV R0,#0 SJMP LOOP STATE_TBL: DB 05H,06H,0AH,05H,0EH,02H END #include void delay_1s(); // cho trước CTC làm trễ giây void main() { char state[6]={0x05, 0x06, 0x0A, 0x05, 0x0E, 0x02}; char i; while(1) { for( i = 0; i < 6; i++) { P1 = state[i]; delay_1s(); } } } Kết thúc thi HK VXL_Đáp án đề Thi HK_AY1112-S2_trang 6/8 Phụ lục: Một số cách giải khác Câu 4: Dùng toàn CJNE Cách 2: Menu_R0: CJNE R0,#4,NEXT NEXT: JC CONT MOV R2,#0 RET CONT: CJNE R0,#0,R0NE0 CASE0: MOV A,R1 RL A RL A MOV R2,A RET ; Đặt tên nhãn R0NEX ; có nghĩa R0 X R0NE0: CJNE R0,#1,R0NE1 CASE1: MOV A,R1 CLR ACC.0 RR A CLR ACC.0 RR A MOV R2,A RET R0NE1: CJNE R0,#2,R0NE2 CASE2: MOV A,R1 CPL A INC A MOV R2,A RET R0NE2: CJNE R0,#3,DONE CASE3: MOV A,R1 SWAP A MOV R2,A DONE: RET R0NE1: CJNE R0,#2,R0NE2 CASE2: MOV A,R1 CPL A INC A MOV R2,A RET R0NE3: ; R0 > MOV R2,#0 RET Cách 3: Menu_R0: ; Đặt tên nhãn R0NEX ; có nghĩa R0 X CJNE R0,#0,R0NE0 CASE0: MOV A,R1 RL A RL A MOV R2,A RET R0NE0: CJNE R0,#1,R0NE1 CASE1: MOV A,R1 CLR ACC.0 RR A CLR ACC.0 RR A MOV R2,A RET R0NE2: CJNE R0,#3,R0NE3 CASE3: MOV A,R1 SWAP A MOV R2,A DONE: RET Câu 7: 1) Nhắc lại ghi SCON: Với 8051 phát nối tiếp (M1) với chế độ SCON nạp giá trị sau xem đúng: MOV MOV MOV MOV SCON,#01000000B SCON,#01000010B SCON,#01010000B SCON,#01010010B ; ; ; ; hoặc hoặc 40H 42H 50H 52H (không cho thu nối (không cho thu nối (cho thu nối tiếp) (cho thu nối tiếp) tiếp)và tiếp)và TI = TI = TI=1 TI=1 0 Với 8051 thu nối tiếp (M2) với chế độ SCON nạp giá trị sau xem đúng: MOV MOV SCON,#01010000B SCON,#01010010B ; 50H (cho thu nối tiếp)và TI = ; 52H (cho thu nối tiếp)và TI = 2) Nếu đặt SMOD lên gán trị cho TH1 với trị –12 MOV A,PCON SETB ACC.7 MOV PCON,A MOV TH1,#–12 VXL_Đáp án đề Thi HK_AY1112-S2_trang 7/8 Câu 9: LOOP: MOV P1,#05H ACALL DELAY_1S MOV P1,#06H ACALL DELAY_1S MOV P1,#0AH ACALL DELAY_1S MOV P1,#05H ACALL DELAY_1S MOV P1,#0EH ACALL DELAY_1S MOV P1,#02H ACALL DELAY_1S SJMP LOOP Hoặc cách khác dùng lệnh SETB CLR để thay đổi P1 (cách viết dài)! VXL_Đáp án đề Thi HK_AY1112-S2_trang 8/8 ... số BCD nén với 2K ký số với R0 trỏ đến byte thấp toán hạng 1, R1 trỏ đến byte thấp toán hạng 2, R2 chứa giá trị K, kết cất lại vào vùng nhớ toán hạng Câu 6: (1.5 đ) Cho trước mạch sau với chân... đọc liên tục giá trị cổng P0 dùng chương trình SS4bit để so sánh bit cao bit thấp P0 xuất kết cổng P1 Đầu đoạn chương trình ta phải gán trị SP stack cất liệu vào stack từ địa 30H Bài giải b) a)SS4bit:... trị nhỏ 64) Phép toán R2 R2 R2 R2 = = = = R1 * R1 / bù swap 4 R1 R1 SV không dùng lệnh MUL mà phải áp dụng dịch bit SV không dùng lệnh DIV mà phải áp dụng dịch bit R2 có trị hoán đổi bit thấp bit