Bài tập Vi xử lý - Chương 3 - Hồ Trung Mỹ

Phần 1 – Tóm tắt phần cứng
1.1 Kể tên các nhà sản xuất khác (ngoài Intel) có chế tạo MCU 8051?
1.2 Ta sử dụng lệnh gì để đặt LSB của byte ở địa chỉ 25H lên 1?
1.3 Hãy viết các lệnh dùng để OR các bit có địa chỉ là 00H và 01H, kết quả cất vào bit có địa chỉ 02H?
1.4 Sau khi thực thi các lệnh sau thì những bit nào có giá trị 1?
MOV R0, #26H
MOV @R0, #7AH
1.5 Hãy tìm lệnh 1 byte có cùng hiệu ứng như lệnh 2 byte sau:
MOV 0E0H, #55H 
pdf 17 trang thamphan 28/12/2022 2620
Bạn đang xem tài liệu "Bài tập Vi xử lý - Chương 3 - Hồ Trung Mỹ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_tap_vi_xu_ly_chuong_3_ho_trung_my.pdf

Nội dung text: Bài tập Vi xử lý - Chương 3 - Hồ Trung Mỹ

  1. ĐHBK Tp HCM–BMĐT GVPT: Hồ Trung Mỹ Bài tập Vi Xử Lý – Chương 3 Bài tập trong chương này được chia làm 7 phần: Tóm tắt phần cứng (3.1+3.2), Tập lệnh (3.3+3.4), Timer (3.5), Cổng nối tiếp (3.6), Ngắt (3.7), Assembler (3.8) và tổng hợp. Phần 1 – Tóm tắt phần cứng 1.1 Kể tên các nhà sản xuất khác (ngoài Intel) có chế tạo MCU 8051? 1.2 Ta sử dụng lệnh gì để đặt LSB của byte ở địa chỉ 25H lên 1? 1.3 Hãy viết các lệnh dùng để OR các bit có địa chỉ là 00H và 01H, kết quả cất vào bit có địa chỉ 02H? 1.4 Sau khi thực thi các lệnh sau thì những bit nào có giá trị 1? MOV R0, #26H MOV @R0, #7AH 1.5 Hãy tìm lệnh 1 byte có cùng hiệu ứng như lệnh 2 byte sau: MOV 0E0H, #55H 1.6 Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H. 1.7 Có bao nhiêu thanh ghi chức năng đặc biệt được định nghĩa trong 8051, 8052? 1.8 Sau khi reset hệ thống, giá trị của SP của 8051 là bao nhiêu? 1.9 Ta có thể sử dụng lệnh gì để khởi tạo trị cho SP của 8031 để tạo stack 64 byte ở đỉnh của RAM nội? 1.10 Một chương trình con sử dụng các thanh ghi R0-R7 mở rộng. Hãy minh họa làm cách nào chương trình con này chuyển sang sử dụng các thanh ghi R ở bank 3 khi vào chương trình con này và trả lại bank thanh ghi cũ khi kết thúc chương trình con đó? 1.11 MCU 80C31BH–1 hoạt động với thạch anh 16MHz nối vào các ngõ vào XTAL1 và XTAL2 của nó. Nếu không có sử dụng lệnh MOVX, tần số của tín hiệu ALE là bao nhiêu? 1.12 8051 được sử dụng với thạch anh 4MHz, khi đó chu kỳ máy là bao nhiêu? 1.13 Chu kỳ nhiệm vụ của ALE là bao nhiêu? Giả sử phần mềm không truy cập RAM ngoài. (chú ý là chu kỳ nhiệm vụ = chu kỳ bổn phận = chu kỳ làm việc = duty cycle = thời gian ON / chu kỳ của tín hiệu) 1.14 Ta biết rằng 8051 bị reset nếu chân RST được giữ ở mức cao trong tối thiểu 2 chu kỳ máy. (chú ý là với đặc tính DC của 8051 thì mức cao ở RST tối thiểu là 2.5V) a) Nếu 8051 hoạt động với thạch anh 8MHz, khoảng thời gian tối thiểu giữ cho RST ở mức cao để reset hệ thống là bao nhiêu? b) Hình 2-15a cho thấy mạch RC dùng để reset bằng tay. Trong khi đang ấn nút reset thì RST=5V và hệ thống được giữ ở trạng thái reset. Như vậy sau khi nút reset được nhả ra thì 8051 sẽ vẫn giữ ở trạng thái reset trong bao lâu? 1.15 Chân cổng P1.7 (chân 8) có thể lái được bao nhiêu tải Schottky công suất thấp (LS)? 1.16 Liệt kê các tín hiệu điều khiển bus của 8051 để chọn các EPROM ngoài và các RAM ngoài. 1.17 Địa chỉ bit của MSB của byte ở địa chỉ 25H trong vùng dữ liệu nội của 8051 là bao nhiêu? 1.18 Hãy liệt kê những lệnh dùng để đặt LSB của thanh ghi tích lũy lên 1 mà không ảnh hưởng 7 bit khác? 1.19 Giả sử lệnh sau vừa được thực thi: MOV A, #55H Giá trị của bit P trong PSW là bao nhiêu? 1.20 Hãy viết các lệnh dùng để sao chép nội dung của R7 vào ô nhớ 100H ở RAM ngoài. 1.21 Giả sử ta đang dùng bank 0, hãy ghi các giá trị trong RAM nội của 8051 sau khi thực thi đoạn mã sau: MOV R4, #32H MOV R0, #12H MOV R7, #3FH MOV R5, #55H 1.22 Sau khi cấp điện cho VXL, hãy cho biết bằng cách nào chọn bank 2 bằng một lệnh. 1.23 Giả sử lệnh thứ nhất được thực thi sau khi reset hệ thống là gọi chương trình con. Nội dung của PC được cất ở những địa chỉ nào trong RAM nội trước khi rẽ nhánh chương trình? 1.24 Sự khác biệt giữa chế độ nghỉ (idle) và chế độ tắt nguồn? 1.25 Lệnh gì dùng để đưa 8051 vào chế độ tắt nguồn? 1.26 Tất cả các thanh ghi R0–R7 rộng bao nhiêu bit? Phần lớn các thanh ghi trong 8051 rộng bao nhiêu bit? Kể tên các thanh ghi 16 bit trong 8051. 1.27 Bit P của PSW là bao nhiêu sau khi thực thi mỗi lệnh sau: BT-VXL-Ch 3 – trang 1
  2. 2.14 Tại một chỗ trong chương trình, nếu ta muốn chương trình rẽ nhánh đến nhãn EXIT nếu thanh ghi A bằng mã ASCII của “carriage return”. Thì ta phải sử dụng (những) lệnh gì? 2.15 Lệnh SJMP BACK ở bộ nhớ chương trình tại địa chỉ 0100H và 0101H, và nhãn BACK tương ứng với lệnh ở địa chỉ 00AEH. Những byte mã máy (dạng số hex) của lệnh này là gì? 2.16 Lệnh sau thực hiện gì ? SETB 0D7H Có cách nào tốt hơn thực hiện cùng tác vụ này? Tại sao? 2.17 Sự khác biệt giữa 2 lệnh sau là gì? INC A INC ACC 2.18 Hãy viết những byte mã máy cho lệnh sau LJMP ONWARD nếu nhãn ONWARD biểu diễn lệnh ở địa chỉ 0A0F6H. 2.19 Giả sử thanh ghi tích lũy A chứa 5AH. Nội dung trong thanh ghi A là gì sau khi thực thi lệnh: XRL A, #0FFH 2.20 Giả sử PSW chứa 0C0H và thanh ghi A chứa 50H trước khi thực thi lệnh RLC A. Nội dung của thanh ghi A sau khi thực thi lệnh trên là bao nhiêu? 2.21 Hãy viết (các) lệnh tương đương để thực hiện: a) Xóa nội dung thanh ghi A b) Lấy bù 1 giá trị ở thanh ghi A và cất lại vào A 2.22 Hãy viết các lệnh thực hiện: a) Chia nguyên nôïi dung của A cho 16 (giả sử A < 256). b) Nhân nguyên nội dung của A cho 8 (giả sử A <32). 2.23 Nội dung của thanh ghi A là bao nhiêu sau khi 8051 thực hiện các lệnh sau: a) MOV A, #15H c) MOV A, #15 e) MOV A, #7FH MOV R2, #13H MOV R5, #15 MOV 50H, #29H ADD A, R2 ADD A, R5 MOV R0, #50H b) MOV R4, #25H d) MOV A, #25 XCHD A, @R0 MOV A, #1FH MOV R7, #18H ADD A, R4 ADD A, R7 2.24 Hãy viết mã máy cho các đoạn chương trình trong 2.23, giả sử là đang sử dụng bank thanh ghi 0. 2.25 Các lệnh nào không hợp lệ trong các lệnh sau? 1) MOV R3, #500 5) MOV R1, #50 9) MOV A, #255H 13) MOV R7, #00 2) MOV A, #50H 6) MOV A, #F5H 10) ADD R3, #50H 14) MOV R9, #50H 3) ADD A, R5 7) ADD A, #50H 11) ADD A, #F5H 15) ADD R7, R4 4) ADD R3, A 8) ADD A, #255H 12) MOV A, @R3 16) PUSH A 2.26 Mỗi lệnh sau chiếm bao nhiêu byte và thực hiện trong bao lâu (giả sử XTAL 12MHz): a) MOV A, #55H e) MOV A, R1 b) MOV R3, #3 f) MOV R3, A c) INC R2 h) ADD A, R2 d) ADD A, #0 i) MOVX A, @DPTR 2.27 Giá trị của cờ CY sau đoạn mã sau: a) CLR C b) MOV A, #54H c) MOV A, #00 d) MOV A, #250 CPL C ADD A, #0C4H ADD A, #0FFH ADD A, #05 2.28 Viết các đoạn chương trình 8051: a) Điền giá trị 48H vào các ô nhớ trong RAM nội từ địa chỉ 40H đến 89H bằng cách dùng lệnh định địa chỉ gián tiếp và vòng lặp. b) Xóa 20 ô nhớ trong RAM nội với địa chỉ bắt đầu là 80H. c) Sao chép 10 ô nhớ từ RAM nội có địa chỉ đầu là 35H đến vùng nhớ khác có địa chỉ đầu là 60H. 2.29 Viết chương trình cộng 2 số 16 bit. Các số là 3CE7H và 3B8DH. Đặt byte cao của tổng ở R7 và byte thấp của tổng ở R6. 2.30 Viết các lệnh 8051 để thực hiện các tác vụ sau: a) Chuyển giá trị dữ liệu 55H vào cổng 1 b) Đặt bit 3 của Port 3 lên 1 c) Cộng dữ liệu ở địa chỉ được chứa trong R0 vào thanh ghi tích lũy. d) So sánh dữ liệu trong R0 với giá trị 10H và nhảy đến nhãn Label1 nếu chúng khác nhau. BT-VXL-Ch 3 – trang 3
  3. Đoạn chương trình có trả lại các trị cũ cho các thanh ghi R0, R3, và R7 không? Nếu không thì phải đổi gì để lưu lại giá trị. 2.36 Hãy viết các lệnh dùng để tạo ra xung xuống mức thấp trong 5 μs ở P1.7? Giả sử P1.7 ban đầu ở mức cao và 8051 làm việc với thạch anh 12MHz. 2.37 Viết chương trình tạo ra sóngvuông 83.3KHz ở P1.0 (giả sử hoạt động 12MHz). 2.38 Viết chương trình tạo ra xung mức cao trong 4 μs ở chân P1.7 cứ sau 200 μs. 2.39 Viết các chương trình để cài đặt các phép toán logic như ở hình E.3-1. Hình E.3-1. Các bài toán lập trình logic: (a) NOR 3 ngõ vào; (b) NAND 8 ngõ vào; và (c) Phép toán logic dùng 3 cổng. 2.40 Với hình E.3-1(a), thời gian trì hoãn truyền trường hợp xấu nhất từ lúc có chuyển tiếp ở ngõ vào đến lúc có chuyển tiếp ở ngõ ra là bao nhiêu? 2.41 Sau khi thực thi nhóm lệnh sau, nội dung của thanh ghi A là bao nhiêu? MOV A, #7FH MOV 50H, #29H MOV R0, #50H XCHD A, @R0 2.42 Hãy viết những byte mã máy cho lệnh sau? SETB P2.6 2.43 Ta phải sử dụng những lệnh gì để chép cờ 0 (F0) trong PSW vào chân cổng P1.5? 2.44 Dưới tình huống nào thì ASM51 (của Intel) sẽ chuyển lệnh JMP chung (tổng quát) thành LJMP? 2.45 Bộ nhớ nội của 8051 được khởi tạo trị như sau, ngay trước khi thực thi lệnh RET: Địa chỉ nộiNội dung SFRs Nội dung 0BH 9AH SP 0BH 0AH 78H PC 0200H 09H 56H A 55H 08H 34H 07H 12H Nội dung của PC sau khi thực thi lệnh RET là bao nhiêu? 2.46 Viết một đoạn ngắn mã 8051 đọc liên tục 1 byte dữ liệu từ Port 1 và ghi nó ra Port 2, cho đến khi byte đọc được bằng 4AH thì dừng lại. 2.47 Cho đoạn mã sau: RTN: PUSH PSW LOOP: MOV A, @R0 BT-VXL-Ch 3 – trang 5
  4. MOV @R0, A INC R0 INC R1 DJNZ R2, NEXT ; a) Sau khi thực thi lệnh thứ ba (có chú thích ###), nội dung của R0, R1, và R2 là bao nhiêu? b) Lệnh có nhãn NEXT được thực thi bao nhiêu lần? c) Sau khi hoàn tất chương trình trên thì nội dung của R0, R1, và R2 là bao nhiêu? d) Nếu nội dung của các ô nhớ như sau: (20H) = 45H (21H) = 23 (30H) = 89H (31H) = 67H • Cho biết nội dung của các ô nhớ trên sau khi thực thi chương trình trên? • Chức năng của chương trình trên? • Các toán hạng được cất trong bộ nhớ như thế nào? 2.51 Xét chương trình 8051 sau: start: MOV R0, #05H MOV R1, #40H MOV R2, #0H ; ### MOV @R1, #0H again: MOV DPTR, #TABLE MOV A, R2 MOVC A, @A + DPTR ADD A, @R1 MOV @R1, A INC R2 DJNZ R0, again AJMP EXIT TABLE: DB 10H, 11H, 12H, 13H, 14H EXIT: END a) Sau khi thực thi lệnh (có chú thích ###) thì nội dung của R0, R1, và R2 là bao nhiêu? b) Lệnh có nhãn again được thực thi bao nhiêu lần? c) Sau khi hoàn tất chương trình trên thì nội dung của R0, R1, và R2 là bao nhiêu? d) Nội dung của ô nhớ 40H sau khi thực thi chương trình trên? e) Chức năng của chương trình trên? f) Nếu kết quả của chương trình trên được cất vào ô nhớ 50H thì lệnh nào cần sửa đổi và đổi như thế nào? 2.52 Xét chương trình sau (giả sử LED là địa chỉ của 1 bit xuất nào đó). BLINK: CPL LED CALL DELAY JMP BLINK DELAY: MOV R1, #145 DLY2: MOV R2, #199 DLY1: MOV R3, #210 DJNZ R3, $ DJNZ R2, DLY1 DJNZ R1, DLY2 RET a) Giả sử XTAL có tần số 6MHz, hãy tính thời gian ON và thời gian OFF của LED b) Tính thời gian ON của LED trong đoạn sau với XTAL là 12MHz DELAY: MOV R1, #136 DLY2: MOV R2, #136 DLY1: MOV R3, #136 DJNZ R3, $ DJNZ R2, DLY1 BT-VXL-Ch 3 – trang 7
  5. LOOP2: MOV @R1, #00H INC R1 CJNE R1, #0F0H, LOOP2 RET 2.59 Hãy viết mã máy cho đoạn chương trình sau: ORG 300H MOV A, #20H MOV R0, #34H MOV DPTR, #LABEL ADD A, R0 AJMP LABEL ORG 400H LABEL: LJMP 0300H 2.60 Đoạn chương trình sau chạy vô tận. Giả sử dùng XTAL 6MHz cho clock của 8031. Như vậy ta đọc được tần số bao nhiêu ở scope nếu đo ở chân P1.0 CLR C LOOP1: MOV A, #47 LOOP2: DJNZ A, LOOP2 MOV P1.0, C CPL C AJMP LOOP1 Với cùng chương trình trên thì tần số ở chân ALE là bao nhiêu? 2.61 Viết chương trình con đổi 1 ký số BCD trong thanh ghi A thành biểu diễn ASCII tương ứng trong ô nhớ được chỉ bởi thanh ghi R0. Nếu giá trị trong A không phải BCD thì đặt bit có địa chỉ 00H có giá trị 1. Từ đó hãy phát triển thành chương trình con đổi 2 ký số BCD trong thanh ghi A thành biểu diễn ASCII của chúng, kết quả được cất vào các ô nhớ có địa chỉ bắt đầu cho trong R0, ký số BCD có trọng số cao sẽ được cất ở địa chỉ thấp. Làm lại với chuyển đổi số Hex sang ASCII. 2.62 Viết chương trình con đổi biểu diễn ASCII được cất trong ô nhớ được chỉ bởi thanh ghi R0 thành ký số BCD tương ứng trong thanh ghi A. Nếu giá trị trong A không phải BCD thì đặt bit có địa chỉ 00H có giá trị 1. Từ đó hãy phát triển thành chương trình con đổi 2 ký số dạng ASCII được cất trong ô nhớ được chỉ bởi thanh ghi R0 (ký số có trọng số cao sẽ được cất ở địa chỉ thấp). thành BCD trong thanh ghi A. Làm lại với chuyển đổi ASCII sang số Hex. 2.63 Viết chương trình con BINTOBCD đổi 1 số nhị phân 8 bit thành biểu diễn BCD tương ứng của nó (3 ký số BCD) để trong các ô nhớ có địa chỉ bắt đầu ở trong R0, ký số BCD có trọng số cao nhất sẽ ở địa chỉ thấp nhất. 2.64 Viết chương trình con BCDTOBIN đổi số BCD có 2 ký số trong thanh ghi A thành số nhị phân trong ô nhớ được chỉ bởi R0. 2.65 Viết chương trình xác định xem có bao nhiêu byte có trị là 0, 0 trong một khối bộ nhớ; ô nhớ 40H sẽ chứa số byte có trị bằng 0, ô nhớ 41H sẽ chứa số byte có trị 0. Ô nhớ 43H chứa địa chỉ đầu khối bộ nhớ, ô nhớ 44H chứa số byte trong khối đó (chiều dài khối). Thí dụ: (43H)=45H, (44H)=06, (45H)=68H, (46H)=F2H, (47H)=87H, (48H)=00H, (49H)=59H, (50H)=2AH thì sau khi chạy đoạn chương trình này thì (41H)=1, (42H)=2, (43H)=3. 2.66 Tính bù 2 của một số 16 bit có địa chỉ đầu được chỉ bởi R6 (byte cao ở địa chỉ thấp) và kết quả được cất vào bộ nhớ với địa chỉ đầu được chỉ bởi R7. Thí dụ: (R6)=40H, (R7)=42H, (40H)=45H, (41H)=2AH thì kết quả ở (42H)=BAH, (43H)=D6H. Hãy trình bày các giải pháp có thể có. 2.67 Viết chương trình tìm phần tử nhỏ nhất trong 1 khối dữ liệu. Chiều dài của khối dữ liệu ở trong ô nhớ 41H và địa chỉ bắt đầu khối ở trong ô nhớ 42H. Chứa phần tử nhỏ nhất đó trong ô nhớ 40H, giả sử khối dữ liệu chứa các số nhị phân không dấu. Làm lại với tìm phần tử lớn nhất. 2.68 Viết chương trình SORT sắp thứ các số trong 1 khối dữ liệu. Chiều dài của khối dữ liệu ở trong ô nhớ 41H và địa chỉ bắt đầu khối ở trong ô nhớ 42H. Kết quả được lưu vào trong vùng nhớ khối dữ liệu ban đầu. (HD: dùng phương pháp bubble sort, xem trong các sách về cấu trúc dữ liệu và giải thuật) 2.69 Viết chương trình con nhân 2 số nguyên 8 bit có dấu, dùng bù 2 để biểu diễn cho các số âm. Kết quả là số nguyên 16 bit có dấu để trong thanh ghi R6 (byte cao) và R7 (byte thấp). BT-VXL-Ch 3 – trang 9
  6. Hình E.2.81 BT-VXL-Ch 3 – trang 11
  7. Hình E.3.12 3.13 Chuẩn điều hưởng (hay còn gọi là cộng hưởng) quốc tế cho các thiết bị âm nhạc là “A trên D trung” (La trên Đô trung) ở tần số 440 Hz. Viết chương trình 8051 để tạo ra tần số điều hưởng này và phát ra tone 440 Hz ở loa nối ở P1.1 (xem hình E.3.13). Do việc làm tròn các giá trị đặt ở TL1/TH1, có 1 sai số nhỏ trong tần số ra. Tần số ra chính xác là bao nhiêu và phần trăm sai số là bao nhiêu? Muốn có được chính xác 440 Hz với chương trình bạn đã viết thì giá trị của thạch anh là bao nhiêu? Hình E.3.13 3.14 Viết chương trình 8051 để tạo ra tin hiệu 500 Hz ở P1.0 dùng timer 0. Dạng sóng có chu kỳ nhiệm vụ 30%. 3.15 Mạch ở hình E.3.15 sẽ cung cấp tín hiệu rất chính xác 60 Hz (với điều kiện áp AC này có tần số ổn định) vào T0 bằng cách lấy từ thứ cấp của một biến áp. Khởi động Timer 0 sao cho nó lấy xung nhịp từ T0 và tràn 1 lần/giây. Ở mỗi lần tràn, cập nhật giá trị thời gian trong ngày được chứa trong bộ nhớ nội của 8051 ở các vị trí 50H (giờ), 51H (phút), và 52H (giây). Hình E.3.15 Phần 4 – Cổng nối tiếp (Serial Port) 4.1 Hãy tìm giá trị của TH1 (dạng thập phân và hex) để đặt tốc độ baud cho các trường hợp sau nếu SMOD=1: a) 9600 baud; b) 4800 baud. Giả sử rằng XTAL=11.0592 MHz 4.2 Tìm tốc độ baud nếu TH1=–2, SMOD = 1 và XTAL =11.0592MHz. 4.3 Giả sử rằng cổng nối tiếp 8051 được nối vào cổng COM của máy vi tính, và ở PC ta sử dụng chương trình terminal.exe để gửi và nhận dữ liệu nối tiếp. P1 và P2 của 8051 được nối vào các LED và các công tắc tương ứng. Viết chương trình 8051 để: a) gửi đến máy vi tính thông điệp “We Are Ready!”; b) nhận bất cứ dữ liệu nào được gửi từ máy vi tính và xuất nó ra các LED đang gắn ở P1; và c) lấy dữ BT-VXL-Ch 3 – trang 13
  8. b g c dp e f a d 0 0 1 0 1 0 0 0 0 50H 1 0 1 0 1 1 1 1 1 5FH 2 0 0 1 1 0 1 0 0 34H 3 0 0 0 1 1 1 0 0 1CH 4 0 0 0 1 1 0 1 1 1BH 5 1 0 0 1 1 0 0 0 98H 6 1 0 0 1 0 0 0 0 90H 7 0 1 0 1 1 1 0 1 5DH 8 0 0 0 1 0 0 0 0 10H 9 0 0 0 1 1 0 0 1 19H A 0 0 0 1 0 0 0 1 11H B 1 0 0 1 0 0 1 0 92H C 1 1 1 1 0 0 0 0 F0H D 0 0 0 1 0 1 1 0 16H E 1 0 1 1 0 0 0 0 B0H F 1 0 1 1 0 0 0 1 B1H Chú ý: o để làm cho tất cả các đoạn sáng ta ấn nút SW o để làm cho tất cả các đoạn tắt ta dùng lệnh MOV SBUF, #FF Hãy viết các lệnh để: a) Hiển thị các ký tự “0”, “1”, “2”, “3”, và “4” từ phải sang trái. Có nhận xét gì về kết quả hiển thị? b) Hiển thị ký tự “A” trên bảng hiển thị? Các vấn đề sau (4.6 đến 4.14) là các chương trình tiêu biểu để giao tiếp với các thiết bị đầu cuối (terminal) hoặc các thiết bị nối tiếp khác với máy vi tính. Giả sử cổng nối tiếp được khởi động ở mode UART 8 bit và tốc độ baud được cung cấp bởi Timer 1. 4.6 Viết chương trình con OUTSTR gửi 1 chuỗi ký tự ASCII kết thúc bởi ký tự NULL đến thiết bị nối tiếp nối với cổng nối tiếp của 8051 . Giả sữ chuỗi mã ASCII ở trong bộ nhớ mã bên ngoài và chương trình gọi đặt địa chỉ của chuỗi trong DPTR trước khi gọi OUTSTR. Chuỗi ký tự kết thúc bằng NULL là chuỗi byte ASCII kết thúc với byte 00H. 4.7 Viết chương trình con INLINE nhập 1 dòng các mã ASCII từ thiết bị nối với cổng nối toếp của 8051 và đặt nó vào bộ nhớ dữ liệu nội bắt đầu ở 50H. Giả sử dòng kết thúc bằng CR (carriage return). Đặt mã CR vào trong bộ đệm dòng cùng với các mã khác và rồi kết thúc bộ đệm bằng byte NULL (00H). 4.8 Viết chương trình gửi liên tục bộ mẫu tự từ a tới z đến thiết bị gắn vào cổng nối tiếp, dùng chương trình con OUTCHR (có sẵn ) . 4.9 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình gửi liên tục bộ ASCII hiển thị được (các mã từ 20H đến 7EH) đến thiết bị đang gắn vào cổng nối tiếp của 8051. 4.10 Sửa đổi lại lời giải của bài tập trên để treo và cho xuất tiếp lại ra màn hình dùng các mã XOFF và XON nhận được từ bàn phím. Tất cả các mã khác bị bỏ qua (chú ý: XOFF = CONTROL-S = 13H và XON=CONTROL-Q=11H). 4.11 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập các ký tự từ bàn phím và và hiển thị chúng lại trên màn hình, đổi những ký tự chữ in thường sang chữ in hoa. 4.12 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập các ký tự từ thiết bị đang gắn ở cổng nối tiếp 8051 và hiển thị chúng lại với dấu chấm (“.”) sẽ thay thế cho các ký tự điều khiển (có các mã ASCII 00H đến 1FH, và 7FH). 4.13 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình xóa màn hình VDT đang gắn ở cổng nối tiếp 8051 và rồi gửi tên của bạn đến VDT 10 lần trên 10 dòng. Chức BT-VXL-Ch 3 – trang 15
  9. 6.5 Sự khác biệt giữa DB và DW? 6.6 Hãy ghi các giá trị ô nhớ của đoạn sau: ORG 0FH DW 5 SHL 4 DB 65535 DW ‘0’ 6.7 Viết định nghĩa 1 macro dùng để điền 1 hằng số dữ liệu vào 1khối trong bộ nhớ dữ liệu ngoài. Truyền địa chỉ bắt đầu, chiều dài, và hằng số dữ liệu cho các tham số macro. 6.8 Viết định nghĩa cho các macro sau: JGE – nhảy đến LABEL nếu thanh ghi tích lũy có trị >= VALUE JLT – nhảy đến LABEL nếu thanh ghi tích lũy có trị < VALUE JLE – nhảy đến LABEL nếu thanh ghi tích lũy có trị <= VALUE JOR – nhảy đến LABEL nếu thanh ghi tích lũy có trị ngoài tầm của đoạn từ LOWER đến UPPER. 6.9 Viết định nghĩa 1 macro có tên là CJNE_DPTR mà sẽ nhảy đến nhãn LABEL nếu con trỏ dữ liệu không chứa giá trị VALUE. Định nghĩa macro sao cho nội dung của tất cả các thanh ghi và các ô nhớ không bị ảnh hưởng. BT-VXL-Ch 3 – trang 17