Tải bản đầy đủ (.pdf) (15 trang)

Khảo sát một số tập lệnh cơ bản của MSC

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (240.55 KB, 15 trang )


Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-1
BÀI 2:
KHẢO SÁT MỘT SỐ LỆNH TIÊU BIỂU MSC-51





I. Mục ñích bài thí nghiệm
Bài thực hành nhắm giúp học viên:
- Khảo sát một số lệnh cơ bản của MSC-51.
- Nắm ñược cấu trúc của chương trình viết cho MSC-51.
- Thực thi một số chương trình ñơn giản của MSC-51.
II. Cơ sở lý thuyết
1. Lập trình có cấu trúc
Lập trình có cấu trúc thường thấy rõ ràng nhất trong các ngôn ngữ C, Pascal, VB …
Trong hợp ngữ thì khó hình dung ñối với các bạn mới làm quen với chúng. ðể ñơn
giản hoá, một số lệnh có cấu trúc tương ñương ñược trình bài bên dưới giúp cho các
bạn sinh viên hình dung về lập trình có cấu trúc trong hợp ngữ.
- Cấu trúc “repeat… until”
Repeat
<action>
Until <condition>
Ngôn ngữ Assembly
LOOP:
<action>
JUMP_if_not_<condition>,LOOP
Ví dụ:: Cấu trúc “repeat… until”


Repeat

Until A = 0
Ngôn ngữ Assembly
LOOP:

JNZ LOOP
- Cấu trúc “while… do”
while <condition> do <action>
Ngôn ngữ Assembly
LOOP: JUMP_if_not_<condition>,DO
SJMP STOP
DO: <action>
SJMP LOOP
STOP:
Ví dụ: Cấu trúc “while… do”
R7 = 0
while R7 <> 10 do {

R7 = R7 + 1
}

Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-2
Ngôn ngữ Assembly
MOV R7,#0
LOOP: CJNE R7,#10,DO
SJMP STOP
DO:

INC R7
SJMP LOOP
STOP:
- Cấu trúc “if… then… else”
if <condition> then
<action 1>
else <action 2>
Ngôn ngữ Assembly
JUMP_if_not_<condition>,ELSE
<action 1>
SJMP DONE
ELSE: <action 2>
DONE:
Ví dụ: Cấu trúc “if… then… else”
if P0.1 = 0 then
R7 = R7 + 1
else R7 = 0
Ngôn ngữ Assembly
JB P0.1,ELSE
INC R7
SJMP DONE
ELSE: MOV R7,#0
DONE:
Ví dụ: Cấu trúc “case… of…”
case P1 of
#11111110b: P2.0 = 1
#11111101b: P2.1 = 1
#11111011b: P2.2 = 1
else P2 = 0
end

Ngôn ngữ Assembly
CJNE P1,#11111110b,
SKIP1 SETB P2.0
SJMP EXIT
SKIP1: CJNE P1,#11111101b,SKIP2
SETB P2.1
SJMP EXIT
SKIP2: CJNE P1,#11111011b,SKIP3
SETB P2.2
SJMP EXIT
SKIP3: MOV P2,#0
EXIT:






Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-3
2. Cơ sở lý thuyết


Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-4


Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51


Trang II-5











Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-6
III. Phần thực hành
1. Thiết bị thực hành.
 Board thực hành ET-LAB3A PC, module SCAN-7SEGMENT&LED.
 Một máy tính ñể soạn chương trình, biên dịch và nạp chương trình xuống board
thí nghiệm.
 Dây kết nối với máy tính.
2. Thực hành các lệnh cơ bản
a. Nhóm lệnh di chuyển dữ liệu và chuyển ñiều khiển không ñiều kiện
Bài 1: Dùng Keil soạn thảo ñoạn chương trình mẫu ñiều khiển module SCAN-
7SEGMENT&LED theo chu trình sau: 4 bit thấp trên PORT1 sáng  4 bit cao trên
PORT1 tắt  4 bit thấp trên PORT1 tắt  4 bit cao trên PORT1 sáng và lặp lại quá
trình trên.
ORG 0000H
LJMP MAIN

MAIN:
MOV P1,#0F0H ; 4 bit thap cua PORT1 sang, 4 bit cao tat
CALL DELAY_xS
MOV P1,#0FH ; 4 bit thap cua PORT1 tat, 4 bit cao sang
CALL DELAY_xS
LJMP MAIN
DELAY_xS: MOV R1, #20
L1: MOV R2, #200
L2: MOV R3, #255
DJNZ R3, $
DJNZ R2, L2
DJNZ R1, L1
RET
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Hãy biên dịch và nạp chương trình trên cho Vi ñiều khiển. Kết nối
PORT1 của Vi ñiều khiển với Moduke LED và sau ñó ấn nút Reset ñể
thực thi chương trình. Quan sát kết quả trên 8 LED ñơn.

Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang II-7
- Giải thích ý nghĩa của lệnh DJNZ R3, $ ñược sử dụng trong chương
trình con Delay. Lệnh này lặp lai bao nhiêu lần trong chương trình con.
Lệnh này có thể viết lại khác ñược không ? Nếu ñược hãy viết lại nó.
Biên dịch cho cho thực thi chương trình ñể kiểm chứng.
- Nếu bỏ lệnh LJMP MAIN, thì chương trình trên sẽ hoạt ñộng như thế
nào ? Giải thích tại sao ?. Hãy kiểm chứng bằng cách biên dịch và cho
chạy lại chương trình
- Lệnh MOV P1,#0F0H và MOV P1,0F0H có khác nhau không ?

- Sửa lại chương trình sao cho 4 bit on/off chỉ hoạt ñộng chỉ 10 lần trong
chương trình
- Sửa lại chương trình cho 8 LED sáng tắt xen kẽ nhau luân phiên nhau,
quá trình này ñược lặp lại liên tục.
Bài 2: Viết chương trình xuất dữ liệu ra PORT1 theo qui luật như bảng bên dưới, và
lặp lại khi chạy hết chu kỳ:
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
1 0 0 0 0 0 0 1
0 1 0 0 0 0 1 0
0 0 1 0 0 1 0 0
0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 1 0 0 1 0 0
0 1 0 0 0 0 1 0
1 0 0 0 0 0 0 0
ðoạn code mẫu  cấu trúc cơ bản của chương trình hợp ngữ cho AT89C51. Làm
quen với lệnh MOV
ORG 0000H
LJMP MAIN
MAIN: MOV A, #81H
MOV P1, A
CALL DELAY
MOV A, #42H
CALL DELAY
MOV A, #24H
MOV P1, A
CALL DELAY
MOV A, #18H
CALL DELAY
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51

Trang 8
MOV A, #18H
MOV P1, A
CALL DELAY
MOV A, #24H
CALL DELAY
MOV A, #42H
MOV P1, A
CALL DELAY
MOV A, #81H
CALL DELAY
LJPM MAIN
DELAY: MOV R0, #50
LAP1: MOV R1, #100
DJNZ R1, $
DJNZ R0, LAP1
RET
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Soạn thảo và kiểm tra lỗi, biên dịch ñoạn chương trình trên sau ñó load
xuống vi ñiều khiển.
- Chạy chương trình và quan sát kết quả xem có ñúng như bảng mô tả hoạt
ñộng của PORT1 không ?
- Thử thay thế các giá trị nạp vào R0 và R1 sao cho kết quả dễ quan sát nhất.
Cho biết khoảng giá trị nhỏ nhất và giá trị lớn nhất có thể nạp cho R0 và R1
sao cho kết quả dễ quan sát nhất. Từ ñó hãy cho biết thời gian Delay tương
ứng với giá trị của R0 và R1
- Nếu cho thanh ghi R0 =0, thì lệnh DJNZ R1, $ lặp lại bao nhiêu lần ?.
- Hãy viết lại chương trình trên bằng phương pháp khác sao cho có thể ñiều
khiển PORT1 hoạt ñộng như bảng trên. (Gợi ý: Dùng lệnh MOVC A,

@A+DPTR và bảng dữ liệu TABLE … chứa các giá trị cần xuất ra PORT1)
b. Nhóm lệnh rẽ nhánh có ñiều kiện
Bài 1: Dùng Keil soạn thảo ñoạn chương trình mẫu ñiều khiển module SCAN-
7SEGMENT&LED theo chu trình sau: xuất ra PORT0 của vi ñiều khiển các giá trị từ
0 ñến 9.
ORG 0000H
LJMP MAIN
MAIN:
MOV P0,#0FFH;8 bit cua PORT0 sáng
CALL DELAY_XS
MOV P0,#00H; 8 bit cua PORT0 tắt
CALL DELAY_XS
MOV A, #0
LAP: MOV P0, A
CALL DELAY_XS
INC A
CJNE A, #10, LAP
JMP $
DELAY_XS:
MOV R1, #20
L1: MOV R2, #200
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-9
L2: MOV R3, #255
DJNZ R3, $
DJNZ R2, L2
DJNZ R1, L1
RET
END
• Sinh viên hãy thực hiện các yêu cầu sau:

- Hãy biên dịch và nạp chương trình trên cho Vi ñiều khiển. Kết nối
PORT0 của Vi ñiều khiển với Moduke LED và sau ñó ấn nút Reset ñể
thực thi chương trình. Quan sát kết quả trên 8 LED ñơn. Mô tả hoạt ñộng
của chương trình và vẽ lưu ñồ thực chương trình.
- Nếu muốn cho chương trình thực thi vô hạn thì chúng ta phải làm sao ?.
Biên dịch và nạp chương trình cho vi ñiều khiển ñể kiểm chứng.
Bài 2: Viết chương trình kiểm tra nội dung của thanh ghi A. Nếu nội dung thanh ghi A
nhỏ hơn 10 thì xuất nội dung của thanh ghi A ra PORT1, nếu nội dung thanh ghi A
lớn hơn hoặc bằng 10 thì xuất giá trị 10 ra PORT1. ðoạn chương trình mẫu bên dưới
ORG 0000H
LJMP MAIN
MAIN:
MOV A, #11
CJNE A,#10,KHACNHAU ; So sanh A voi 10
JMP XUAT10 ; neu bang A thi xuat gia tri 10
KHACNHAU:
JC XUATA ; Neu CF=1, vi lay A-10 neu A<10 thi phai muon
; -> CF =1
XUAT10: ; Xuat noi dung trong A ra P1
MOV P1,#10
SJMP EXIT
XUATA:
MOV P1,A
EXIT:
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Soạn thảo và biên dịch ñoạn chương trình mẫu trên. Sau ñó nạp
chương trình xuống vi ñiều khiển ñể kiểm chứng.
- Hãy thử thay ñổi các giá trị trong thanh ghi A sao cho 10 <=A<= 0 ñể
kiểm chứng.

Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-10
- Sửa chương trình ñể so sánh 2 số X và Y. Nếu X=>Y thì xuất ra
PORT0 giá trị 0F0H, ngược lại nếu X<Y thì xuất ra giá trị 0FH ra
PORT0.
- Sửa chương trình ñể so sánh 2 số X và Y. Nếu X=>Y thì xuất ra
PORT0 giá trị 0F0H on/off 3 lần, ngược lại nếu X<Y thì xuất ra giá
trị 0FH ra PORT0 on/off 3 lần.
c. Nhóm lệnh thao tác trên bit
Bài 1: Viết chương trình cho LED nhấp nháy.
Dùng Keil ñể soạn thảo và biên dịch ñoạn chương trình bên dưới.
ORG 0000H
LJMP MAIN
MAIN:
SETB P2.0
ACALL DELAY
CLR P2.0
ACALL DELAY
SJMP MAIN
DELAY:
MOV R6, #0FFH
L1: MOV R7, #0FFH
DJNZ R7, $
DJNZ R6, L1
RET
END

• Sinh viên hãy thực hiện các yêu cầu sau:
- Nhìn vào ñoạn Code trên, sinh viên hãy tự kết nối PORTx ñiều khiển với
module diều khiển LED 7 ñoạn và LED.

- Biên dịch và nạp chương trình cho vi ñiều khiển. Quan sát kết quả
chương trình.
- Sửa lại chương trình trên sao cho khi ấn SW1 (tác ñộng cạnh xuống) 
LED sáng một lúc rồi tắt. Giả sử sử dụng Px.2 (hoặc Px.3) làm SW1 (ngõ
vào  tác ñộng cạnh xuống) và P2.0 là ngõ ra dùng ñiều khiển LED ñơn.
Các bạn có thể sử dụng gợi ý như sau: khi P3.0 dùng làm ngõ vào thì
phải SETB Px.2; JNB Px.2, $; JB Px.2, $; Biên dịch và cho thực thi
chương trình ñể kiểm chứng. Sau ñó sửa lại chương trình Delay ñể cho
LED sáng/tắt với thời gian lâu hơn.
Bài 2: Viết chương trình xuất dữ liệu ra PORT1 theo qui luật như bảng bên dưới, và
lặp lại khi chạy hết chu kỳ:
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
1 0 0 0 0 0 0 0
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-11
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1

ORG 0000H
LJMP MAIN
MAIN:
MOV P1,#0FFH
CLR P1.7
CALL DELAY_XS
SETB P1.7

CLR P1.6
CALL DELAY_XS
SETB P1.6
CLR P1.5
CALL DELAY_XS
SETB P1.5
CLR P1.4
CALL DELAY_XS
SETB P1.4
CLR P1.3
CALL DELAY_XS
SETB P1.3
CLR P1.2
CALL DELAY_XS
SETB P1.2
CLR P1.1
CALL DELAY_XS
SETB P1.1
CLR P1.0
CALL DELAY_XS
SETB P1.0
LJPM MAIN
;DELAY_XS:
MOV R1, #20
L1: MOV R2, #200
L2: MOV R3, #255
L3: DJNZ R3, L3
DJNZ R2, L2
DJNZ R1, L1
RET

END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Soạn thảo và kiểm tra lỗi, biên dịch ñoạn chương trình trên sau ñó load
xuống vi ñiều khiển.
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-13
- Chạy chương trình và quan sát kết quả xem có ñúng như bảng mô tả hoạt
ñộng của PORT1 không ? Hãy sửa lại thời gian trì hoãn trong chương
trình con DELAY_xS sao cho led hiển thị dễ quan sát nhất. Kiểm chứng
lại sự thay ñổi này ?
- Lệnh DJNZcó thể thay thế bằng lệnh CJNE hay không ?. Nếu ñược hãy
thay thế lệnh DJNZ R1, L1 bằng lệnh CJNE xy, yy,zz. Hãy biên dịch và
chạy chương trình trên vi ñiều khiển ñể kiểm chứng.
- Sửa lại chương trình ñể cho LED hoạt ñộng như bảng sau:
P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
- Hãy viết lại chương trình trên bằng phương pháp khác sao cho có thể ñiều
khiển PORT1 hoạt ñộng như bảng trên. (Gợi ý: Dùng lệnh MOVC A,
@A+DPTR và bảng dữ liệu TABLE … chứa các giá trị cần xuất ra
PORT1).
d. Nhóm lệnh số học
Bài 1: Thực thi chương trình sau và kiểm tra kết quả:
ORG 0000H

JMP MAIN
MAIN:
MOV A,#19h
ADD A,#72h
MOV P0,A
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Sửa lại chương trình trên sao cho nếu kết quả phép toán cộng có tràn thì
xuất giá trị 0F0h ra PORT0, ngược lại xuất 0Fh ra PORT0 sau khi ñã xuất
kết quả của phép toán cộng ra PORT0. Chú ý phải viết thêm chương trình
con Delay trì hoãn ñể xem kết quả.
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-14
- Sửa lại ñoạn chương trình trên sao cho có thể cộng ñược 2 con số 4 byte,
lần lượt xuất từng byte kết quả ra PORT0. Chú ý phải có Delay trì hoãn ñể
xem kết quả. Gợi ý dùng lệnh ADDC cho phép cộng với cờ CF (dĩ nhiên
ñể kết quả cộng byte ñầu tiên chính xác chúng ta nên dùng CLR C ñể xoá
cờ CF). DJNZ ñể lặp lại 4 lần cộng mỗi lần 1 byte …
- Làm lại chương trình mẫu trên nếu thay lệnh ADD bằng lệnh SUBB
Bài 2: Thực thi chương trình sau và kiểm tra kết quả:
ORG 0000H
JMP MAIN
MAIN:
MOV A,#57h
MOV B,#10
DIV AB
MOV P0,A
CALL DELAY_XS
MOV A,B
MOV P0,A

CALL DELAY_XS
DELAY_XS:
MOV R1, #20
L1: MOV R2, #200
L2: MOV R3, #255
L3: DJNZ R3, L3
DJNZ R2, L2
DJNZ R1, L1
RET
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Sửa lại chương trình trên ñể thực hiện phép toán nhân nội dung của hai
thanh ghi A và B.
e. Nhóm lệnh logic
Bài 1: Thực thi chương trình hoạt ñộng như bảng bên dưới
P1.7

P1.6

P1.5

P1.4

P1.3

P1.2

P1.1

P1.0


1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-14

ORG 0000H
LJMP MAIN
MAIN:
CLR C
MOV R7, #8 ; số lần quay phải
MOV A, #7FH
LAP:
MOV P1, A
RRC A
CPL C
CALL DELAY_XS
DJNZ R7, LAP
DELAY_XS:
MOV R1, #20
L1: MOV R2, #200
L2: MOV R3, #255
L3: DJNZ R3, L3
DJNZ R2, L2

DJNZ R1, L1
RET
END
• Sinh viên hãy thực hiện các yêu cầu sau:
- Kiểm chứng kết quả với các trạng thái hoạt ñộng cho nhu bảng bên trên.
- Hãy cho biết phương thức thiện lệnh RRC.
- Sửa lại lệnh RRC thành lệnh RLC, cho chạy lai chương trình, kiểm tra
kết quả.
- Sửa lại chương trình sao cho nó hoạt ñộng như bảng bên dưới. Cho chay
chương trình và kiểm tra kết quả.
P1.7

P1.6

P1.5

P1.4

P1.3

P1.2

P1.1

P1.0

0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 1 1
0 0 0 0 1 1 1 1

0 0 0 1 1 1 1 1
0 0 1 1 1 1 1 1
0 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

Bài 2: Khảo sát một số tập lệnh cơ bản của MSC-51
Trang II-15
- Sửa lại chương trình sao cho nó hoạt ñộng như bảng bên dưới và lặp lại
chu trình này. Cho chay chương trình và kiểm tra kết quả
P1.7

P1.6

P1.5

P1.4

P1.3

P1.2

P1.1

P1.0

1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0

1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1
0 0 1 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Bài tập bắt buộc làm thêm
:
1. Viết chương trình ñổi số thập phân (có kích thước 1 byte) ra số nhị phân 8
bit. Xuất kết quả ra PORT1.
2. Viết chương trình ñổi số thập lục phân (có kích thước 1 byte) ra số nhị phân
8 bit. Xuất kết quả ra PORT1.
3. Viết chương trình ñổi số nhị phân 8 bit ra số thập phân (có kích thước 1
byte). Xuất kết quả ra PORT1.
Hết

×