Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H... 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... Byte đầu tiên chứa opcode, byte th
Trang 11 Hãy viết lệnh để đặt LSB của byte ở địa chỉ 25H lên 1?
Ở byte địa chỉ 25H
LSB: “ LOW STATUS BIT” Suy ra các lệnh có thể là:
SETB 28H
2 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?
MOV C, 00H; Đưa bit ở địa chỉ 00H vào C
ORL C, 01H; Thực hiện phép OR, kết quả cất vào C
MOV 02H, C; Cất kết quả vào 02H
Chú ý: C là cary “ cờ nhớ tạm thời ”
3 Hãy cho biết những bit nào sẽ có giá trị bằng 1 sau khi thực hiện đoạn chương trình sau:
MOV R0, #26H
MOV @R0, #7AH
Giống câu 1
Sau 2 lệnh trên byte nhớ thứ 26H (chưa bit 37-30) chưa giá trị 7AH:
MSB
Các bit có giá trị bàng 1 là các bit ở địa chỉ: 31H, 33H, 34H, 35H, 36H
Các bit thứ: 3, 6, 7 của thanh ghi R0 tính từ MSB R0 = 0010 0110
4 Hãy tìm lệnh 1 byte có cùng tác dụng như lệnh 2 byte sau: MOV 0E0H, #55H
Tra bảng ta có lệnh có cùng tác dụng nhưng sử dụng 1 byte là:
MOV A, #55H
5 Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H
MOV A, #0ABH ;Gán A bằng con số 0ABH
MOV DPTR, #9A00H ;Gán giá trị thanh ghi bằng 9A00H
MOVX @DPTR, A ;chép nội dung thanh ghi A vào ô nhớ ngoài DPTR
6 Sau khi reset hệ thống, giá trị của SP của 8051 là bao nhiêu?
SP: “Stack Pointer” sau khi reset lại nó nằm ở bit MSB là 07H như bảng đã học
Sau khi reset hệ thống giá trị củ a SP củ a 8051 là 07H
Trang 27 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 đó? (Thanh ghi trạng thái D0H, chứa các bit trạng thái như sau:
Ta quan tâm tới RS1 và RS0 là các bít dùng để chọn bank thanh ghi tích cực chúng được xoá sau khi reset hệ thống và được thay đổi bằng phần mềm nếu cần
0 0 0: địa chỉ 00H-07H
0 1 1: địa chỉ 08H-0FH
1 0 2: địa chỉ 10H-17H
1 1 3: địa chỉ 18H-1FH Giải:
Giả sử chương trình con có tên là CTCON
CTCON: PUSH 0D0H
SETB RS0 ; Gán bit =1
SETB RS1 ; Gán bit =1
…
…
POP 0D0H
RET
8 MCU “MicroSystems” 8051 được sử dụng với thạch anh 4MHz, khi đó chu kỳ máy
là bao nhiêu?
9 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
- EPROM
o /EA →0 (CHÂN SỐ 31)
o ALE (CHÂN SỐ 30)
o /PSEN (CHÂN SỐ 29)
- RAM
o ALE
o /RD (CHẤN SỐ 17)
o /WR (CHÂN SỐ 16)
10 Đị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?
Địa chỉ bit của MSB của byte ở địa chỉ 25H trong vùng dữ liệu nội của 8051 là 2FH
11 Hãy thực hiện lệnh để đặt LSB của thanh ghi tích lũy lên 1 mà không ảnh hưởng 7 bit khác?
Thanh ghi tích luỹ A(Accummulator) ký hiệu ACC tương ứng với địa chỉ E0H , được định địa chỉ từng bit
SETB ACC.7 ; bỏ qua 7 bit tính từ MSB nên sẽ không ảnh hưởng
Trang 312 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 Giống câu 9:
MOV A, R7
MOV DPTR, #100H
MOVX @DPTR, A
13 Lệnh gì dùng để đưa 8051 vào chế độ tắt nguồn?
SETB PD
Hoặc SETB PCON.1
14 Hãy minh họa làm cách nào có thể giao tiếp 2 RAM tĩnh (mỗi RAM 32KB) với 8051
để chúng có thể chiếm toàn bộ vùng dữ liệu ngoài 64K
Cách hiểu hình này như thế này:
Miền thể hiện cho RAM1 32K
Còn miền còn lại thể hiện cho RAM2 32K
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
Trang 4 Biểu diễn 8000H-9FFFH chiếm 2 trang (8KB), tổng số đường địa chỉ cần :
8.210=213(A12-A0)( hay nói cách khác từ 8000H-9FFFH tất cả các địa chỉ điều thay đổi chỉ có A15=1,A14=0,A13=0 luôn không đổi)
Biểu diễn E000H-FFFFH chiếm 2 trang (8KB), tổng số đường địa chỉ cần :
8.210=213(A12-A0)( hay nói cách khác từ E000H-FFFFH tất cả các địa chỉ điều thay đổi chỉ có A15=1,A14=1,A13=1 luôn không đổi)
8051
ROM 8KB
/cs
A13
A14
A15
Trang 5Trường Hợp 2:
b/ Ta có bảng giá trị như sau:
ROM 8K 2^3.2^10=2^13 CÓ 13 ĐƯỜNG ĐỊA CHỈ
RAM 16K CÓ 14 ĐƯỜNG ĐỊA CHỈ
TA CÓ MẠCH THIẾT KẾ SAU:
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
Trang 6B Tập lệnh :
16 Hãy cho biết cách định địa chỉ của các lệnh sau:
a) MOV R4, A; Thanh ghi
b) MOV A, #0A3H:Tức thời
c) MOV 6, #0B6H : Trực tiếp
d) LJMP 0548H: Dài
e) MOVX A, @DPTR: Chỉ số
f) MOV A, @R1; gián tiếp
g) MOV A, 12H; Trực tiế p
h) ACALL DELAY;Tuyệt đối
i) SJMP LOOP; Tương đối
Cách chi tiết:
a/ MOV R4,A : chép dữ liệu từ thanh ghi A vào thanh ghi R4
b/ MOV A,#0A3H : Gán A bằng số A3H
c/ MOV 6, #0B6H : Gán nội dung ơ nhớ 6 bằng giá trị B6H
d/ LJMP 0548H Nhảy đến nhản 0548H
e/ MOVX A,@DPTR : chép vào A một byte từ ơ nhớ ngồi cĩ địa chỉ được trỏ bởi DPTR f/ MOV A,@R1:Chép dữ liệu từ ơ nhớ R1 vào thanh ghi A
g/ MOV A, 12H : Chép dữ liệu từ ơ nhớ 12H vào thanh ghi A
h/ ACALL DELAY: Gọi thực thi chương trình con có tên “DELAY” Sau khi thực thi chương trình con, VXL sẽ thực hiện câu lệnh ngay phía sau câu lệnh gọi này
i/ SJMP LOOP: Nhảy đến nhãn LOOP
17 Xét lệnh sau: MOV 50H, #0FFH
a Mã lệnh của lệnh này là bao nhiêu?
Ta cĩ ý nghĩa mả lệnh này là: MOV direct,#0FFH [(direct)#data] tra bảng NHĨM LỆNH CHUYỄN DỮ LIỆU TRANG 4/8 TA ĐƯỢC:
01110101 aaaaaaaa dddddddd
b Lệnh này dài bao nhiêu byte? 3 byte
c Giải thích mỗi byte của lệnh này
Byte đầu tiên chứa opcode, byte thứ hai chứa địa chỉ trực tiếp (tức là ơ nhớ 50H trong RAM nội, byte thứ 3 chưa data tức là FFH
d MCU phải cần bao nhiêu chu kỳ máy để thực hiện lệnh này? 2
e Nếu 8051 hoạt động với thạch anh 16 MHz, MCU phải mất bao lâu mới thực thi xong lệnh này?
Mất 2 chu kỳ nên ta cĩ:
Trang 7
18 Offset tương đối của lệnh “SJMP AHEAD” là bao nhiêu nếu lệnh này đang ở ô nhớ 0400H và 0401H, và nhãn AHEAD biểu diễn lệnh ở địa chỉ 041FH
Lưu ý: 1 lệnh SJMP có mã lệnh: 10000000 eeeeeeee (2 byte)
2 “hoạt động” của lệnh SJMP rel như sau:
(PC)←(PC)+2
(PC)←(PC)+byte_2
Đối chiếu vào đề bài ta có
(PC) ←(PC)đầu+2 với (PC)đầu=0400H
041FH =(PC)cuối ←(PC)+byte_2
Offset=byte_2=041FH-0400H-2H=1DH
CÁCH KHÁC:
Ta có:
Tra bảng lệnh SJMP rel hoạt động như sau:
(PC)←(PC)đầu+2
(PC)cuối←(PC)+rel
Suy ra: rel=(PC)cuối – (PC)=(PC)cuối –(PC)đầu –
2H=041FH-0400H-2H=1DH
19 Hãy cho biết sự khác biệt giữa 2 lệnh “INC A” và “INC ACC”
Có số byte là 1, mã đối tượng là: 00000100 Có số byte là 2, mã đối tượng là:
00000101 aaaaaaaa Dùng cách định địa chỉ thanh ghi Dùng cách định địa chỉ trực tiếp
20 Hãy cho biết nội dung của thanh ghi A là bao nhiêu sau khi thực hiện đoạn chương trình sau:
MOV A, #7FH; A←7FH
MOV 50H,#29H; Ô NHỚ 50H CHỨA GIÁ TRỊ 29H
MOV R0, #50H; R0 CHỨA GIÁ TRỊ 50
XCHD A, @R0; HOÁN ĐỔI NỮA THẤP NỘI DUNG THANH GHI A VỚI Ô NHỚ ĐƯỢC CHỨA TRONG R0 (TỨC LÀ Ô NHỚ 50H)
Đáp án: #79H
21 Viết chương trình chuyển một chuỗi dữ liệu gồm 10 byte trong RAM ngoài có địa chỉ đầu là 5F00H đến vùng RAM nội có địa chỉ đầu là 40H
Cách 1:Dùng vòng lặp CJNE:
ORG 0000H
MOV DPTR, #5F00H; DPTR trỏ tới địa chỉ ngoài 5F00H
MOV R0,#40H; R0 trỏ tới địa chỉ 40H trong RAM nội
LOOP: MOV A,@DPTR; Chép vào A 1 byte từ ô nhớ ngoài DPTR
MOVX @R0,A; Chép nội dung trong A ra địa chỉ được trỏ bởi R0
INC R0; tăng số địa chỉ trong R0
INC DPTR ; tăng số địa chỉ trong DPTR
CJNE R0,#4AH,LOOP; đủ 10 byte chưa?
END
Trang 8Cách 2: Dùng vòng lặp DJNZ:
ORG 0000H
MOV DPTR, #5F00H; DPTR trỏ tới địa chỉ ngoài 5F00H
MOV R0,#40H; R0 trỏ tới địa chỉ 40H trong RAM nội
MOV R7, #10; R7 chứa số lần lặp là 10
LOOP: MOV A,@DPTR; Chép vào A 1 byte từ ô nhớ ngoài DPTR
MOVX @R0,A; Chép nội dung trong A ra địa chỉ được trỏ bởi R0
INC R0; tăng số địa chỉ trong R0
INC DPTR ; tăng số địa chỉ trong DPTR
DJNZ R7,LOOP; đủ 10 byte chưa?
END
22 Cho một chuỗi dữ liệu gồm 20 byte liên tiếp trong RAM nội, bắt đầu từ địa chỉ 20H Hãy viết chương trình lần lượt xuất các dữ kiệu này ra Port 1
Dùng vòng lặp DJNZ
ORG 0000H
MOV R0,#20H; R0 trỏ tới địa chỉ 20H trong RAM nội
MOV R7, #20; R7 chứa số lần lặp là 20
LOOP: MOV A,@R0; Chép vào A 1 byte từ ô nhớ R0
MOV P1,A; Xuất nội dung thanh ghi A ra port 1
INC R0; Tăng số địa chỉ trong R0
DJNZ R7,LOOP; Đủ 20 byte chưa?
END
23 Cho một chuỗi ký tự dưới dạng mã ASCII trong RAM nội, dài 20 byte, bắt đầu từ địa chỉ 50H Viết chương trình đổi các ký tự in hoa có trong chuỗi này thành ký tự
thường Biết rằng mã ASCII của ký tự thường bằng mã ASCII của ký tự in hoa cộng thêm
32
ASCII thường=ASCII hoa +32
Suy ra để đổi ký tự in hoa có trong chuỗi này thành ký tự thường ta xoá bit 5 (hay trừ đi 32) trong mã ASCII ký tự in hoa
ORG 0000H
MOV R0,#50H; R0 trỏ tới địa chỉ 50H trong RAM nội
MOV R7, #20; R7 chứa số lần lặp là 20
LOOP: XCH A,@R0; Hoán đổi nội dung A và ô nhớ được trỏ bởi R0
ANL A,#11011111B; Xoá bit 5 trong mã ASCII,các bit khác giữ nguyên XCH A,@R0; Cất kết quả trở lại ô nhớ được trỏ bởi R0
INC R0; Tăng số địa chỉ trong R0
DJNZ R7,LOOP; Đủ 20 byte chưa?
END
24 Cho một chuỗi số 16 bit không dấu trong RAM nội gồm 10 số bắt đầu từ ô nhớ 30H theo nguyên tắc ô nhớ có địa chỉ nhỏ hơn chứa byte cao và ô nhớ có địa chỉ lớn hơn chứa byte thấp
(Ví dụ: byte cao của số 16 bit đầu tiên được cất tại ô nhớ 30H và byte thấp của số 16 bit đầu tiên được cất tại ô nhớ 31H) Hãy viết chương trình con cộng chuỗi số này và cất kết quả vào ô nhớ 2EH:2FH
+ Nguyên tắc: cộng mấy byte thấp lại với nhau lấy số dư cộng với lại mấy byte cao
code:
CLR A
CLR R0
MOV R1,#30H
MOV R2,#31H
Trang 9LOOP_1:
ADD A,@R2
INC R2
INC R2
JC NHAN_1 ; Nếu có dư thì chuyển sang NHAN_1 để thêm số dư NHAN_2
CJNE R2,#43H,LOOP_1
MOV 2FH,A
MOV A,R0
LOOP_2
ADD R0,@R1
INC R1
INC RI
CJNE R1,#42H,LOOP_2
MOV 2EH,A
NHAN_1
INC R0
CLR C
SJMP NHAN_2
25 Viết chương trình tạo ra sóng vuông 83.3KHz ở P1.0 (giả sử MCU hoạt động với xung clock 12MHz)
fosc= 12MHz -> fM=fosc/12=1 MHz-> TM=1s
f=83.3KHz -> T=0.012ms=12s
sóng vuông đối xứng tH=tL=6s=6TM
chương trình:
ORG 0000H
LOOP: CPL P1.0; 1 s
MOV R7, #3; 1 s
DJNZ R7,$; 2x3=6 s
SJMP LOOP; 2 s
END
7 Hãy xác định tần số của sóng vuông ở chân P1.5 cho bởi đoạn chương trình sau:
HERE: MOV TL0, #0F2H
ACALL DELAY SJMP HERE DELAY: SETB TR0
RET
Trang 10VÍ DỤ MỘT SỐ BÀI:
Bài 1: Viết chương trình lấy 10 byte RAM nội, địa chỉ bắt đầu là 30H ghi ra RAM ngoài ở
địa chỉ bắt đầu là 2000H
Giải:
Cách 1: dùng vòng lặp CJNE:
ORG 0000H
MOV R0,#30H; R0 trỏ tới địa chỉ 30H trong RAM nội
MOV DPTR, #2000H; DPTR trỏ tới địa chỉ ngoài 2000H
LOOP: MOV A,@R0; Ghi nội dung ô nhớ được trỏ bởi R0 vào A
MOVX @DPTR,A; chép nội dung trong A ra địa chỉ được trỏ bởi DPTR
INC R0; tăng số địa chỉ trong R0
INC DPTR ; tăng số địa chỉ trong DPTR
CJNE R0,#3AH,LOOP; đủ 10 byte chưa?
END
Chú ý:
lệnh MOVX có độ dài là 1byte nên muốn 10 byte thì phải tăng đến 3AH, nếu chưa tới thì LOOP cho tới rồi kết thúc chương trình
Cách 2: dùng vòng lặp DJNZ
ORG 0000H
MOV R0, #30H; R0 trỏ tới địa chỉ 30H trong RAM nội
MOV DPTR, #2000H; DPTR trỏ tới địa chỉ ngoài 2000H
MOV R7, #10; R7 chứa số lần lặp là 10
LOOP: MOV A, @R0; Ghi nội dung ô nhớ được trỏ bởi R0 vào A
MOVX @DPTR, A; chép nội dung trong A ra địa chỉ được trỏ bởi DPTR
INC R0; tăng số địa chỉ trong R0
INC DPTR ; tăng số địa chỉ trong DPTR
DJNZ R7,LOOP; đủ 10 byte chưa?
END
Bài 2: Viết chương trình tạo sóng vuông tuần hoàn đối xứng tại chân P1.0 có tần số là f=10KHz Giả sử
fosc=12 MHz
Giải:
fosc=12MHz T M =1 s
f=10KHz T=0,1 ms= 100 s
sóng vuông đối xứng TH=TL=50 s=50TM
chương trình:
ORG 0000H
LOOP: CPL P1.0
MOV R7, #23; R7 chứa số lần lặp là 23
DJNZ R7, $
SJMP LOOP ; lặp lại với chu kỳ tuần hoàn
END
Note:
$ là LOOP
Trang 11Một số lưu ý như sau:
Có 8 kiểu định địa chỉ đối với họ MCS-51: -Thanh ghi ( register)
-Trực tiếp ( direct )
-Gián tiếp ( indirect )
-Tức thời ( immediate )
-Tương đối ( relative )
-Tuyệt đối ( absolute )
-Dài ( long )
-Chỉ số ( index)