Một số kỹ thuật lập trình hợp ngữ 8051 - Pdf 12

VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 1/6
ĐHBK Tp HCM – BMĐT
Môn học: Vi xử lý
GVPT: Hồ Trung Mỹ
Một số kỹ thuật lập trình hợp ngữ 8051

1. Hãy trình bày các cách làm cho
a) Cờ Carry bằng 1
b) Cờ Carry bằng 0
Bài giải (BG). Cách tốt nhất là cách có đánh dấu *.
a) Cờ Carry bằng 1
Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC)
Cách 1 (*) SETB C
D
3
1

Cách 2
SETB CY
D
2 D7
2

Cách 3
CLR C
CPL C
C
3
B3
1


Cách 1 (*) CLR A
E
41
Cách 2
ANL A,#0
5
4 00 2
Cách 3
MOV A,#0
7
4 00 2
Cách 4
XRL A,0E0h  XRL A,ACC 65 E0 1
Cách 5
XRL 0E0h,A 
X
RL ACC,A
6
2 E0 1

3. Hoán đổi nội dung của
a) 4 bit cao với 4 bit thấp của thanh ghi A
b) Thanh ghi R1 và R2 ở bank 0
c) 2 byte trong RAM nội (TD: ở 30h và 32h)
BG.

Cách 1 (*) Cách 2 Cách 3
a) Hai nửa byte của A
SWAP A
R

P
USH 30h
PUSH 32h
POP 30h
POP 32h
MOV A,30h
MOV 30h,32h
MOV 32h,A4. So sánh thanh ghi A với B và kết quả tác động đến phép gán cho thanh ghi R7
Mã giả Chương tr
ì
nh h

p ng

#
1
C
hương trình hợp ng

#
2
if A = B then
R7  1
else
R7  2
CJNE A,B, ANEB
MOV R7, #1

R7  2
else
R7  3
CJNE A,
B
,
ANEB
AEQB: MOV R7,#2 ; khi A = B
SJMP CONT
ANEB: ; khi A <> B
JC ALTB
AGTB: ; xử lý khi A > B
MOV R7,#3
SJMP CONT
ALTB: ; xử lý khi A < B
MOV R7,#1
CONT:
Chú ý: SV tự viết code cho các trường hợp còn lại

5. Áp dụng lệnh so sánh và nhảy (CJNE) để cài đặt 1 số cấu trúc chương trình
Cấu trúc điều khiển trong giải thuật Chương trình hợp ngữ tương ứng

Giả sử XVAL và YVAL là các địa
chỉ trực tiếp

MOV A, XVAL
CJNE A, YVAL, L1
.
. Do something
.

Mã giả
D
ùng thanh ghi
R
7
làm biến Count
D
ùng thanh ghi
R
7
làm biến Count
Count  N
Loop:
. . .

Count  Count – 1
if Count  0 goto Loop
Next:
L
D
R
7
,
#
N

LOOP:

. . .


Loop:
. . .

until codition is true
Next:
;
T
D
:

c
ondition là Carry
CLR C ; cờ C  0
LOOP: ; trong vòng lặp có
; lệnh làm cờ C = 1 . . . JNC LOOP
NEXT:
;
TD: condition
l
à bit
CLR bit ; bit  0
LOOP:;trong vòng lặp có
;lệnh làm cờ bit = 1


SJMP LOOP
Task_1: . . . ; các lệnh thực hiện task1
SJMP LOOP

VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 4/6
TD: Áp dụng cho mạch xử lý LED sáng chạy sang trái hoặc phải tùy theo mức logic ở chân nhập

Với mạch trên chú ý là các công tắc tại cổng 0 cần có điện trở kéo lên. Hoạt động của mạch như sau:
 Nếu P1.1 = 0 thì 8 LED sẽ sáng từ phải sang trái, mỗi LED sáng trong 25ms.
 Nếu P1.1 = 1 thì 8 LED sẽ sáng từ trái sang phải, mỗi LED sáng trong 25ms.
 Đèn DS1 thể hiện trạng thái của phím S1, nếu có nhấn S1 thì đèn DS1 sáng.
 Đèn DB1 và DB2 thể hiện trạng thái của phím B1 và B2, nếu có nhấn phím B1 và B2 thì đèn DB1 và
DB2 tương ứng sẽ sáng.
Chươ
ng trình hợp ngữ cho mạch trên:
Pattern EQU 0FEh
ORG 0
MOV P0,#03H ; Đặt cấu hình nhập cho P0.1 và P0.0
MOV P3,#80H ; Đặt cấu hình nhập cho P3.7
MOV P1,#Pattern
Loop:
; Lấy trạng thái của các công tắc B1,S1 cất vào ACC
MOV A,P0
ANL A,#00000011B ; chỉ lấy P0.1 và P0.0
ORL A,# 10000000B ; Đặt cấu hình nhập cho P3.7
; Sao chép bit P3.7 vào bit P3.2
MOV C, P3.7
MOV ACC.2, C
MOV P3, A
; Xử lý cho LED chạy

}

S
ETB P1.0 ; đ

t cấu hình nh

p
LOOP: JNB P1.0, $ ; đợi P1.0 = 1
JB P1.0, $ ; đợi P1.0 = 0
Task: . . . ; các lệnh thực hiện task
SJMP LOOP
TD: Mạch sau mô phỏng bộ đếm lên nhị phân modulo 10 (đếm từ 0 đến 9 và lặp lại) với hiển thị LED 7 đoạn
được gắn ở cổng P0 và xung nhịp CK được nối vào chân P3.7
Mạch Chương trình
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1

1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1

MOV R0,#0 ; Số đếm ban đầu là 0
MOV P0,#0C0H; Đầu tiên hiển thị 0
LOOP:
JNB CK,$ ; Đợi CK o muc 1
JB CK,$ ; Đợi CK o muc 0
INC R0
CJNE R0,#10,NEXT ; kiểm tra tràn thì về 0
MOV R0,#0
NEXT:
MOV A,R0
ACALL BCD2LED
SJMP LOOP
BCD2LED:
MOV DPTR,#LED_DATA
MOVC A,@A+DPTR
MOV P0,A
RET
LED_DATA:
DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H
DB 0F8H, 80H, 90H
RET
END

10. Viết các chương trình con cài đặt các cổng logic AND, OR, và XOR 8 ngõ vào (8 bit trong thanh ghi A và
ngõ ra là cờ C)
AND 8 ngõ vào OR 8 ngõ vào XOR 8 ngõ vào
AND8:
CJNE A,#0FFH, AN_0
SETB C
RET

MOV DPTR,#STATE_TBL
MOV R0,#0 ; Chỉ thị đang ở trạng thái mấy
LOOP: MOV A, R0
MOVC A,@A+DPTR
MOV P2,A
INC R0
CJNE R0,#6,LOOP
MOV R0,#0
SJMP LOOP
STATE_TBL:
DB 4, 5, 3, 4, 5, 1
END
12. So sánh 2 số không dấu và có dấu (với biểu diễn bù 2) với CJNE. Vì khi so sánh CJNE thì 8051 luôn luôn
hiểu là so sánh với 2 số nhị phân không dấu! Do đó khi so sánh có dấu thì ta phải biến đổi trị
số của 2 số cần so
sánh rồi mới áp dụng CJNE được. Để dễ theo dõi, ta lấy TD với 2 số 3 bit (n=3)
Nhị phân Số không dấu Số có dấu (bù 2)
Số có dấu + 4
Nhị phân
000 0 0

4 100
001 1 +1

5 101
010 2 +2

6 110
011 3 +3


CONT:

MOV A
,
R2
XRL A,#80H ; đảo trị MSB
MOV B, A
MOV A, R1
XRL A,#80H ; đảo trị MSB
CJNE A, B, NEXT_S
NEXT_S: JNC AGEB
MOV R0, #2
SJMP CONT_S
MOV R0, #1
CONT_S:


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status