btl vxl.pdf

11
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 min nh100 byte tô nh123H ti RAM ngoài Bài làm: Quy ước bit cao nht(tc là bit 7) là bit du, và sâm có bit cao nht bng 1. Scác sâm đếm được lưu tại R1. Địa ch123H là địa chthp nht trong 100 byte knhau 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

Upload: dangduccong

Post on 01-Jan-2016

154 views

Category:

Documents


2 download

DESCRIPTION

Bai tap lon VXL - Cong

TRANSCRIPT

Page 1: BTL VXL.pdf

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

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

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

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

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

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

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

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

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

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

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