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

BÀI TẬP DÀI VI XỬ LÝ ppt

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 (885.82 KB, 11 trang )

BÀI TẬP DÀI VI XỬ LÝ
Họ tên: Đặng Đức Công. MSSV:20101181 Lớp: KSTN-ĐKTĐ-K55

Câu 1: Viết CT đếm số âm trong miền nhớ 100 byte từ ô nhớ 123H tại RAM ngoài
Bài làm:
Quy ước bit cao nhất(tức là bit 7) là bit dấu, và số
âm có bit cao nhất bằng 1.
Số các số âm đếm được lưu tại R1.
Địa chỉ 123H là địa chỉ thấp nhất trong 100 byte kề
nhau
Chương trình:
MAIN: MOV R0,#100
MOV DPTR,#123H
MOV R1,#00
LOOP: MOVX A,@DPTR
RLC A
JC NHAY
INC R1
NHAY: INC DPTR
DJNZ R0,LOOP
END



START
R0 #100
DPTR #123H
R1 #00
A @DPTR
RLC A
C = 1?


YES
R1 += 1
DPTR += 1
R0 -= 1
NO
R0 = 0?
END
YES
NO
Câu 2: Viết CT chuyển 2 mảng dữ liệu 10 byte. Biết mảng 1 có địa chỉ 1000H trong RAM
ngoài và mảng 2 có địa chỉ 70H trong RAM trong.
Bài làm:
Quy ước 1000H và 70H là các địa chỉ thấp nhất của
mỗi mảng 10 byte trong các RAM.
Chương trình:
MAIN: MOV R2,#10
MOV DPTR,#1000H
MOV R0,#70H
LOOP: MOVX A,@DPTR
XCH A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LOOP
END









START
R2 #10
DPTR #1000H
R0 #70
A @DPTR
XCH A,@R0
@DPTR A
R0 += 1
DPTR += 1
R2 -= 1
R2 = 0?
END
YES
NO
Câu 3: Viết CT cộng hai số BCD 4 chữ số trong RAM trong, kết quả cất vào sô thứ 2 .
Biết số thứ 1 đặt tại ô nhớ 70H, và số thứ 2 đặt tại ô nhớ 60H.
Bài làm:
Quy ước 2 số BCD có byte thấp ứng với địa chỉ thấp.
Kết quả cất vào số thứ 2, nếu kết quả có tràn sẽ cất vào
byte 62H.
Chương trình:
MAIN: MOV R0,#70H
MOV R1,#60H
MOV R2,#2
CLR C
LOOP: MOV A,@R0
ADDC A,@R1

DA A
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
JNC EXIT
MOV 62H,#1
EXIT: END




START
R0 #70H
R1 #60H
R2 #2
C #0
A @R0
A += (@R1+C)
DA A
@R1 A
R0 += 1
R1 += 1
R2 -= 1
R2 = 0?
NO
YES
C = 1?
YES
62H #1

END
NO
Câu 4: Viết CT tính trung bình 10 byte trong Ram ngoài từ ô nhớ 1234H.
Bài làm:
Quy ước: Phép tính trung bình có thương trong R0, số
dư trong R1. Địa chỉ 1234H là địa chỉ thấp nhất trong 10 byte
kề nhau.
Chương trình:
MAIN: MOV DPTR,#1234H
MOV R0,#00
MOV R1,#00
MOV R2,#10
LOOP: MOVX A,@DPTR
MOV B,#10
DIV AB
ADD A,R0
MOV R0,A
MOV A,B
ADD A,R1
MOV R1,A
INC DPTR
DJNZ R2,LOOP
MOV A,R1
MOV B,#10
DIV AB
ADD A,R0
MOV R0,A
MOV R1,B
END
START

DPTR #1234H
R0 #00
R1 #00
R2 #10
A @DPTR
B #10
DIV AB
A += R0
R0 A
A B
A += R1
R1 A
DPTR += 1
R2 -= 1
R2 = 0?
NO
YES
A R1
B #10
DIV AB
A += R0
R0 A
R1 B
END
Câu 5: Viết CT sử dụng Timer tạo xung tần số 1Hz tại chân P1.0. Biết xung nhịp thạch
anh 12MHz ( Ton =50%, Toff = 50%).
Bài làm:
Tần số 1Hz => T= 1s. Ton=Toff= 500.000us
Sử dụng Timer0 chế độ 16 bit, thời gian
50000 gồm 10 lần.

15535D = 3CAFH
Chương trình:

MAIN: MOV TMOD,#00000001B
SETB P1.0
LOOP: MOV R1,#10
LOOP1: MOV TH0,#3CH
MOV TL0,#0AFH
CLR TF0
SETB TR0
JNB TF0,$
CLR TR0
DJNZ R1,LOOP1
CPL P1.0
SJMP LOOP
END




START
TMOD #00000001B
P1.0 = 1
R1 #10
TH0 #3CH
TL0 #0AFH
TF0 = 0
TR0 = 1
TF0 = 0
YES

N O
R1 -= 1
TR0 = 0
R1 = 0
NO
YES
CPL P1.0
Câu 6: Viết CT tạo xung 10Hz tại chân P1.2. Biết xung nhịp thạch anh 12MHz (Ton
=30% và Toff=70%).
Bài làm:
F=10Hz => T=100.000us
Ton=30.000us. Toff=70.000us
Sử dụng Timer0 chế độ 16 bit thời gian 10.000
Chương trình:
55535D = D8EFH

MAIN: MOV TMOD,#00000001B
SETB P1.2
ON: MOV R1,#3
SJMP LOOP
OFF: MOV R1,#7
LOOP: MOV TH0,#0D8H
MOV TL0,#0EFH
CLR TF0
SETB TR0
JNB TF0,$
DJNZ R1,LOOP
CPL P1.2
JB P1.2,ON
SJMP OFF

END


START
TMOD #00000001B
P1.2 = 1
R1 #3
TH0 #0D8H
TL0 #0EFH
TF0 = 0
TR0 = 1
TF0 = 0
YES
N O
R1 -= 1
R1 = 0
NO
YES
CPL P1.0
R1 #7
P1.2 = 1
YES
NO
Câu 7: Viết CT con đọc 300 byte dữ liệu từ cổng nối tiếp và cất vào vùng nhớ có địa chỉ
đầu 100H. Biết cổng nối tiếp đã được khởi tạo sẵn, cổng cho phép đọc khi cờ RI =1, và cờ
RI sẽ tự xóa khi đọc xong 1 byte.
Bài làm:
Vùng nhớ là RAM ngoài

COUNT: MOV R0,#100

MOV R1,#03
MOV DPTR,#100H
LOOP: JNB RI,$
MOV A,SBUF
MOVX @DPTR,A
CLR RI
INC DPTR
DJNZ R0,LOOP
MOV R0,#100
DJNZ R1,LOOP
RET













COUNT
R0 #100
R1 #3
DPTR #100H
RI = 0?
YES

NO
A SBUF
@DPTR A
RI = 0
DPTR += 1
R0 -= 1
R0 = 0?
NO
YES
R0 #100
R1 -= 1
R1 = 0?
RET
YES
NO
Câu 8: Viết CT điều khiển đèn giao thông tại 1 ngã tư theo yêu cầu sau:
Biết điều khiển 0 là đèn sáng , 1 là đèn tắt.
Bài làm:
Chương trình chính:
MAIN: MOV A,#25
MOV P1,#11011110B
LCALL DELAY_A
MOV A,#3
MOV P1,#11011101B
LCALL DELAY_A
MOV A,#33
MOV P1,#11110011B
LCALL DELAY_A
MOV A,#3
MOV P1,#11101011B

LCALL DELAY_A
SJMP MAIN
DELAY_A: MOV TMOD,#01H ;trễ A giây
CLR TF0
LOOP: MOV R2,#16
LOOP1: MOV TH0,#0BH
MOV TL0,#0DCH
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R2,LOOP1
DJNZ 0E0H,LOOP ;thanh ghi A có địa chỉ E0
RET
DELAY_A
TMOD #01H
TF0 = 0
R1 #16
TH0 #0BH
TL0 #0DCH
TR0 = 1
TF0 = 0?
YES
NO
TR0 = 0
TF0 = 0
R1 -= 1
R1 = 0?
NO
YES

A -= 1
A = 0?
NO
RET
YES
START
XANH1 1
DO2 1
A #25
LCALL DELAY_A
DO2 1
VANG1 1
A #3
LCALL DELAY_A
XANH2 1
DO1 1
A #33
LCALL DELAY_A
DO1 1
VANG2 1
A #3
LCALL DELAY_A
Câu 9: Viết CT hiển thị trên 2 LED 7 thanh đếm lùi từ 20s với sơ đồ phần cứng SV tự đề xuất.

Sử dụng Port2 của VĐK làm port dữ liệu, và 2 chân P3.0 và P3.1 điều khiển quét LED.
TIME EQU 20
ON EQU 4
COUNT EQU 125; lặp để đủ quét trong 1s
ORG 0000H
MAIN: MOV R0,#TIME

DEM_LUI: MOV R1,#COUNT
LCALL HIEN_THI
DJNZ R0,DEM_LUI
SJMP MAIN
HIEN_THI:
MOV A,R0
MOV B,#10
DIV AB
LCALL GIAI_MA
X1
12Mhz
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
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
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
U1
AT89C51
C1

33nF
+5V
+5V
C2
33nF
R1
10k
470
470
470
470
470
470
470
470
R10
3.3k
R11
3.9k
R12
3.3k
R13
3.9k
C3
10uF
MAIN
R0 #TIME
R1 #COUNT
CALL HIEN_THI
R0 -= 1

R0 = 0?
NO
YES
MOV P2,A
SETB P3.0
MOV A,#ON
LCALL DELAY_A_MS
CLR P3.0
MOV A,B
LCALL GIAI_MA
MOV P2,A
SETB P3.1
MOV A,#ON
LCALL DELAY_A_MS
CLR P3.1
DJNZ R1,HIEN_THI
RET
DELAY_A_MS:
MOV TMOD,#01H
LOOP: CLR TF0
MOV TH0,#0FCH
MOV TL0,#18H
SETB TR0
JNB TF0,$
CLR TR0
DJNZ 0E0H,LOOP ;thanh ghi A có địa chỉ E0
RET
GIAI_MA:
MOV DPTR,#MA_SO
MOVC A,@A+DPTR

RET
MA_SO: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
GIẢI MÃ
DPTR #MA_SO
A @A+DPTR
RET
DELAY_A_MS
TMOD #01H
TF0 = 0
TH0 #0FCH
TL0 #018H
TR0 = 1
TF0 = 0?
RET
NO
YES
A = 0?
NO
YES
HIEN_THI
A R0
B #10
DIV AB
CALL GIAI_MA
P2 A
P3.0 = 1
A #ON
CALL DELAY_A_MS
P3.0 = 0

A B
CALL GIAI_MA
P2 A
P3.1 = 1
A #ON
CALL DELAY_A_MS
P3.1 = 0
R1 -= 1
R1 = 0?
NO
RET
YES
Câu 10: Viết CT con đổi n ký tự thành chữ hoa (nếu đang là chữ thường). Biết chuỗi ký tự
trong bộ nhớ có địa chỉ đầu trong R0 , độ dài trong R7.
Bài làm: Giả thiết n nhỏ hơn 256, lưu tại R1. Bộ nhớ là RAM trong.
TO_UPPER: MOV A,@R0
LCALL TEST
JNC NOT_LOWER1
SUBB A,#20H
MOV @R0,A
NOT_LOWER1:INC R0
DJNZ R7, TO_UPPER
RET
TEST:
; INPUT: A, OUTPUT: C=1 IF A IS LOWER.
SETB C
CJNE A,#122,NOT_EQ1
SETB C
SJMP EXIT
NOT_EQ1: JNC EXIT ; A < z?

CLR C
CJNE A,#97,NOT_EQ2
SETB C
SJMP EXIT
NOT_EQ2: JC NOT_LOWER2 ; a < A < z?
SETB C
SJMP EXIT
NOT_LOWER2: CLR C ;𝐴 ∉ (𝑎, 𝑧)
SJMP EXIT
EXIT: RET
TEST
C = 1
A = #122?
NO
C = 0?
NO
C = 0
A = #97?
NO
C = 1?
NO
C = 1
RET
YES
YES
YES
C = 0
YES
TO_UPPER
A @R0

LCALL TEST
C = 1?
YES
A (A-#20H)
@R0 A
R0 += 1
R7 -= 1
NO
R7 = 0?
NO
RET
YES

×