Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 7

Lệnh di chuyển dữ liệu (Data Transfer Instructions)

1. MOV A, #data 1ck


o Opcode: 74
o Operand: Immediate data
2. MOV Rn, #data 1ck
o Opcode: 78 + n (n là số của thanh ghi R0 đến R7, ví dụ: 78 cho R0, 79 cho
R1,...)
o Operand: Immediate data
3. MOV direct, #data 2ck
o Opcode: 75
o Operand: Direct address và immediate data
4. MOV A, direct 2ck
o Opcode: E5
o Operand: Direct address
5. MOV direct, A 2ck
o Opcode: F5
o Operand: Direct address
6. MOV A, @Ri 1ck
o Opcode: E6 cho R0, E7 cho R1
7. MOV @Ri, A
o Opcode: F6 cho R0, F7 cho R1
8. MOV direct, direct 2ck
o Opcode: 85
o Operand: 2 direct addresses
9. MOV A, #data 1ck
o Opcode: 74
o Operand: Immediate data
10. MOV DPTR, #data16 2ck
o Opcode: 90
o Operand: Immediate 16-bit data

Lệnh toán học và logic (Arithmetic and Logic Instructions)

1. ADD A, #data 1ck


o Opcode: 24
o Operand: Immediate data
2. ADD A, direct 2ck
o Opcode: 25
o Operand: Direct address
3. ADD A, @Ri 1ck
o Opcode: 26 cho R0, 27 cho R1
4. ADD A, Rn 1ck
o Opcode: 28 + n (n là số của thanh ghi R0 đến R7, ví dụ: 28 cho R0, 29 cho
R1,...)
5. SUBB A, #data 1ck
o Opcode: 94
o Operand: Immediate data
6. SUBB A, direct 2ck
o Opcode: 95
o Operand: Direct address
7. SUBB A, @Ri 1ck
o Opcode: 96 cho R0, 97 cho R1
8. SUBB A, Rn
o Opcode: 98 + n (n là số của thanh ghi R0 đến R7)

Lệnh logic (Logic Instructions)

1. ANL A, #data 1ck


o Opcode: 54
o Operand: Immediate data
2. ANL A, direct 2ck
o Opcode: 55
o Operand: Direct address
3. ANL A, @Ri 1ck
o Opcode: 56 cho R0, 57 cho R1
4. ANL A, Rn 1ck
o Opcode: 58 + n (n là số của thanh ghi R0 đến R7)
5. ORL A, #data 1ck
o Opcode: 44
o Operand: Immediate data
6. ORL A, direct 2ck
o Opcode: 45
o Operand: Direct address
7. ORL A, @Ri 1ck
o Opcode: 46 cho R0, 47 cho R1
8. ORL A, Rn 1ck
o Opcode: 48 + n (n là số của thanh ghi R0 đến R7)
9. XRL A, #data 1ck
o Opcode: 64
o Operand: Immediate data
10. XRL A, direct 2ck
o Opcode: 65
o Operand: Direct address
11. XRL A, @Ri 1ck
o Opcode: 66 cho R0, 67 cho R1
12. XRL A, Rn 1ck
o Opcode: 68 + n (n là số của thanh ghi R0 đến R7)

Lệnh kiểm tra và nhảy (Jump and Call Instructions)


1. SJMP rel 2or3
o Opcode: 80
o Operand: Relative address
2. AJMP code addr 2ck
o Opcode: 01, 21, 41, 61, 81, A1, C1, E1 (mã cụ thể phụ thuộc vào trang
code)
3. LJMP code addr 2ck
o Opcode: 02
o Operand: 16-bit code address
4. JZ rel 2ck
o Opcode: 60
o Operand: Relative address
5. JNZ rel 2ck
o Opcode: 70
o Operand: Relative address

Lệnh điều khiển (Control Instructions)

1. NOP 1ck
o Opcode: 00
2. RET 2ck
o Opcode: 22
3. RETI 2ck
Opcode: 32
o
4. SETB bit 2ck
o Opcode: D2
o Operand: Bit address
5. CLR A 1ck
o Opcode: E4
6. CLR bit 2ck
o Opcode: C2
o Operand: Bit address

Câu 2 (2 điểm): a) Trình bày về cấu trúc bộ nhớ RAM trong của vi xử lý 8051? (0.5 đ)
b) Cho đoạn chương trình Assembly của 8051 như sau: ….
MOV 20H, #55H
MOV A, #95H
MOV B, #9FH
ADD A, B
MOV R0, A
MOV 07H, C ….
- Dịch đoạn chương trình trên ra mã máy dạng hexa (0.5 đ)
- Đoạn chương trình trên mất bao nhiêu chu kì máy để thực hiện? Chú thích cho từng lệnh. (0.5 đ) - Sau
khi thực hiện đoạn chương trình trên, nội dung ô nhớ trong RAM có địa chỉ 20H nhận giá trị bao nhiêu?
Giải thích? (0.25 đ)
- Sau khi thực hiện đoạn chương trình trên, thanh ghi PSW nhận giá trị bao nhiêu? Giải thích? Biết trước
đó thanh ghi này đang có giá trị 00H. (0.25 đ)

Giải
Chú thích cho từng lệnh:

1. MOV 20H, #55H --> 75 20 55 --> 2 chu kỳ máy


2. MOV A, #95H --> 74 95 --> 1 chu kỳ máy
3. MOV B, #9FH --> F5 9F --> 1 chu kỳ máy
4. ADD A, B --> 2F --> 1 chu kỳ máy
5. MOV R0, A --> F8 --> 1 chu kỳ máy
6. MOV 07H, C --> 92 E0 --> 2 chu kỳ máy

Tổng cộng: 2 + 1 + 1 + 1 + 1 + 2 = 8 chu kỳ máy

3. Sau khi thực hiện đoạn chương trình trên, nội dung ô nhớ
trong RAM có địa chỉ 20H nhận giá trị bao nhiêu?
Sau khi thực hiện đoạn chương trình trên, nội dung ô nhớ trong RAM có địa chỉ 20H sẽ nhận giá
trị là 55H. Lý do là vì lệnh MOV 20H, #55H đã gán giá trị 55H vào địa chỉ 20H.

4. Sau khi thực hiện đoạn chương trình trên, thanh ghi PSW
nhận giá trị bao nhiêu?
Trước khi thực hiện đoạn chương trình, thanh ghi PSW có giá trị là 00H. Sau khi thực hiện đoạn
chương trình, các bit của PSW có thể thay đổi dựa trên kết quả của phép tính ADD A, B.

Kết quả của phép tính ADD A, B là:

A = 95H
B = 9FH
A + B = 95H + 9FH = 134H (vượt quá 8 bit)

Sau phép tính, A sẽ chứa giá trị 34H (phần thấp của kết quả), bit Carry (C) của PSW sẽ được đặt
thành 1 vì có sự tràn số ra ngoài 8 bit.

Do đó, PSW sẽ nhận giá trị là 82H (bit C=1 và các bit khác giữ nguyên).
Câu 3: Sử dụng Timer 0 chế độ 16-bit tạo 10 xung vuông (Ton = Toff = 50%) tần số 100 Hz tại
cổng P1.3 Biết xung nhịp thạch anh 12MHz - Tính toán giá trị cần nạp vào trong thanh ghi TH0, TL0.
(0.5 đ) - Thiết lập chế độ Timer 0 (0.5 đ) - Viết lưu đồ thuật toán thực hiện công việc. (1 đ) - Viết đoạn
chương trình thực hiện công việc theo lưu đồ thuật toán trên. (1 đ)

1. Tính toán giá trị cần nạp vào trong thanh ghi TH0, TL0

Để tạo ra 10 xung vuông với tần số 100 Hz tại cổng P1.3, cần xác định thời gian cần thiết cho
mỗi chu kỳ (Ton + Toff). Với tần số 100 Hz, mỗi chu kỳ là:

Ton = Toff = 5 ms (vì duty cycle là 50%)

Với xung nhịp thạch anh 12 MHz, tần số máy là 12 MHz / 12 = 1 MHz (1 chu kỳ máy = 1 µs).

Do đó, để tạo ra thời gian 5 ms cần có số lượng chu kỳ máy là:

Soˆˊ chu kyˋ maˊy=5 ms=5000 µs=5000 chu kyˋ maˊy\text{Số chu kỳ máy} = 5 \text{ ms} =
5000 \text{ µs} = 5000 \text{ chu kỳ máy}Soˆˊ chu kyˋ maˊy=5 ms=5000 µs=5000 chu kyˋ maˊy

Vì Timer 0 ở chế độ 16-bit, nó đếm từ 0 đến 65535. Do đó, giá trị cần nạp vào thanh ghi TH0,
TL0 là:

Giaˊ trị caˆˋn nạp=65536−5000=60536=0xEC78\text{Giá trị cần nạp} = 65536 - 5000 = 60536 =
0xEC78Giaˊ trị caˆˋn nạp=65536−5000=60536=0xEC78

TH0 = 0xEC (giá trị cao) TL0 = 0x78 (giá trị thấp)

2. Thiết lập chế độ Timer 0

Thiết lập chế độ cho Timer 0 ở chế độ 16-bit (mode 1):

 TMOD = 0x01 (Timer 0, mode 1)


 TH0 = 0xEC
 TL0 = 0x78
 TR0 = 1 (Bật Timer 0)

3. Viết lưu đồ thuật toán


Lưu đồ thuật toán bao gồm các bước sau:

1. Khởi tạo thanh ghi Timer 0.


2. Khởi tạo cổng P1.3 ở mức thấp.
3. Bắt đầu Timer 0.
4. Chờ đến khi Timer 0 tràn (TF0 = 1).
5. Đổi trạng thái cổng P1.3 (từ cao xuống thấp hoặc ngược lại).
6. Xóa cờ tràn của Timer 0 (TF0 = 0).
7. Nạp lại giá trị cho TH0 và TL0.
8. Lặp lại bước 4 đến bước 7 cho đến khi đủ 10 xung.
9. Dừng Timer 0.

Câu 4: Viết chương trình nhận 100 byte từ cổng UART của 8051 theo chế độ 1, tốc độ 9600bps. Dữ
liệu nhận được cất vào bộ nhớ ngoài có địa chỉ từ 1000H. Biết thạch anh sử dụng có tần số là 11,0592
MHz
ORG 0H ; Đặt vùng nhớ bắt đầu từ địa chỉ 0H

MOV DPTR, #1000H ; Khởi tạo con trỏ DPTR đến vùng nhớ bắt đầu từ địa chỉ 1000H

MOV R7, #100H ; Đặt R7 = 100 (số byte cần nhận)

MOV SCON, #50H ; Thiết lập UART: 8 bit dữ liệu, 1 bit stop, chế độ 1
MOV TMOD, #20H ; Thiết lập Timer 1 để tính toán baud rate

MOV TH1, #-6 ; Tốc độ baud rate 9600 bps với thạch anh 11.0592 MHz
MOV TL1, #-6

SETB TR1 ; Bật Timer 1

AGAIN:
JNB RI, AGAIN ; Chờ cho đến khi nhận được ký tự

MOV A, SBUF ; Đọc dữ liệu từ SBUF vào thanh ghi A


INC DPTR ; Tăng con trỏ DPTR để lưu vào vùng nhớ tiếp theo
MOVX @DPTR, A ; Lưu dữ liệu từ thanh ghi A vào bộ nhớ ngoài

CLR RI ; Xóa cờ nhận

DJNZ R7, AGAIN ; Lặp lại cho đến khi nhận được 100 byte

SJMP $ ; Dừng chương trình

You might also like