1. Trang chủ
  2. » Tất cả

132-VXL-Thi-Đáp án

8 1 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

ĐHQG TPHCM–ĐH Bách Khoa Khoa Đ-ĐT–BM Điện Tử GV soạn đáp án: Hồ Trung Mỹ Điểm Đáp án Đề thi HK – NH:2013-2014 Chữ ký giám thị 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ó trang (có trang tóm tắt) SV làm trực tiếp đề Tổng số câu 10, tổng số điểm 11, SV cần làm đạt 10 (SV KHÔNG dùng tài liệu; SV KHÔNG dùng ĐTDĐ, Laptop, iPad PC Tablet) Họ tên SV: MSSV: Nhóm: Bộ mơn Điện Tử duyệt GV đề Hồ Trung Mỹ Xem phụ lục để biết số cách giải khác Câu 1: (1 đ) Cho trước mạch giải mã địa hệ thống dùng VXL 8051: a) (0.5 đ) Xác định vùng địa SRAM:  Vùng địa SRAM thứ (U1): A000H – A7FFH  Vùng địa SRAM thứ hai (U2): B800H – BFFFH b) (0.5đ) Viết lệnh 8051 để chép khối liệu 10 byte địa đầu SRAM thứ (U1) vào 10 byte SRAM thứ hai: MOV DPL,#0 Cách 2: dùng CJNE MOV Loop: MOV MOVX MOV MOVX INC DJNZ SJMP R1.#10 DPH,#0A0H A,@DPTR DPH,#0B8H @DPTR,A DPL R1,Loop $ MOV MOV Loop: MOV MOVX MOV MOVX INC CJNE SJMP VXL_Thi HK_AY1314-S2_trang 1/8 DPL,#0 R0,#11 DPH,#0A0H A,@DPTR DPH,#0B8H @DPTR,A DPL R0,#11,Loop $ Câu 2: (1.5 đ) Điền vào chỗ trống cột địa ROM chương trình, mã máy cách địa chỉ: Cách định địa toán hạng Địa Mã máy (hex) Lệnh 8051 ROM (hex) thứ thứ hai ORG 0000 78 30 MOV R0,#30H 0002 E6 MOV A,@R0 Hiểu ngầm Gián tiếp 0003 F9 MOV R1,A Trực tiếp Tức thời 0004 75 F0 00 MOV B,#0 0007 08 Loop: INC R0 0008 E6 MOV A,@R0 0009 70 02 JNZ Skip 000B 05 F0 INC B 000D D9 F8 Skip: DJNZ R1, Loop END Câu 3: (1 đ) a) (0.5 đ) Viết chương trình hợp ngữ 8051 có tên Is_LC để kiểm tra xem nội dung ghi A có thuộc dải ký tự chữ in thường (‘a’ đến ‘z’) cờ C = 1, ngược lại cờ C = (‘a’ = 61H ‘z’= 7AH) b) (0.5 đ) Viết đoạn chương trình hợp ngữ 8051 để đọc chuỗi ký tự đặt nhớ chương trình địa 100H, chuỗi ký tự kết thúc ký tự NULL (=0) cất vào RAM nội 8051 từ địa 30H; lần đọc ký tự dùng chương trình Is_LC để kiểm tra, cờ C = đổi ký tự sang chữ in hoa.(“A’ = 41H ‘Z’ = 5AH) TD: Chuỗi “AbCde!”,0 RAM nội chứa “ABCDE!”,0 Bài giải a) b) Is_LC: MOV R0,#30H INC R0 CNJE A,#’a’,$+3 MOV DPTR,#Str INC DPTR JC Outside Loop: CLR A SJMP Loop CNJE A,#’z’+1,$+3 MOV A,@A+DPTR MOV @R0,A JC Outside JZ Finish SJMP $ SETB C ACALL Is_LC ORG 100H RET JNC Skip Str: DB “AaBcDe!”,0 Outside: CLR C ADD A,#’A’–‘a’ RET Skip: MOV @R0,A Câu 4: (1 đ) Xét 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 ORG EQU EQU EQU EQU EQU MOV Loop: MOV ORL ANL W X Y Z F P1.0 P1.1 P1.2 P1.3 P1.7 P1,#0FH C,X C,/W C,Y CPL MOV MOV JB CPL Skip: C F0,C C,Z Y,Skip C ORL C,F0 MOV F,C SJMP Loop END VXL_Thi HK_AY1314-S2_trang 2/8 Câu 5: (1 đ) Hãy hồn tất chương trình hợp ngữ 8051 sau dựa theo thích kèm lệnh: (giả sử cho trước chương trình OUTPUT xuất nội dung R1 mạch hiển thị) Loop: SW1: SW2: Display: ORG MOV MOV MOV MOV 200H SP,#4FH P1,#3 R1,#0 A,P1 JNZ MOV SW1 R1,A SJMP JB INC Display P1.0,SW2 R1 SJMP JB DEC Display P1.1,SW_ALL R1 SJMP ACALL Display OUTPUT ; Chương trình địa 200H ; nạp trị cho SP để stack bắt đầu cất từ địa 50H ; đặt cấu hình để chân P1.0 P1.1 chân nhập ; xóa ghi R1 ; A  P1 ; Nếu A khác zero nhảy đến nhãn SW1 ; R1  A ; nhảy đến nhãn Display ; P1.0 = nhảy đến nhãn SW2 ; R1  R1 + ; nhảy đến nhãn Display ; P1.1 = nhảy đến nhãn Loop ; R1  R1 – ; nhảy đến nhãn Display ; gọi chương trình OUPUT Câu 6: (1 đ) Cho trước mạch sau với ngõ P0 8051 lái LED đoạn loại CA: Mạch hoạt động sau: P1.0 = Count = có cạnh xuống giá trị hiển thị LED tăng thêm (giá trị đầu 1) Chuỗi số hiển thị LED đoạn tương tự đếm lên (số lẻ) có cạnh xuống liên tục P1.0: 1, 3, , 7, 9, 1, 3, a) (0.5 đ) Viết chương trình BCD2LED7S hiển thị ký số BCD ghi A LED đoạn Nội dung ghi A không bị thay đổi sau gọi chương trình b) (0.5 đ) Viết chương trình làm việc theo yêu cầu dùng ghi A chứa số đếm dùng chương trình BCD2LED7S để hiển thị Bài giải a) BCD2LED7S: PUSH ACC;=MOV R1,A MOV DPTR,#LED7S MOVC A,@A+DPTR MOV P0,A POP ACC;= MOV A,R1 RET ; định nghĩa hiển thị ORG 100H LED7S: ; hgfedcba DB 11000000B; DB 11111001B; DB 10100100B; DB 10110000B; DB 10011001B; DB 10010010B; DB 10000010B; DB 11111000B; DB 10000000B; DB 10010000B; b) Count EQU P1.0 MOV P1,#01H MOV A,#1 Loop: ACALL BCD2LED7S JNB Count,$;đợi =1 JB Count,$;đợi =0 ADD A,#2; = lần INC A CJNE A,#11,Loop MOV A,#1 SJMP Loop VXL_Thi HK_AY1314-S2_trang 3/8 Câu 7: (1.5 đ) Xét 8051 với XTAL = 12 MHz ta muốn có sóng tuần hồn sau chân P1.0 P1.1: P1.0 1s 1.75s P1.1 a) (0.75 đ) Hãy viết chương trình tạo dạng sóng dùng Timer (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 dùng ngắt Timer Bài giải a) CT hỏi vòng cờ TF0: ; 1s=20x50k us, 1.75s=35x50k us ORG MOV TMOD,#1 CLR C ; dùng F0 CLR P1.0 SETB P1.1 Loop: JC Case_2 MOV R1,#20 SJMP T0_Loop Case_2: MOV R1,#35 T0_Loop: MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–50000) SETB TR0 JNB TF0,$ CLR TR0 DJNZ R1,T0_Loop CPL C CPL P1.0 CPL P1.1 SJMP Loop b) CT dùng ngắt Timer 0: ORG LJMP Main ORG 0BH LJMP T0_ISR Main: MOV TMOD,#1 CLR C ; cờ F0 CLR P1.0 SETB P1.1 MOV R1,#21 MOV IE,#82H SETB TF0 SJMP $ T0_ISR: DJNZ R1,Skip CPL C CPL P1.0 CPL P1.1 MOV R1,#21 JNC Next MOV R1,#36 Next: SETB TR0 RETI Skip: CLR TR0 MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–50000) SETB TR0 RETI Câu 8: (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 byte RAM nội từ địa 50H (mỗi byte số BCD nén có ký số) gửi nối tiếp byte số đến M2, M2 có nhiệm vụ nhận nối tiếp byte này, lần nhận byte đổi ký số BCD ký tự ASCII tương ứng(‘0’ = 30H) xuất số BCD hàng chục cổng P1 BCD hàng đơn vị cổng P0 Thí dụ M1 gửi byte có giá trị 25H (biểu diễn BCD nén số 25) ngõ M2 đó: P1 = ‘2’ = 32H P0 =’5’= 35H Cả VXL sử dụng cổng nối tiếp có tốc độ baud 2400 XTAL = 11.059 MHz Chú ý ta không dùng ngắt nối tiếp mà hỏi vòng RI TI VXL_Thi HK_AY1314-S2_trang 4/8 Thi VXL_AY1314 – Họ tên SV: MSSV: Nhóm: Bài giải Các chương trình gửi/nhận Chương trình 8051 M1 Chương trình 8051 M2 byte nối tiếp ORG ; Khởi động Timer để ; có tốc độ baud 2400 MOV TMOD,#20H MOV TH1,#–12 SETB TR1 ; Đặt cấu hình phát MOV SCON,#01000010B MOV R0,#50H MOV R1,#5 M1_Loop: MOV A,@R0 ACALL SP_TRANSMIT INC R0 DJNZ R1,M1_Loop SJMP $ ; Có thể dùng CJNE ; MOV R0,#50H ; M1_Loop: ; MOV A,@R0 ; ACALL SP_TRANSMIT ; INC R0 ; CJNE R0,#55H,M1_Loop ORG SP_TRANSMIT: ; Khởi động Timer để ; có tốc độ baud 2400 MOV TMOD,#20H MOV TH1,#–12 SETB TR1 ; Đặt cấu hình thu MOV SCON,#01010000B MOV R1,#5 M2_Loop: ACALL SP_RECEIVE MOV B, A ANL A,#0FH ORL A,#30H MOV P1,A MOV A, B SWAP A ANL A,#0FH ORL A,#30H MOV P0,A SJMP L2 DJNZ R1,M2_Loop SJMP $ JNB CLR MOV RET TI, $ TI SBUF, A SP_RECEIVE: JNB CLR MOV RET RI, $ RI A, SBUF Câu 9: (1 đ) Viết chương trình hợp ngữ 8051 (XTAL=12MHz) dùng ngắt ngồi sau::  Trong chương trình liên tục xuất nội dung ghi R1 (gán trị đầu 0) cổng P1  Nếu có cạnh xuống chân ngắt ngồi (/INT0)  R1 = R1 + lớn xóa  Nếu có cạnh xuống chân ngắt (/INT1)  R1 = R1 + lớn R1 = R1 – 10 Giả sử xung kích cạnh xuống ngõ /INT0 /INT1 không xảy đồng thời Bài giải ORG LJMP Main LJMP EX0_ISR ORG 0013H LJMP EX1_ISR Main: MOV R1,#0 SETB P3.2 ; /INT0 SETB P3.3 ; /INT1 SETB IT0 SETB IT1 MOV IE,#85H Loop: MOV P1,R1 ; ADD #,–10 tương đương với ; CLR C ; SUBB A,#10 EX0_ISR: Reset_1: EX1_ISR: Reset_2: INC R1 CJNE R1,#10,$+3 JNC Reset_1 RETI MOV R1,#0 RETI INC R1 INC R1 CJNE R1,#10,$+3 JNC Reset_2 RETI MOV A,R1 ADD A,#–10 MOV R1,A RETI END VXL_Thi HK_AY1314-S2_trang 5/8 Câu 10: (1 đ) Viết chương trình hợp ngữ C (chỉ chọn một) cho 8051 để thực phép tính sau theo nội dung đọc từ cổng P0 (nếu P0 > cổng xuất P3 = 0) P0 Phép toán P3 = P1 + P2 P3 = P1 – P2 P3 = max(P1, P2) P3 = bù P1 Sau thực xong phép tốn đợi 200 ms tiếp tục đọc lại P0 thực bảng hoạt động trên.Công việc thực liên tục Giả sử cho trước chương trình Delay_200ms (làm trễ 200 ms) Bài giải Cách 1: Chương trình hợp ngữ ORG MOV A,#0FFH MOV P0,A MOV P1,A MOV P2,A Loop: MOV A,P0 MOV R1,A MOV A,P1 CJNE R1,#0,NE_0 ADD A,P2 SJMP Output NE_0: CJNE R1,#1,NE_1 CLR C SUBB A,P2 SJMP Output NE_1: CJNE R1,#2,NE_2 CJNE A,P2,$+3 JNC Output MOV A,P2 SJMP Output NE_2: CJNE R1,#3,NE_3 CPL A INC A SJMP Output NE_3: MOV A,#0 Output: MOV P3,A ACALL Delay_200ms SJMP Loop Cách 1: Chương trình C #include void Delay_200ms(); main() { unsigned char x, y , v1, v2; P0 = 0xFF; P1 = 0xFF; P2 = 0xFF; while(1) { x = P0; v1 = P1; v2 = P2; switch(x){ case 0: y = v1 + v2; Break; case 1: y = v1 - v2; break; case 2: y = v1 > v2? v1:v2; break; case 3: y = -v1; break; default: y = 0; break; } P3 = y; Delay_200ms(); } } Kết thúc thi VXL_Thi HK_AY1314-S2_trang 6/8 Phụ lục – Cách giải khác Câu 1: Cách 3: MOV MOV MOV Loop: MOV MOVX MOV MOVX INC DJNZ SJMP Cách 4: R1,#10 R2,#0A0H R3,#0B8H DPH,R2 A,@DPTR DPH,R3 @DPTR,A DPL R1,Loop $ MOV MOV MOV MOV MOV Loop: MOV MOV MOVX INC MOV MOV MOV MOV MOVX INC MOV MOV DJNZ SJMP R0,#10 R1,#0A0H R2,#0 R3,#0B8H R4,#0 ; = MOV R4,2 DPH,R1 DPL,R1 A,@DPTR DPTR R1,DPH R2,DPL DPH,R3 DPL,R4 @DPTR,A DPTR R3,DPH R4,DPL R0,Loop $ Câu 3: Cách 2: org 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 $ Câu 4: W X Y Z F Cách 2: EQU EQU EQU EQU EQU MOV Loop: MOV MOV ORL ANL CPL MOV MOV JB CPL Skip: ORL MOV SJMP END B.0 B.1 B.2 B.3 P1.7 P1,#0FH B,P1 C,X C,/W C,Y C F0,C C,Z Y,Skip C C,F0 F,C Loop Is_Lower_Case: ; kiem tra xem neu A thuoc 'a' den 'z' thi co C = 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ách 3: ; Dùng byte có địa 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 VXL_Thi HK_AY1314-S2_trang 7/8 Câu 7: Cách 2: a) CT hỏi vòng cờ TF0: ; 1s=20x50k us, 1.75s=35x50k us ORG MOV TMOD,#1 CLR P1.0 SETB P1.1 Loop: JNB P1.0,Case_2 MOV R1,#20 SJMP T0_Loop Case_2: MOV R1,#35 T0_Loop: MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–50000) SETB TR0 JNB TF0,$ CLR TR0 DJNZ R1,T0_Loop CPL P1.0 CPL P1.1 SJMP Loop Câu 8: Cách 2: ASM ORG MOV A,#0FFH MOV P0,A MOV P1,A MOV P2,A Loop: MOV A, P0 MOV R0, A MOV R1, P1 MOV R2, P2 CJNE A, #4, $+3 JC Menu_A MOV A,#0 SJMP Output Menu_A: MOV DPTR,#JMPTAB RL A JMP @A+DPTR JMPTAB: AJMP P0_eq_0 AJMP P0_eq_1 AJMP P0_eq_2 AJMP P0_eq_3 b) CT dùng ngắt Timer 0: ORG LJMP Main ORG 0BH LJMP T0_ISR Main: MOV TMOD,#1 CLR P1.0 SETB P1.1 MOV R1,#21 MOV IE,#82H SETB TF0 SJMP $ T0_ISR: DJNZ R1,Skip CPL P1.0 CPL P1.1 MOV R1,#21 JB P1.0,Next MOV R1,#36 Next: SETB TR0 RETI Skip: CLR TR0 MOV TL0,#LOW(–50000) MOV TH0,#HIGH(–50000) SETB TR0 RETI Cách 2: C P0_eq_0: MOV A, R1 ADD A, R2 SJMP Output P0_eq_1: MOV A, R1 CLR C SUBB A,R2 SJMP Output P0_eq_2: MOV A, R1 CJNE A, 02H, $+3 JNC Output MOV A,R2 SJMP Output P0_eq_3: MOV A, R1 CPL A INC A Output: MOV P3,A ACALL Delay_200ms SJMP Loop #include void Delay_200ms(); main() { unsigned char x, y, v1, v2; P0 = 0xFF; // P0, P1, P2 P1 = 0xFF; // cổng nhập P2 = 0xFF; while(1) { x = P0; v1 = P1; v2 = P2; if (x == 0) y = v1 + v2; if (x == 1) y = v1 - v2; if (x == 2) y = v1 > v2? v1:v2; if (x == 3) y = -v1; if (x > 3) y = 0; P3 = y; Delay_200ms(); } // end of while } // end of main VXL_Thi HK_AY1314-S2_trang 8/8 ... trình, mã máy cách địa chỉ: Cách định địa toán hạng Địa Mã máy (hex) Lệnh 8051 ROM (hex) thứ thứ hai ORG 0000 78 30 MOV R0,#30H 0002 E6 MOV A,@R0 Hiểu ngầm Gián tiếp 0003 F9 MOV R1,A Trực tiếp Tức... hợp ngữ 8051 (XTAL=12MHz) dùng ngắt sau::  Trong chương trình liên tục xuất nội dung ghi R1 (gán trị đầu 0) cổng P1  Nếu có cạnh xuống chân ngắt ngồi (/INT0)  R1 = R1 + lớn xóa  Nếu có cạnh... cho 8051 để thực phép tính sau theo nội dung đọc từ cổng P0 (nếu P0 > cổng xuất P3 = 0) P0 Phép toán P3 = P1 + P2 P3 = P1 – P2 P3 = max(P1, P2) P3 = bù P1 Sau thực xong phép tốn đợi 200 ms tiếp

Ngày đăng: 24/12/2018, 11:34

w