1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

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

6 679 14
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 6
Dung lượng 311,78 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

Đ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 3 CLR C

b) Cờ Carry bằng 0

Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC)

Cách 3 SETB C

Chú ý: Ngoài ra các lệnh cộng/trừ/xoay bit cũng làm thay đổi giá trị của cờ Carry!

2 Hãy trình bày các cách xóa thanh ghi A và cho biết cách nào tốt nhất

BG

Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC)

Cách 4 XRL A,0E0h  XRL A,ACC 65 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

a) Hai nửa byte của A SWAP A RL A

RL A

RL A

RL A

RR A

RR A

RR A

RR A

b) Thanh ghi R1và R2

(ở bank 0)

XCH A,R1 XCH A,R2 XCH A,R1

PUSH 1 PUSH 2 POP 1 POP 2

MOV A,R1 MOV 1,2 MOV R2,A

c) 2 byte trong RAM nội

(TD: ở 30h và 32h)

XCH A,30h XCH A,32h XCH A,30h

PUSH 30h PUSH 32h POP 30h POP 32h

MOV A,30h MOV 30h,32h MOV 32h,A

4 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

if A = B then

R7  1

else

R7  2

CJNE A,B, ANEB MOV R7, #1 SJMP CONT ANEB: MOV R7, #2 CONT:

XRL A, B JNZ ANEB MOV R7,#1 SJMP CONT:

ANEB: MOV R7,#2 CONT:

Trang 2

if A > B then

R7  1

else

R7  2

CJNE A, B, ANEB ALEB: ; khi A <= B MOV R7,#2 SJMP CONT ANEB: ; xử lý khi A > B

JC ALEB MOV R7,#1 CONT:

if A < B then

R7  1

else

if A = B then

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

L1:

CJNE op1 op2, label

if (op1 < op2)

C  1 else

C  0

MOV A, XVAL CJNE A,YVAL, L1 L1: JNC L2

Do Something

L2:

MOV A, XVAL CJNE A, YVAL, L1 SJMP L2

L1: JNC L3 L2:

L3:

Trang 3

Chú ý: Ta có thể biến đổi điều kiện so sánh, TD như điều kiện X<=Y có thể đổi thành NOT(Y<X) như sau:

6 Thực hiện cấu trúc điều khiển thực hiện vòng lặp trong N lần ( N= 1  255)

Count  N

Loop:

Count  Count – 1

if Count  0 goto Loop

Next:

LD R7,#N LOOP:

DEC R7 CJNE R7,#0,LOOP NEXT:

LD R7,#N LOOP:

DJNZ R7,LOOP NEXT:

Chú ý:

 N là hằng số được định nghĩa bằng EQU

 Trong vòng lặp không có thay đổi biến Count ! (trừ cuối vòng lặp)

 Trường hợp đặc biệt nếu N = 0 thì với cấu trúc này nó thực hiện lặp 256 lần

7 Thực hiện cấu trúc điều khiển repeat … until

repeat

Loop:

until codition is true

Next:

; TD: condition 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

JNB bit LOOP NEXT:

Chú ý:

 Nếu nhãn LOOP quá xa thì có thể dùng AJMP hay LJMP, khi đó JNC LOOP được viết thành 2 lệnh liên tiếp JC NEXT và LJMP LOOP

 bit là 1 biến Boole TD như cờ F0, địa chỉ bit 00H (là bit 0 của byte có địa chỉ 20H), ACC.0, TF0, …

8 Hỏi vòng kiểm tra mức của 1 chân nhập (TD: P1.0) để thực hiện công việc cho mức 0 hay 1

Mã giả Chương trình hợp ngữ

while (1)

{

if P1.0 = 0 then

do task0 else

do task1 }

SETB P1.0 ; đặt cấu hình nhập LOOP: JB Task_1

Task_0: ; các lệnh thực hiện task0 SJMP LOOP

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

Trang 4

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

MOV A, P1

JB P0.1, RoR

; Xoay trái P1

RL A

SJMP Next

RoR: ; Xoay phải P1

RR A

Next: MOV P1, A

; Làm trễ 25ms

ACALL DELAY_25MS

DELAY_25MS:

; Chương trình này đúng với XTAL = 12 MHz MOV R1, #250

L1: MOV R0,#50 DJNZ R0, $ DJNZ R1, L1 RET

END

Trang 5

9 Hỏi vòng kiểm tra cạnh xuống của 1 chân nhập (TD: P1.0) khi có thì thực hiện công việc (task)

Mã giả Chương trình hợp ngữ

while (1)

{

if P1.0 =  then

do task }

SETB 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 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32

P2.7/A15 28

P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27

P1.0

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 15

U1

80C51

X1 12MHz CX1

33p CRST

10n

RRST

10k

R1 270R

R2 270R

R3 270R

R4 270R

R5 270R

R6 270R

R7 270R

ORG 0

MOV P0,#0C0H; Đầu tiên hiển thị 0 LOOP:

CJNE R0,#10,NEXT ; kiểm tra tràn thì về 0

NEXT:

ACALL BCD2LED SJMP LOOP BCD2LED:

MOV DPTR,#LED_DATA

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

AN_0:

CLR C

RET

OR8:

CJNE A,#0, OR_1 CLR C

RET OR_1:

SETB C RET

XOR8:

MOV C,P RET

Chú ý:

Cờ P luôn luôn bằng XOR của 8 bit trong thanh ghi A

11 Cài 1 hệ tuần tự đồng bộ không ngõ vào TD: Viết chương trình tạo dạng sóng sau (giả có sẵn chương trình

làm trễ 1 giây DELAY_1S)

Bài giải

Trang 6

Cách tổng quát để giải loại bài toán này là tìm biểu diễn tương đương máy trạng thái của nó Với TD trên ta thấy có thể phân tích thành máy trạng thái với chu kỳ của 1 trạng thái là 1s như sau:

Như vậy ta có máy trạng thái với 6 trạng thái và ở trạng thái S0 thì P[2:0]=100, ở S1 thì P[2:0]=101, , ở S5 thì P[2:0] = 001

Tận dụng lệnh tra bảng thì ta có thể dễ dàng cài đặt máy trạng thái trên như sau:

MOV R0,#0 ; Chỉ thị đang ở trạng thái mấy LOOP: MOV A, R0

INC R0

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

Trị số mới ở cột có in tiêu đề đậm (Số có dấu + 4) (với 4 = 22 =2n-1) hoặc nếu so sánh 2 cột nhị phân đầu và cuối thì ta có cách biến đổi khác là đảo giá trị của MSB

TD: Nếu R2 > R1 thì R0 = 2 còn ngược lại thì R0 = 1 cho cả 2 trường hợp không dấu và có dấu

Biểu diễn số trong R2 và R1 là số không dấu Biểu diễn số trong R2 và R1 là số có dấu

CJNE R1, 02H, NEXT NEXT: JNC R1GER2

MOV R0, #2 SJMP CONT MOV R0, #1 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:

Ngày đăng: 03/04/2014, 22:49

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w