Bài tập dài vi xử lý

Câu 10: Viết CT con đổi n ký tự thành chữ hoa (nếu đang là chữ thường). Biết chuỗi ký tự trong bộ nhớ có địa chỉ đầu trong R0 , độ dài trong R7. Bài làm: Giả thiết n nhỏ hơn 256, lưu tại R1. Bộ nhớ là RAM trong.

pdf11 trang | Chia sẻ: hao_hao | Lượt xem: 3090 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài tập dài vi xử lý, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
BÀI TẬP DÀI VI XỬ LÝ Họ tên: Đặng Đức Công. MSSV:20101181 Lớp: KSTN-ĐKTĐ-K55 Câu 1: Viết CT đếm số âm trong miền nhớ 100 byte từ ô nhớ 123H tại RAM ngoài Bài làm: Quy ước bit cao nhất(tức là bit 7) là bit dấu, và số âm có bit cao nhất bằng 1. Số các số âm đếm được lưu tại R1. Địa chỉ 123H là địa chỉ thấp nhất trong 100 byte kề nhau Chương trình: MAIN: MOV R0,#100 MOV DPTR,#123H MOV R1,#00 LOOP: MOVX A,@DPTR RLC A JC NHAY INC R1 NHAY: INC DPTR DJNZ R0,LOOP END START R0 #100 DPTR #123H R1 #00 A @DPTR RLC A C = 1? YES R1 += 1 DPTR += 1 R0 -= 1 NO R0 = 0? END YES NO Câu 2: Viết CT chuyển 2 mảng dữ liệu 10 byte. Biết mảng 1 có địa chỉ 1000H trong RAM ngoài và mảng 2 có địa chỉ 70H trong RAM trong. Bài làm: Quy ước 1000H và 70H là các địa chỉ thấp nhất của mỗi mảng 10 byte trong các RAM. Chương trình: MAIN: MOV R2,#10 MOV DPTR,#1000H MOV R0,#70H LOOP: MOVX A,@DPTR XCH A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R2,LOOP END START R2 #10 DPTR #1000H R0 #70 A @DPTR XCH A,@R0 @DPTR A R0 += 1 DPTR += 1 R2 -= 1 R2 = 0? END YES NO Câu 3: Viết CT cộng hai số BCD 4 chữ số trong RAM trong, kết quả cất vào sô thứ 2 . Biết số thứ 1 đặt tại ô nhớ 70H, và số thứ 2 đặt tại ô nhớ 60H. Bài làm: Quy ước 2 số BCD có byte thấp ứng với địa chỉ thấp. Kết quả cất vào số thứ 2, nếu kết quả có tràn sẽ cất vào byte 62H. Chương trình: MAIN: MOV R0,#70H MOV R1,#60H MOV R2,#2 CLR C LOOP: MOV A,@R0 ADDC A,@R1 DA A MOV @R1,A INC R0 INC R1 DJNZ R2,LOOP JNC EXIT MOV 62H,#1 EXIT: END START R0 #70H R1 #60H R2 #2 C #0 A @R0 A += (@R1+C) DA A @R1 A R0 += 1 R1 += 1 R2 -= 1 R2 = 0? NO YES C = 1? YES 62H #1 END NO Câu 4: Viết CT tính trung bình 10 byte trong Ram ngoài từ ô nhớ 1234H. Bài làm: Quy ước: Phép tính trung bình có thương trong R0, số dư trong R1. Địa chỉ 1234H là địa chỉ thấp nhất trong 10 byte kề nhau. Chương trình: MAIN: MOV DPTR,#1234H MOV R0,#00 MOV R1,#00 MOV R2,#10 LOOP: MOVX A,@DPTR MOV B,#10 DIV AB ADD A,R0 MOV R0,A MOV A,B ADD A,R1 MOV R1,A INC DPTR DJNZ R2,LOOP MOV A,R1 MOV B,#10 DIV AB ADD A,R0 MOV R0,A MOV R1,B END START DPTR #1234H R0 #00 R1 #00 R2 #10 A @DPTR B #10 DIV AB A += R0 R0 A A B A += R1 R1 A DPTR += 1 R2 -= 1 R2 = 0? NO YES A R1 B #10 DIV AB A += R0 R0 A R1 B END Câu 5: Viết CT sử dụng Timer tạo xung tần số 1Hz tại chân P1.0. Biết xung nhịp thạch anh 12MHz ( Ton =50%, Toff = 50%). Bài làm: Tần số 1Hz => T= 1s. Ton=Toff= 500.000us Sử dụng Timer0 chế độ 16 bit, thời gian 50000 gồm 10 lần. 15535D = 3CAFH Chương trình: MAIN: MOV TMOD,#00000001B SETB P1.0 LOOP: MOV R1,#10 LOOP1: MOV TH0,#3CH MOV TL0,#0AFH CLR TF0 SETB TR0 JNB TF0,$ CLR TR0 DJNZ R1,LOOP1 CPL P1.0 SJMP LOOP END START TMOD #00000001B P1.0 = 1 R1 #10 TH0 #3CH TL0 #0AFH TF0 = 0 TR0 = 1 TF0 = 0 YES N O R1 -= 1 TR0 = 0 R1 = 0 NO YES CPL P1.0 Câu 6: Viết CT tạo xung 10Hz tại chân P1.2. Biết xung nhịp thạch anh 12MHz (Ton =30% và Toff=70%). Bài làm: F=10Hz => T=100.000us Ton=30.000us. Toff=70.000us Sử dụng Timer0 chế độ 16 bit thời gian 10.000 Chương trình: 55535D = D8EFH MAIN: MOV TMOD,#00000001B SETB P1.2 ON: MOV R1,#3 SJMP LOOP OFF: MOV R1,#7 LOOP: MOV TH0,#0D8H MOV TL0,#0EFH CLR TF0 SETB TR0 JNB TF0,$ DJNZ R1,LOOP CPL P1.2 JB P1.2,ON SJMP OFF END START TMOD #00000001B P1.2 = 1 R1 #3 TH0 #0D8H TL0 #0EFH TF0 = 0 TR0 = 1 TF0 = 0 YES N O R1 -= 1 R1 = 0 NO YES CPL P1.0 R1 #7 P1.2 = 1 YES NO Câu 7: Viết CT con đọc 300 byte dữ liệu từ cổng nối tiếp và cất vào vùng nhớ có địa chỉ đầu 100H. Biết cổng nối tiếp đã được khởi tạo sẵn, cổng cho phép đọc khi cờ RI =1, và cờ RI sẽ tự xóa khi đọc xong 1 byte. Bài làm: Vùng nhớ là RAM ngoài COUNT: MOV R0,#100 MOV R1,#03 MOV DPTR,#100H LOOP: JNB RI,$ MOV A,SBUF MOVX @DPTR,A CLR RI INC DPTR DJNZ R0,LOOP MOV R0,#100 DJNZ R1,LOOP RET COUNT R0 #100 R1 #3 DPTR #100H RI = 0? YES NO A SBUF @DPTR A RI = 0 DPTR += 1 R0 -= 1 R0 = 0? NO YES R0 #100 R1 -= 1 R1 = 0? RET YES NO Câu 8: Viết CT điều khiển đèn giao thông tại 1 ngã tư theo yêu cầu sau: Biết điều khiển 0 là đèn sáng , 1 là đèn tắt. Bài làm: Chương trình chính: MAIN: MOV A,#25 MOV P1,#11011110B LCALL DELAY_A MOV A,#3 MOV P1,#11011101B LCALL DELAY_A MOV A,#33 MOV P1,#11110011B LCALL DELAY_A MOV A,#3 MOV P1,#11101011B LCALL DELAY_A SJMP MAIN DELAY_A: MOV TMOD,#01H ;trễ A giây CLR TF0 LOOP: MOV R2,#16 LOOP1: MOV TH0,#0BH MOV TL0,#0DCH SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 DJNZ R2,LOOP1 DJNZ 0E0H,LOOP ;thanh ghi A có địa chỉ E0 RET DELAY_A TMOD #01H TF0 = 0 R1 #16 TH0 #0BH TL0 #0DCH TR0 = 1 TF0 = 0? YES NO TR0 = 0 TF0 = 0 R1 -= 1 R1 = 0? NO YES A -= 1 A = 0? NO RET YES START XANH1 1 DO2 1 A #25 LCALL DELAY_A DO2 1 VANG1 1 A #3 LCALL DELAY_A XANH2 1 DO1 1 A #33 LCALL DELAY_A DO1 1 VANG2 1 A #3 LCALL DELAY_A Câu 9: Viết CT hiển thị trên 2 LED 7 thanh đếm lùi từ 20s với sơ đồ phần cứng SV tự đề xuất. Sử dụng Port2 của VĐK làm port dữ liệu, và 2 chân P3.0 và P3.1 điều khiển quét LED. TIME EQU 20 ON EQU 4 COUNT EQU 125; lặp để đủ quét trong 1s ORG 0000H MAIN: MOV R0,#TIME DEM_LUI: MOV R1,#COUNT LCALL HIEN_THI DJNZ R0,DEM_LUI SJMP MAIN HIEN_THI: MOV A,R0 MOV B,#10 DIV AB LCALL GIAI_MA X112Mhz XTAL2 18 XTAL1 19 ALE 30 EA 31 PSEN 29 RST 9 P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32 P1.0 1 P1.1 2 P1.2 3 P1.3 4 P1.4 5 P1.5 6 P1.6 7 P1.7 8 P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WR 16 P3.5/T1 15 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 U1 AT89C51 C1 33nF +5V +5V C2 33nF R1 10k 470 470 470 470 470 470 470 470 R103.3k R113.9k R123.3k R133.9k C310uF MAIN R0 #TIME R1 #COUNT CALL HIEN_THI R0 -= 1 R0 = 0? NO YES MOV P2,A SETB P3.0 MOV A,#ON LCALL DELAY_A_MS CLR P3.0 MOV A,B LCALL GIAI_MA MOV P2,A SETB P3.1 MOV A,#ON LCALL DELAY_A_MS CLR P3.1 DJNZ R1,HIEN_THI RET DELAY_A_MS: MOV TMOD,#01H LOOP: CLR TF0 MOV TH0,#0FCH MOV TL0,#18H SETB TR0 JNB TF0,$ CLR TR0 DJNZ 0E0H,LOOP ;thanh ghi A có địa chỉ E0 RET GIAI_MA: MOV DPTR,#MA_SO MOVC A,@A+DPTR RET MA_SO: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END GIẢI MÃ DPTR #MA_SO A @A+DPTR RET DELAY_A_MS TMOD #01H TF0 = 0 TH0 #0FCH TL0 #018H TR0 = 1 TF0 = 0? RET NO YES A = 0? NO YES HIEN_THI A R0 B #10 DIV AB CALL GIAI_MA P2 A P3.0 = 1 A #ON CALL DELAY_A_MS P3.0 = 0 A B CALL GIAI_MA P2 A P3.1 = 1 A #ON CALL DELAY_A_MS P3.1 = 0 R1 -= 1 R1 = 0? NO RET YES Câu 10: Viết CT con đổi n ký tự thành chữ hoa (nếu đang là chữ thường). Biết chuỗi ký tự trong bộ nhớ có địa chỉ đầu trong R0 , độ dài trong R7. Bài làm: Giả thiết n nhỏ hơn 256, lưu tại R1. Bộ nhớ là RAM trong. TO_UPPER: MOV A,@R0 LCALL TEST JNC NOT_LOWER1 SUBB A,#20H MOV @R0,A NOT_LOWER1:INC R0 DJNZ R7, TO_UPPER RET TEST: ; INPUT: A, OUTPUT: C=1 IF A IS LOWER. SETB C CJNE A,#122,NOT_EQ1 SETB C SJMP EXIT NOT_EQ1: JNC EXIT ; A < z? CLR C CJNE A,#97,NOT_EQ2 SETB C SJMP EXIT NOT_EQ2: JC NOT_LOWER2 ; a < A < z? SETB C SJMP EXIT NOT_LOWER2: CLR C ;𝐴 ∉ (𝑎, 𝑧) SJMP EXIT EXIT: RET TEST C = 1 A = #122? NO C = 0? NO C = 0 A = #97? NO C = 1? NO C = 1 RET YES YES YES C = 0 YES TO_UPPER A @R0 LCALL TEST C = 1? YES A (A-#20H) @R0 A R0 += 1 R7 -= 1 NO R7 = 0? NO RET YES

Các file đính kèm theo tài liệu này:

  • pdfbai_tap_dai_vi_xu_ly_cong_4717.pdf
Tài liệu liên quan