Tài liệu Bài giảng môn Điện - Điện tử - Một số kỹ thuật lập trình hợp ngữ 8051: 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 D3 1
Cách 2 SETB CY D2 D7 2
Cách 3 CLR C
CPL C
C3
B3
1
1
b) Cờ Carry bằng 0
Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC)
Cách 1 (*) CLR C C3 1
Cách 2 CLR CY C2 D7 2
Cách 3 SETB C
CPL C
D3
B3
1
1
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 1 (*) CLR A E4 1
Cách 2 ANL A,#0 54 00 2
Cách 3 MOV A,#0 74 00 2
Cách 4 XRL A,0E0h XRL A,ACC 65 E0 1
Cách 5 XRL 0E0h,A XRL ACC,A 62 E0 1
3. Hoán đổi nội dung của
a) 4 bit ca...
6 trang |
Chia sẻ: ntt139 | Lượt xem: 941 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng môn Điện - Điện tử - Một số kỹ thuật lập trình hợp ngữ 8051, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 D3 1
Cách 2 SETB CY D2 D7 2
Cách 3 CLR C
CPL C
C3
B3
1
1
b) Cờ Carry bằng 0
Hợp ngữ Mã máy (hex) Số chu kỳ máy (MC)
Cách 1 (*) CLR C C3 1
Cách 2 CLR CY C2 D7 2
Cách 3 SETB C
CPL C
D3
B3
1
1
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 1 (*) CLR A E4 1
Cách 2 ANL A,#0 54 00 2
Cách 3 MOV A,#0 74 00 2
Cách 4 XRL A,0E0h XRL A,ACC 65 E0 1
Cách 5 XRL 0E0h,A XRL ACC,A 62 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 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
Mã giả Chương trình hợp ngữ #1 Chương trình hợp ngữ #2
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:
VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 2/6
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: ..
VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 3/6
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)
Mã giả Dùng thanh ghi R7làm biến Count
Dùng thanh ghi R7
làm biến Count
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
Mã giả Condition là các cờ hoặc tổ hợp các cờ
Condition là các cờ
hoặc tổ hợp các cờ
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
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
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
SJMP Loop
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
VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 5/6
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
XTAL218
XTAL119
ALE30
EA31
PSEN29
RST9
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.01
P1.12
P1.23
P1.34
P1.45
P1.56
P1.67
P1.78
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
12MHzCX1
33p
CX2
33p
CRST
10n
RRST
10k
R1
270R
R2
270R
R3
270R
R4
270R
R5
270R
R6
270R
R7
270R
CK EQU P3.7
ORG 0
MOV P3,#80H ; Đặt cấu hình nhập cho P3.7
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
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.
VXL_Một số kỹ thuật lập trình hợp ngữ 8051 – trang 6/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:
ORG 0
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 7 111
100 4 –4 0 000
101 5 –3 1 001
110 6 –2 2 010
111 7 –1 3 011
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:
Các file đính kèm theo tài liệu này:
- tailieu.pdf