Viết một đoạn chương trình chuyển mảng data chứa trong bộ nhớ RAM nội địa chỉ đầu 30H sang bộ nhớ RAM ngoài địa chỉ đầu 1000H,kết thúc chuyển data khi gặp ký tự NULL=00H...12 14.. Viết m
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ -*** -
VI XỬ LÝ BÀI TẬP CHƯƠNG 3
GIÁO VIÊN HƯỚNG DẪN: LƯU PHÚ
Trang 2TP HCM, ngày 12 tháng 02 năm 2020 Mục lụ
1 Viết mã lệnh,số byte ,số chu kỳ máy và ý nghĩa các lệnh sau đây: 4
2 Viết mã lệnh,số byte ,số chu kỳ máy và ý nghĩa các lệnh sau đây: 5
3 Viết mã lệnh,số byte ,số chu kỳ máy và ý nghĩa các lệnh sau đây: 7
4 Giả sử (PC)=1000H chứa các lệnh sau đây và các nhãn 7
5 Giả sử (PC)=0400H chứa các lệnh sau đây và các nhãn 7
6 Giả sử (PC)=0A00H chứa các lệnh sau đây và các nhãn LAB1=0F6EH,LAB2=088AH,viết các mã lệnh và ý nghĩa của các lệnh sau đây: 8
7 Khi biên dịch đoạn chương trình sau,ASM51 sẽ báo lỗi,vì sao? 8
8 Giả sử (SP)=60H,mô tả hoạt động của PC và stack khi thực hiện lệnh LCALL CTC: 8
9 Giải thích ý nghĩa đoạn chương trình sau: 9
10: Xem đoạn chương trình sau: 10
11:Viết lại đoạn chương trình trên thay lệnh CJNE bằng lệnh DJNZ 11
12 Viết một đoạn chương trình chuyển 100 byte data chứa trong bộ nhớ RAM ngoài địa chỉ đầu 1000H sang bộ nhớ RAM nội địa chỉ đầu 30H 11
13 Viết một đoạn chương trình chuyển mảng data chứa trong bộ nhớ RAM nội địa chỉ đầu 30H sang bộ nhớ RAM ngoài địa chỉ đầu 1000H,kết thúc chuyển data khi gặp ký tự NULL=00H 12
14 Viết một đoạn chương trình chuyển mảng data chứa trong bộ nhớ RAM ngoài địa chỉ đầu 1000H sang vùng nhớ khác địa chỉ đầu 8000H,kết thúc chuyển data khi gặp ký tự NULL=00H 12
Trang 315 Viết một chương trình con tên DELAY_100US tạo thời gian trễ đúng 100us 13
16 Viết một chương trình con tên DELAY_10MS tạo thời gian trễ đúng 10ms,sử dụng chương trình con DELAY_100US ở câu 15 13
17 Viết một đoạn chương trình tạo xung mức 1 độ rộng 5µs trên P1.0 13
18 Viết một đoạn chương trình tạo xung mức 0 độ rộng 100µs trên P2.6 14
19 Viết một đoạn chương trình tạo chuỗi xung vuông đối xứng chu kỳ 1ms trên P3.5 14
20 Viết một chương trình con tên COMP_16 so sánh 2 số 16 bit cất trong B-A và R7-R6,kết quả trả về C=0 nếu (B-A)<(R7-R6) và C=1 nếu (B-A)≥(R7-R6) 14
21 Viết một chương trình con tên ADD_16 cộng 2 số 16 bit cất trong các ô nhớ RAM nội (31H-30H) và (33H32H),kết quả trả về cất trong (B-A) và C 15
22 Viết một chương trình con tên SUBB_16 trừ 2 số 16 bit cất trong các ô nhớ RAM nội (31H-30H) và (33H32H),kết quả trả về cất trong (B-A) và C=1 nếu kết quả tràn âm 15
23 Viết một chương trình con tên MUL_16_8 nhân số 16 bit (R1A) và số 8 bit(B),kết quả trả về (R1BA) 16
25 Viết một chương trình con tên HEX_BCD chuyển byte data nhập từ P1 vào thành số BCD nén (B) và (A) 17
26 Viết một chương trình con tên BCD_HEX chuyển số BCD nhập từ P3 sang số HEX xuất ra P0 17
27 Viết một chương trình con tên BCDADD_4DG cộng 2 số BCD nén 4 digit (31H-30H) và (33H-32H),kết quả trả về là số BCD (C) và (B-A) 18
28 Viết một chương trình con tên SHIFT_OUT chuyển byte data (A) thành từng bit xuất ra P1.0 MSB trước 18
29 Viết một chương trình con tên SHIFT_IN chuyển từng bit nhập từ P1.0 (MSB nhập trước) vào (A) cho đến khi đủ 8 bit 18
Trang 430 Giả sử(R1-A) chứa 4 digit BCD hàng ngàn,trăm,chục và đơn vị.Viết một chương trình con tên BCD_SHIFT4 nhập một số BCD từ 4 bit thấp P2,chuyển vào hàng đơn vị của(R1-A),đồng thời dời các digit từ hàng đơn vị lên chục,chục lên trăm,trăm lên ngàn và hàng ngàn khỏi (R1-A).Ví dụ(R1-A)=1234,nhập (P2)3-0=5→(R1A)=2345 19
31 Đặt X0=P1.0,X1=P1.1,X2=P1.2,Y=P1.3.Viết đoạn chương trình thực hiện các hàm Boolesau,tính thời gian đáp ứng max: 20
32 Viết một đoạn chương trình nhập data từ P2,và thực hiện chuyển điều khiển như sau: 21
33 Viết một đoạn chương trình nhập data từ P1 và thực hiện công việc như sau: 21
34 Viết một chương trình điều khiển LED D1 theo sơ đồ hình BT34: - Khởi động chương trình D1 tối - Nhấn /nhả SW D1 sáng,nhấn/ nhả SW D1 tối - Lập vòng liên tục như trên - Mô phỏng bằng Proteus 22
35 Viết một chương trình nhận dạng nút nhấn như hình BT35: 23
Trang 51 Viết mã lệnh,số byte ,số chu kỳ máy và ý nghĩa các lệnh sau đây:
a MOV A,#3FH f MOV P1,30H k PUSH ACC
b MOV A,3FH g MOVX A,@DPTR l PUSH PSW
c MOV 3FH,A h MOVC A,@A+DPTR m POP B
d MOV A,R7 (R7 ở bank 4) i MOVX @R1,A n POP 07H
e MOV @R0,A j MOVC A,@A+PC
Trang 6i MOVX @R1,A địa chỉ gián tiếp chỉ đến bộ nhớ ngoài @R1, mã lệnh là 11110011B, chiếm 1 byte, 2mc.
j MOVC A,@A+PC (định địa chỉ theo chỉ số) sử dụng thanh ghi nền + với thanh ghi tích lũy làm địa chỉ, mã lệnh :10000011B, chiếm 1 byte, 2mc (A)=(PC+A)
k PUSH ACC :lệnh tác vụ cất dữ liệu vào ngăn xếp, tăng nội dung con trở ngăn xếp SP lên 1 rồi cất nội dung thanh ghi A vào địa chỉ đó (SP)<=(SP)+1, ((SP))<=(A); mã lệnh 0C0H; chiếm 2 bytes, 2mc
l PUSH PSW :lệnh tác vụ cất dữ liệu vào ngăn xếp, tăng nội dung con trở ngăn xếp SP lên 1 rồi cất nội dung thanh ghi PSW(D0H) vào địa chỉ đó (SP)<=(SP)+1,
b ADDC A,4FH g XCHD A,@R0 l RR A
c SUBB A,@R0 h XCH A,B m DA A
d INC DPTR i DEC DPL n SWAP A
e ANL 60H,A j ORL A,#0FH
Bài làm:
a ADD A,#4EH : lệnh cộng, có mã lệnh là 244EH, chiếm 2 bytes, 1 mc; (A)=(A)+4E
Trang 7b ADDC A,4FH : lệnh cộng, có cộng cờ nhớ C, có mã lệnh là 354FH, chiếm 2 bytes, 1 mc; (A)=(A)+(4E)+(C)
c SUBB A,@R0: lệnh trừ có cờ nhớ, có mã lệnh là 96H, chiếm 1 byte ,1 mc; ((R0))-(C)
(A)=(A)-d INC DPTR : tăng thêm một cho đối tượng des, có mã lệnh là A3H, chiếm 1 byte, 2mc;(DPTR)=(DPTR)+1
e ANL 60H,A : mã lệnh là 5260; chiếm 2 bytes, 1mc; (60H) (60H) AND (A)
f XRL B,R6: (B) (B) XOR (R6); mã lệnh 6EF0; chiếm 2 bytes, 1mc
g XCHD A,@R0: (A) và ((R0)) hoán đổi 4 bit thấp; mã lệnh là D6; chiếm 1 byte, 1mc
h XCH A,B: (A) và (B) hoán đổi; mã lệnh là C5F0 ; chiếm 2 bytes, 1mc
i DEC DPL: (DPL)=(DPL)-1; mã lệnh là 15H; chiếm 1 byte, 1mc
j ORL A,#0FH: (A) (A) OR 0FH; mã lệnh là 440F; chiếm 2 bytes, 1mc
k RLC A: quay trái (A) qua (C) 1 bit; mã lệnh là 33H; chiếm 1 byte, 1mc
l RR A: quay phải (A) 1 bit ;mã lệnh là 03H; chiếm 1 byte, 1mc
m DA A: hiệu chỉnh (A) thành số BCD sau phép cộng 2 số BCD ;mã lệnh là 0D4H; chiếm 1 byte, 1mc
n SWAP A: hoán vị nibble cao và thấp của (A);mã lệnh là 0C4H; chiếm 1 byte, 1mc
Trang 83 Viết mã lệnh,số byte ,số chu kỳ máy và ý nghĩa các lệnh sau đây:
4 Giả sử (PC)=1000H chứa các lệnh sau đây và các nhãn
LOOP1=104FH,LOOP2=0F37H,viết mã lệnh và ý nghĩa của các lệnh sau đây:
Bài làm:
a 404F JC LOOP1: (C)=1 nhảy đển 104FH, (C)=0 lệnh kế tiếp
b 5037 JNC LOOP2: (C)=0 nhảy đển 0F37H, (C)=1 lệnh kế tiếp
c 20904F JB P1.0,LOOP: bit (P1.0)=1 nhảy đến 104FH, bit (P1.0)=0: lệnh kế
d 309037 JNB P1.0,LOOP2: bit (P1.0)=1 nhảy đến 0F37H, bit (P1.0)=1: lệnh kế
e 604F JZ LOOP1: (A)=0: nhảy đến địa chỉ 104FH
f 20E737 JB ACC.7,LOOP2: bit (ACC.7)=1 nhảy đến 0F37H, (ACC.7)=0: lệnh kế
g 107F4F JBC 7FH,LOOP1: bit trỏ bởi (7FH)=1 nhảy đến 104FH và xóa bit, (7FH)=0:
lệnh kế
5
Giả sử (PC)=0400H chứa các lệnh sau đây và các nhãn
HERE=043DH,THERE=038AH,viết các mã lệnh và ý nghĩa của các lệnh sau đây:
Bài làm
Trang 9Mã lệnh Lệnh/Mô tả
a 803D SJMP HERE: nhảy đến địa chỉ 043DH
b 808A SJMP THERE: nhảy đến địa chỉ 038AH
c DF3D DJNZ R7,HERE: (R7)(R7)-1, nếu =0 nhảy đến đ/c 043DH, =1: lệnh kế
d D58A DJNZ 30H,THERE
e B5203D CJNE A,20H,HERE
f B45A8A CJNE R7,#’Z’,THERE
6 Giả sử (PC)=0A00H chứa các lệnh sau đây và các nhãn LAB1=0F6EH,LAB2=088AH,viết các mã lệnh và ý nghĩa của các lệnh sau đây:
Bài làm
a 018A AJMP LAB2: nhảy đến địa chỉ 088AH trong trang PCHH
b 116E ACALL LAB1: gọi CTC, nhảy đến địa chỉ 0F6EH trong trang PCHH
c 120F6E LCALL LAB1: gọi CTC, nhảy đến địa chỉ 16 bit 0F6EH
7 Khi biên dịch đoạn chương trình sau,ASM51 sẽ báo lỗi,vì sao?
Sửa lại như thế nào để biên dịch tốt?
Bài làm :
Sửa CLR A → CLR A.7 ; lệnh CLR bit
Trang 108 Giả sử (SP)=60H,mô tả hoạt động của PC và stack khi thực hiện lệnh LCALL CTC:
Trang 11Ý nghĩa : phục hồi (A) từ stack
Cho biết nội dung (A) sau khi thực hiện đoạn chương trình trên,nếu DAT=07H
Bài làm:
Trang 12a Cho biết công việc của đoạn chương trình trên?
b Dịch sang mã máy đoạn chương trình trên
c Tính thời gian thực hiện từng lệnh
d Tính thời gian thực hiện đoạn chương trình trên
Trang 16DJNZ R1, TIEP END
17 Viết một đoạn chương trình tạo xung mức 1 độ rộng 5µs trên P1.0
Trang 17DELAY_500uS : MOV R1,#500
LAP NOP
DJNZ R1,LAPXUNGVUONG : SETB P3.5
LCALL DELAY_500uSCLR P3.5
LCALL DELAY_500uSLCALL XUNGVUONG
Trang 19Viết một chương trình con tên MUL_16_8 nhân số 16 bit (R1A)
và số 8 bit(B),kết quả trả về (R1BA)
Trang 21DA AMOV B, AMOV A, R1
Trang 23Giả sử(R1-A) chứa 4 digit BCD hàng ngàn,trăm,chục và đơn vị.Viết một chương trình con tên BCD_SHIFT4 nhập một số BCD từ 4 bit thấp P2,chuyển vào hàng đơn vị của(R1-A),đồng thời dời các digit từ hàng đơn vị lên chục,chục lên trăm,trăm lên ngàn
và hàng ngàn khỏi (R1-A).Ví dụ(R1-A)=1234,nhập (P2)3-0=5→(R1A)=2345
BCD_SHIFT4: CLR B
MOV 0F3, P2.3MOV 0F2, P2.2MOV 0F1, P2.1MOV 0F0, P2.0MOV RO, #0F0SWAP A
XCHD A, @R0MOV R2, AMOV A, R1SWAP AANL A, #11110000BADD A, B
MOV R1, AMOV A, R2
Trang 25Viết một đoạn chương trình nhập data từ P2,và thực hiện chuyển điều khiển như sau:
- Nếu (P2)>’z’: nhảy đến nhãn GREAT
- Nếu (P2)<’z’: nhảy đến nhãn LOW
- Nếu (P2)=’z’: nhảy đến nhãn SAME
Trả lời :
ORIG 0MOV A,P2CJNE A,#’z’,CTC
Trang 26SOSANH: JC C LOW
GREAT: ……
33
Viết một đoạn chương trình nhập data từ P1 và thực hiện công việc như sau:
- Nếu (P1) là số BCD nhảy đến nhãn TIEP
- Nếu (P1) không phải số BCD,chuyển sang số BCD và nhảy đến nhãn TIEP
Trang 28Viết một chương trình điều khiển LED D1 theo sơ đồ hình BT34: - Khởi động chương trình D1 tối - Nhấn /nhả SW D1 sáng,nhấn/ nhả SW D1 tối - Lập vòng liên tục như trên - Mô phỏng bằng Proteus.
(File mô phỏng bao gồm file hex và file project ở phần file đính kèm.)
35 Viết một chương trình nhận dạng nút nhấn như hình BT35:
- Nếu SW1 nhấn,phát một xung mức 1 độ rộng 100us ra P2.0,sau đó chờ SW1 nhả
- Nếu SW2 nhấn,phát một một xung mức 1 độ rộng 100us ra P2.1,sau đó chờ SW2 nhả
- Lập vòng liên tục như trên
- Mô phỏng chương trình bằng Proteus
org 00h
Trang 29CLR P2.0
CLR P2.1
KT: MOV A, #49
JNB P1.0, X1JNB P1.1, X2
Trang 30END