btl vxl.pdf
DESCRIPTION
Bai tap lon VXL - CongTRANSCRIPT
![Page 1: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/1.jpg)
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 #100DPTR #123H
R1 #00
A @DPTRRLC A
C = 1?
YES
R1 += 1
DPTR += 1R0 -= 1
NO
R0 = 0?
END
YES
NO
![Page 2: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/2.jpg)
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 #10DPTR #1000H
R0 #70
A @DPTRXCH A,@R0@DPTR A
R0 += 1DPTR += 1
R2 -= 1
R2 = 0?
END
YES
NO
![Page 3: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/3.jpg)
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 #70HR1 #60H
R2 #2C #0
A @R0A += (@R1+C)
DA A@R1 AR0 += 1R1 += 1R2 -= 1
R2 = 0?
NO
YES
C = 1?
YES
62H #1
END
NO
![Page 4: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/4.jpg)
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 #1234HR0 #00R1 #00R2 #10
A @DPTRB #10DIV ABA += R0R0 AA B
A += R1R1 A
DPTR += 1R2 -= 1
R2 = 0?
NO
YES
A R1B #10DIV ABA += R0R0 AR1 B
END
![Page 5: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/5.jpg)
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 #00000001BP1.0 = 1
R1 #10
TH0 #3CHTL0 #0AFH
TF0 = 0TR0 = 1
TF0 = 0
YES
N O
R1 -= 1TR0 = 0
R1 = 0
NO
YES
CPL P1.0
![Page 6: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/6.jpg)
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 #00000001BP1.2 = 1
R1 #3
TH0 #0D8HTL0 #0EFH
TF0 = 0TR0 = 1
TF0 = 0
YES
N O
R1 -= 1
R1 = 0
NO
YES
CPL P1.0
R1 #7
P1.2 = 1
YES
NO
![Page 7: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/7.jpg)
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 #100R1 #3
DPTR #100H
RI = 0?
YES
NO
A SBUF@DPTR A
RI = 0DPTR += 1
R0 -= 1
R0 = 0?
NO
YES
R0 #100R1 -= 1
R1 = 0?
RET
YES
NO
![Page 8: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/8.jpg)
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 #01HTF0 = 0
R1 #16
TH0 #0BHTL0 #0DCH
TR0 = 1
TF0 = 0?
YES
NO
TR0 = 0TF0 = 0R1 -= 1
R1 = 0?
NO
YES
A -= 1
A = 0?
NO
RET
YES
START
XANH1 1DO2 1A #25
LCALL DELAY_A
DO2 1VANG1 1
A #3LCALL DELAY_A
XANH2 1DO1 1A #33
LCALL DELAY_A
DO1 1VANG2 1
A #3LCALL DELAY_A
![Page 9: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/9.jpg)
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
X112Mhz
XTAL218
XTAL119
ALE30
EA31
PSEN29
RST9
P0.0/AD039
P0.1/AD138
P0.2/AD237
P0.3/AD336
P0.4/AD435
P0.5/AD534
P0.6/AD633
P0.7/AD732
P1.01
P1.12
P1.23
P1.34
P1.45
P1.56
P1.67
P1.78
P3.0/RXD10
P3.1/TXD11
P3.2/INT012
P3.3/INT113
P3.4/T014
P3.7/RD17
P3.6/WR16
P3.5/T115
P2.7/A1528
P2.0/A821
P2.1/A922
P2.2/A1023
P2.3/A1124
P2.4/A1225
P2.5/A1326
P2.6/A1427
U1AT89C51
C1 33nF
+5V
+5V
C2 33nF
R110k
470470470470470470470470
R103.3k
R113.9k
R123.3k
R133.9k
C310uF
MAIN
R0 #TIME
R1 #COUNTCALL HIEN_THI
R0 -= 1
R0 = 0?
NO
YES
![Page 10: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/10.jpg)
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_SOA @A+DPTR
RET
DELAY_A_MS
TMOD #01H
TF0 = 0TH0 #0FCHTL0 #018H
TR0 = 1
TF0 = 0?
RET
NO
YES
A = 0?
NO
YES
HIEN_THI
A R0B #10DIV AB
CALL GIAI_MAP2 A
P3.0 = 1A #ON
CALL DELAY_A_MSP3.0 = 0
A BCALL GIAI_MA
P2 AP3.1 = 1A #ON
CALL DELAY_A_MSP3.1 = 0R1 -= 1
R1 = 0?
NO
RET
YES
![Page 11: BTL VXL.pdf](https://reader035.vdocuments.net/reader035/viewer/2022073103/55cf9b3b550346d033a53b9e/html5/thumbnails/11.jpg)
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 @R0LCALL TEST
C = 1?
YES
A (A-#20H)@R0 A
R0 += 1R7 -= 1
NO
R7 = 0?
NO
RET
YES