Tải bản đầy đủ (.docx) (32 trang)

BÀI tập lớn vi xử lí

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 (289.13 KB, 32 trang )

BÀI TẬP LỚN NHÓM 1
Phan Thanh An

MSSV: 2012564

Huỳnh Kỳ Anh

MSSV: 1912566

Bài tập 1:
1A: Cho 4 đèn LED sáng trên port 1 . Độ sáng giảm dần theo thứ tự , đèn thứ nhất sáng 100% đèn
thứ hai sáng 80% đèn thứ ba 3 sáng 60% đèn thứ tư sáng 40% .
Code :
ORG

2000H

MOV

P1, #11110000B

; cho 4 đèn P1.3, P1.2, P1.1, P1.0 đều sáng

CALL

DELAY

; sau 2/5 chu kì

CALL


DELAY

ORL

P1,#11111000B

; tắt đèn P1.3, P1.3 sáng trong 2/5 chu kì => sáng 40%

CALL

DELAY

; sau 3/5 chu kì

ORL

P1,#11111100B

; tắt đèn P1.2, P1.2 sáng trong 3/5 chu kì => sáng 60%

CALL

DELAY

; sau 4/5 chu kì

ORL

P1,#11111110B


; tắt đèn P1.1, P1.1 sáng trong 4/5 chu kì => sáng 80%

CALL

DELAY

; sau 5/5 cu kì đèn P1.0 vẫn sáng => sáng 100%

SJMP

LOOP

; lặp lại

DELAY:

MOV

R7,#250

; chương trình con tạo delay 1/5 chu kì

DL:

MOV

R6,#2

DJNZ


R6,$

DJNZ

R7,DL

LOOP:

RET

END


1B: Cho 4 đèn đèn led như trên chạy . (ta sẽ thấy giống như một con rắn mà đầu của nó sáng nhiều
nhất và đi của nó sáng ít nhất )
Code:
ORG

2000H

MOV

R0,#11110000B

; 4 đèn sáng

MOV

R1,#11111000B


; 3 đèn sáng

MOV

R2,#11111100B

; 2 đèn sáng

MOV

R3,#11111110B

; 1 đèn sáng

AGAIN:

MOV

R4,#100

; lặp vòng lặp LOOP 100 lần

LOOP:

MOV

P1,R0

; 4 đèn sáng


CALL

DELAY

; sau 2 chu kì

CALL

DELAY

MOV

A,P1

ORL

A,R1

MOV

P1,A

CALL

DELAY

MOV

A,P1


ORL

A,R2

MOV

P1,A

CALL

DELAY

MOV

A,P1

ORL

A,R3

; tắt 1 đèn, sáng 2 chu kì => độ sáng = 40%

; sau 3 chu kì

; tắt 2 đèn, sáng 3 chu kì => độ sáng = 60%

; sau 4 chu kì

; tắt 3 đèn, sáng 4/5 chu kì => độ sáng = 80%



MOV

P1,A

CALL

DELAY

; sau 5/5 chu kì đèn ngồi cùng vẫn sáng => 100%

DJNZ

R4,LOOP

; lặp lại 100 lần

MOV

A,R0

; dịch phải R0 tạo hiệu ứng chạy

RR

A

MOV

R0,A


MOV

A,R1

RR

A

MOV

R1,A

MOV

A,R2

RR

A

MOV

R2,A

MOV

A,R3

RR


A

MOV

R3,A

SJMP

AGAIN

; quay lại từ đầu

DELAY:

MOV

R7,#250

; chương trình con tạo delay 1/5 chu kì

DL:

MOV

R6,#2

DJNZ

R6,$


DJNZ

R7,DL

RET
END

; dịch phải R1 tạo hiệu ứng chạy

; dịch phải R2 tạo hiệu ứng chạy

; dịch phải R3 tạo hiệu ứng chạy


Bài tập 2 : (Bắt buộc)
2A: Viết chương trình đếm từ 0 tới 9. Hiển thị trên led 7 đoạn hàng đơn vị . Cứ sau 1 giây thì tăng lên
1 số và sau đó tăng tới 9 lặp lại từ 0.(Dùng dùng phần cứng của Kit thí nghiệm )

Code :
ORG

2000H

MOV DPTR,#0000H

; nạp địa chỉ của LED 7 đoạn vào DPTR

LOOP:


MOV A,#0E0H

; giá trị ban đầu = 0 và chọn LED đơn vị

AGAIN1:

MOV R5,#8

; lặp lại 8 lần 8x0.125 = 1s

AGAIN2:

MOVX @DPTR,A

; xuất giá trị trong A ra LED 7 đoạn

CALL

; delay

DELAY

DJNZ R5,AGAIN2

; lặp lại cho đủ 1s

INC

A


; tăng A lên 1 đơn vị

CJNE

A,#0EAH,AGAIN1

; nếu giá trị khác 10 tiếp tục xuất ra LED

SJMP LOOP

; nếu A = 10 quay lại từ đầu giá trị = 0

DELAY:

MOV R7,#250

; delay 0.125 s

DL1:

MOV R6,#250
DJNZ R6,$
DJNZ R7,DL1
RET

END


2B: Viết chương trình đếm từ 0 tới 9. Hiển thị trên led 7 đoạn hàng đơn vị . Cứ sau 1 giây thì tăng lên
1 số và sau đó tăng tới 9 thì lặp lại từ 0 Nhưng tự thiết kế phần cứng khơng dùng phần cứng của kit

thí nghiệm (Thiết kế sơ đồ phần cứng và trên Proteus Và chạy mô phỏng trên phần mềm này. Khi
viết chương trình khơng dùng lệnh MOVX )
Thiết kế phần cứng:

Code:

ORG

2000H

LOOP:

MOV

A,#10H

; giá trị ban đầu = 0, chọn LED hàng đơn vị

AGAIN1:

MOV

R5,#8

; lặp lại 8 lần, 8x0.125 = 1s

AGAIN2:

MOV


P1,A

; xuất giá trị trong A ra LED

CALL

DELAY

; delay 0.125s

DJNZ

R5,AGAIN2

; lặp lại cho đủ 1s

INC

A

; tăng A lên 1 đơn vị

CJNE

A,#1AH,AGAIN1

; nếu giá trị khác 10 tiếp tục xuất ra LED


SJMP


LOOP

; nếu giá trị = 10 quay lại từ đầu giá trị = 0

DELAY:

MOV

R7,#250

; chương trình con tạo delay 0.125s

DL1:

MOV

R6,#250

DJNZ

R6,$

DJNZ

R7,DL1

RET

END


Bài tập 3 :
3A: Viết chương trình đếm từ 00 tới 99. Hiển thị trên led 7 đoạn . Cứ sau 0.1 giây thì tăng lên 1 số và
sau đó Tới 99 thì lặp lại từ 00.(Dùng dùng phần cứng của Kit thí nghiệm )
Code:
ORG

2000H

MOV

R0,#0E0H

; chọn LED 0, giá trị 0

MOV

R1,#0D0H

; chọn LED 1, giá trị 0

MOV

R2,#0B0H

; chọn LED 2, giá trị 0

MOV

R3,#070H


; chọn LED 3, giá trị 0

LOOP1:

MOV

R5,#25

; lặp 25 lần, 25x4 = 100ms

LOOP2:

MOV

DPTR,#0000H

; nạp địa chỉ LED 7 đoạn vào DPTR

MOV

A,R0

; xuất LED0

LOOP:

MOVX @DPTR,A
CALL


DELAY

; delay

MOV

A,R1

; xuất LED1

MOVX @DPTR,A


DELAY:

MOV

DL1:

CALL

DELAY

; delay

DJNZ

R5,LOOP2

; lặp 2 cho đủ 100ms


INC

R0

; tăng giá trị đơn vị lên 1

CJNE

R0,#0EAH,LOOP1

; nếu giá trị đơn vị khác 10 tiếp tục xuất ra LED

MOV

R0,#0E0H

; nếu giá trị đơn vị = 10 gán giá trị đơn vị = 0

INC

R1

; tăng giá trị hàng chục

CJNE

R1,#0DAH,LOOP1

; nếu hàng chục khác 10 tiếp tục xuất ra LED


SJMP

LOOP

; nếu giá trị hàng chục = 10 quay lại giá trị 00

R6,#8

; delay 4ms

MOV

R7,#250

DJNZ

R7,$

DJNZ

R6,DL1

RET
END

3B: Viết chương trình đếm từ 00 tới 99. Hiển thị trên led 7 đoạn . Cứ sau 0.1 giây thì tăng lên 1 số và
sau đó tăng tới 99 thì lặp lại từ 00 Nhưng tự thiết kế phần cứng. Không dùng phần cứng của kit thí
nghiệm (Thiết kế sơ đồ phần cứng trên Proteus Và chạy mô phỏng trên phần mềm này,Khi viết
chương trình khơng dùng lệnh MOVX)

Thiết kế phần cứng:


Code:
ORG

0000H

MOV

R0,#10H

; LED0, giá trị 0

MOV

R1,#20H

; LED1, giá trị 1

LOOP1:

MOV

R5,#25

; lặp 25 lần, 25x4 = 100ms

LOOP2:


MOV

A,R0

; xuất giá trị LED0 ra P1

MOV

P1,A

CALL

DELAY

; delay 4ms

MOV

A,R1

; xuất giá trị LED1 ra P1

MOV

P1,A

CALL

DELAY


; delay 4ms

DJNZ

R5,LOOP2

; lặp lại cho đủ 100ms

INC

R0

; tăng hàng đơn vị

CJNE

R0,#1AH,LOOP1

; hàng đơn vị khác 10, tiếp tục xuất ra LED

MOV

R0,#10H

; hàng đơn vị = 10, gán hàng đơn vị = 0

INC

R1


; tăng hàng chục

CJNE

R1,#2AH,LOOP1

; hàng chục khác 10, tiếp tục xuất

SJMP

LOOP

; hàng chục = 10, quay lại từ đầu giá trị 00

LOOP:

DELAY:
DL1:

MOV

R6,#8

; delay 4ms

MOV

R7,#250

DJNZ


R7,$

DJNZ

R6,DL1

RET
END


Bài tập 4 :
4A: Một cân điện tử bán mít Tố nữ đặc sản hoạt động như sau:
Trái dưới một 1 kg giá giá 10.0 usd
Trái từ 1kg đến dưới 1,2 kg giá 12.0 usd
Trái từ 1,2 kg đến dưới 1,5 kg giá 14.5 usd
Trái từ 1,5 kg đến dưới 1,8 kg giá 20.0 usd
Trái từ 1,8 kg đến dưới 2,2 kg giá 18.0 usd
Trái từ 2,2 kg trở lên giá 16.5 usd
Cân điện tử này mỗi lần cân chỉ một trái và cân tối đa là 25,5 kg

Hãy viết chương trình dựa trên phần cứng của KIT thí nghiệm VXL để hiển thị khối lượng và giá của
mỗi trái mít Tố nữ khi được cân lên LCD. .Khối lượng lấy từ giá trị bộ ADC (0 - 255) tương đương với
0 - 22.5 kg.
Code:

MAIN:

RANK0:


LCD_E BIT

P3.4

LCD_RS BIT

P3.5

LCDADDR

EQU

6000H

ORG

2000H

MOV

DPTR, #LCDADDR

; nạp địa chỉ LCD vào DPTR

ACALL CLEAR

; xóa màn hình

ACALL INIT_LCD


; cấu hình LCD

CALL

READADC

; đọc giá trị ADC

MOV

A,#0C0H

; xuống hàng 2 cột 0

CALL

WRITECOM

; viết lệnh lên LCD

CJNE

R0,#10,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 10


JNC

RANK1


; R0 >= 10

MOV

A,#0

; R0 < 10, xuất string 1

SJMP

DISPLAY

CJNE

R0,#12,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 12

JNC

RANK2

; R0 >= 12

MOV

A,#9

; R0 < 12, xuất string 2


SJMP

DISPLAY

CJNE

R0,#15,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 15

JNC

RANK3

; R0 >= 15

MOV

A,#18

; R0 < 15, xuất string 3

SJMP

DISPLAY

CJNE

R0,#18,$+3


; so sánh R0 (giá trị đọc được từ ADC) với 18

JNC

RANK4

; R0 >= 18

MOV

A,#27

; R0 < 18,xuất string 4

SJMP

DISPLAY

CJNE

R0,#22,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 22

JNC

RANK5

; R0 >= 22


MOV

A,#36

; R0 < 22, xuất string 5

SJMP

DISPLAY

RANK5:

MOV

A,#45

; xuất string 6

DISPLAY:

CALL

DISPLAYSTRING

; gọi chương trình con xuất chuỗi lên LCD

CALL

DISPLAYADC


; gọi chương trình con tách số ADC

RANK1:

RANK2:

RANK3:

RANK4:


NEXT:

MOV

A,#80H

; hàng 1 cột 1

CALL

WRITECOM

; viết lệnh lên LCD

MOV

A,R2


; lấy giá trị hàng trăm lưu vào A

JZ

NEXT

; nếu A = 0 bỏ qua không xuất lên LCD

ADD

A,#30H

; A khác 0, cộng với 30H để được mã ASCII

ACALL WRITETEXT

; xuất kí tự lên LCD

MOV

A,R1

; tương tự

ADD

A,#30H

; xuất hàng chục lên LCD


ACALL WRITETEXT

MOV

A,#46

; mã ASCII của dấu “.”

ACALL WRITETEXT

; xuất kí tự lên LCD

MOV

A,R0

; xuất hàng đơn vị lên LCD

ADD

A,#30H

ACALL WRITETEXT

UPDATE:

MOV

A,#75


; mã ASCII của kí tự “K”

CALL

WRITETEXT

; xuất kí tự lên LCD

MOV

A,#71

; mã ASCII của kí tự “G”

CALL

WRITETEXT

; xuất kí tự lên LCD

MOV

R3,0H

; lấy giá trị hàng đơn vị lưu vào R3

CALL

READADC


; đọc ADC

CALL

DISPLAYADC

; tách số giá trị đọc được từ ADC

MOV

A,R3

; lấy giá trị hàng đơn vị cũ lưu vào A

CJNE

A,0H,MAIN

; giá trị cũ khác giá trị mới, xuất giá trị mới ra


SJMP

UPDATE

; giá trị cũ khác giá trị mới, tiếp tục đọc và so

MOV

A, #38H


; chương trình con cấu hình LCD

sánh

INIT_LCD:

ACALL WRITECOM
MOV

A, #0EH

ACALL WRITECOM
MOV

A, #06H

ACALL WRITECOM
MOV

A, #0CH

ACALL WRITECOM
RET

CLEAR:

MOV

A, #01H


; chương trình con xóa màn hình

ACALL WRITECOM
RET

WRITECOM:

MOV

DPTR, #LCDADDR

SETB

LCD_E

CLR

LCD_RS

; chương trình con viết lệnh lên LCD

MOVX @DPTR, A
CLR

LCD_E

ACALL WAIT_LCD
RET
WRITETEXT:


; chương trình con xuất kí tự lên LCD
MOV

DPTR, #LCDADDR

SETB

LCD_E

SETB

LCD_RS

MOVX @DPTR, A


CLR

LCD_E

ACALL WAIT_LCD
RET

DISPLAYSTRING:PUSH

0H

LOOP:


MOV

DPTR, #MESSAGE

; lấy địa chỉ của chuỗi

MOV

R0,A

; cất A vào R0

EXIT:

; chương trình con xuất chuỗi lên LCD

MOVC A,@A+DPTR

; lấy kí tự

JZ

EXIT

; kí tự = “0” thốt

ACALL WRITETEXT

; xuất kí tự lên LCD


MOV

A,R0

; lấy lại giá trị cũ

INC

A

; lấy kí tự tiếp theo

SJMP

LOOP

; lặp lại

POP

0H

; lấy lại R0

DPTR, #4000H

; nạp địa chỉ ADC vào DPTR

RET


READADC:

MOV

MOVX @DPTR, A

; bắt đầu chuyển đổi

ACALL DELAY_ADC

; chờ ADC

MOVX A, @DPTR

; đọc giá trị chuyển đổi

MOV

R0,A

; lưu vào R0

; chương trình con chờ LCD

RET

WAIT_LCD:

MOV


R6,#10

DL1:

MOV

R7, #250

DJNZ

R7, $

DJNZ

R6,DL1

RET


DELAY_ADC:

MOV

R4, #100

DJNZ

R4, $

; chương trình con chờ ADC


RET

DISPLAYADC:

MOV

A,R0

; chương trình con tách số giá trị đọc từ ADC

MOV

B,#10

; chia R0 cho 10

DIV

AB

MOV

R0, B

; hàng đơn vị

MOV

B,#10


; chia kết quả tiếp cho 10

DIV

AB

MOV

R1, B

; hàng chục

MOV

B,#10

; chia tiếp kết quả cho 10

DIV

AB

MOV

R2, B

; hàng trăm

RET


MESSAGE:
USD",0

DB "10.0 USD",0,"12.0 USD",0,"14.5 USD",0,"20.0 USD",0,"18.0 USD",0,"16.5

END

4B: Ấn phím P1.3 Để in kết quả trên mặt hiển thị LCD của cân lên màn hình máy tính .


MAIN:

DISPLAY:

LCD_E BIT

P3.4

LCD_RS BIT

P3.5

LCDADDR

EQU

6000H

ORG


2000H

MOV

SCON,#01000010B

; cho phép xuất serial port

MOV

TMOD,#20H

; cấu hình timer tạo baudrate

MOV

TL1,#-3

MOV

TH1,#-3

MOV

PCON,#80H

SETB

TR1


MOV

DPTR, #LCDADDR

; nạp địa chỉ LCD vào DPTR

ACALL CLEAR

; xóa màn hình

ACALL INIT_LCD

; cấu hình LCD

CALL

READADC

; đọc giá trị ADC

MOV

A,#0C0H

; xuống hàng 2 cột 0

CALL

WRITECOM


; viết lệnh lên LCD

CALL

SO_SANH

; gọi chương trình con so sánh

CALL

DISPLAYSTRING

; gọi chương trình con xuất chuỗi lên LCD

CALL

DISPLAYADC

; gọi chương trình con tách số ADC

MOV

A,#80H

; hàng 1 cột 1

CALL

WRITECOM


; viết lệnh lên LCD

MOV

A,R2

; lấy giá trị hàng trăm lưu vào A

JZ

NEXT

; nếu A = 0 bỏ qua không xuất lên LCD


ADD

NEXT:

A,#30H

; A khác 0, cộng với 30H để được mã ASCII

ACALL WRITETEXT

; xuất kí tự lên LCD

MOV


A,R1

; tương tự

ADD

A,#30H

; xuất hàng chục lên LCD

ACALL WRITETEXT

MOV

A,#46

; mã ASCII của dấu “.”

ACALL WRITETEXT

; xuất kí tự lên LCD

MOV

A,R0

; xuất hàng đơn vị lên LCD

ADD


A,#30H

ACALL WRITETEXT

TRANSMISS:

NEXT2:

MOV

A,#75

; mã ASCII của kí tự “K”

CALL

WRITETEXT

; xuất kí tự lên LCD

MOV

A,#71

; mã ASCII của kí tự “G”

CALL

WRITETEXT


; xuất kí tự lên LCD

SETB

P1.3

; đọc nút nhấn tại P1.3

JB

P1.3,UPDATE

; P1.3 =1 bỏ qua

CALL

DELAY_ADC

; gọi delay chống rung nút nhấn

JB

P1.3,UPDATE

; p1.3 = 1, bỏ qua

MOV

A,R2


; lưu hàng trăm vào A

JZ

NEXT2

; hàng trăm = 0, ko xuất

ADD

A,#30H

; cộng thêm 30H để được mã ASCII

CALL

PHAT

; phát ra màn hình máy tính

MOV

A,R1

; tương tự cho hàng chục

ADD

A,#30H


CALL

PHAT


PC_DISPLAY:

MOV

A,#46

; xuất dấu chấm “.” Ra màn hình máy tính

CALL

PHAT

MOV

A,R0

ADD

A,#30H

CALL

PHAT

MOV


A,#75

CALL

PHAT

MOV

A,#71

CALL

PHAT

MOV

A,#13

CALL

PHAT

CALL

READADC

; đọc ADC

CALL


SO_SANH

; gọi chương trình con so sánh

MOV

DPTR,#MESSAGE

; xuất chuỗi tương ứng với kết quả trả về A

PUSH

ACC

; tương tự cho hàng đơn vị

; xuất kí tự “K” Ra màn hình máy tính

; xuất kí tự “G” ra màn hình máy tính

; xuất “ENTER” xuống dịng

MOVC A,@A+DPTR

UPDATE:

sánh

JZ


UPDATE

CALL

PHAT

POP

ACC

INC

A

SJMP

PC_DISPLAY

MOV

R3,0H

; lấy giá trị hàng đơn vị lưu vào R3

CALL

READADC

; đọc ADC


CALL

DISPLAYADC

; tách số giá trị đọc được từ ADC

MOV

A,R3

; lấy giá trị hàng đơn vị cũ lưu vào A

CJNE

A,0H,MAIN

; giá trị cũ khác giá trị mới, xuất giá trị mới ra

SJMP

TRANSMISS

; giá trị cũ khác giá trị mới, tiếp tục đọc và so


INIT_LCD:

MOV


A, #38H

; chương trình con cấu hình LCD

ACALL WRITECOM
MOV

A, #0EH

ACALL WRITECOM
MOV

A, #06H

ACALL WRITECOM
MOV

A, #0CH

ACALL WRITECOM
RET

CLEAR:

MOV

A, #01H

; chương trình con xóa màn hình


ACALL WRITECOM
RET

WRITECOM:

MOV

DPTR, #LCDADDR

SETB

LCD_E

CLR

LCD_RS

; chương trình con viết lệnh lên LCD

MOVX @DPTR, A
CLR

LCD_E

ACALL WAIT_LCD
RET
WRITETEXT:

; chương trình con xuất kí tự lên LCD
MOV


DPTR, #LCDADDR

SETB

LCD_E

SETB

LCD_RS

MOVX @DPTR, A
CLR

LCD_E

ACALL WAIT_LCD


RET

DISPLAYSTRING:PUSH

0H

LOOP:

MOV

DPTR, #MESSAGE


; lấy địa chỉ của chuỗi

MOV

R0,A

; cất A vào R0

EXIT:

; chương trình con xuất chuỗi lên LCD

MOVC A,@A+DPTR

; lấy kí tự

JZ

EXIT

; kí tự = “0” thốt

ACALL WRITETEXT

; xuất kí tự lên LCD

MOV

A,R0


; lấy lại giá trị cũ

INC

A

; lấy kí tự tiếp theo

SJMP

LOOP

; lặp lại

POP

0H

; lấy lại R0

DPTR, #4000H

; nạp địa chỉ ADC vào DPTR

RET

READADC:

MOV


MOVX @DPTR, A

; bắt đầu chuyển đổi

ACALL DELAY_ADC

; chờ ADC

MOVX A, @DPTR

; đọc giá trị chuyển đổi

MOV

R0,A

; lưu vào R0

; chương trình con chờ LCD

RET

WAIT_LCD:

MOV

R6,#10

DL1:


MOV

R7, #250

DJNZ

R7, $

DJNZ

R6,DL1

RET

DELAY_ADC:

MOV

R4, #100

; chương trình con chờ ADC


DJNZ

R4, $

RET


DISPLAYADC:

MOV

A,R0

; chương trình con tách số giá trị đọc từ ADC

MOV

B,#10

; chia R0 cho 10

DIV

AB

MOV

R0, B

; hàng đơn vị

MOV

B,#10

; chia kết quả tiếp cho 10


DIV

AB

MOV

R1, B

; hàng chục

MOV

B,#10

; chia tiếp kết quả cho 10

DIV

AB

MOV

R2, B

; hàng trăm

CLR

TI


; xóa cờ TI

MOV

SBUF,A

; xuất data trong A ra serial port

JNB

TI, $

; chờ xuất xong

RET
PHAT:

RET

; return

SO_SANH:
RANK0:

RANK1:

CJNE

R0,#10,$+3


; so sánh R0 (giá trị đọc được từ ADC) với 10

JNC

RANK1

; R0 >= 10

MOV

A,#0

; R0 < 10, xuất string 1

SJMP

THOAT

CJNE

R0,#12,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 12

JNC

RANK2

; R0 >= 12


MOV

A,#9

; R0 < 12, xuất string 2

SJMP

THOAT


RANK2:

CJNE

R0,#15,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 15

JNC

RANK3

; R0 >= 15

MOV

A,#18

; R0 < 15, xuất string 3


SJMP

THOAT

CJNE

R0,#18,$+3

; so sánh R0 (giá trị đọc được từ ADC) với 18

JNC

RANK4

; R0 >= 18

MOV

A,#27

; R0 < 18,xuất string 4

SJMP

THOAT

CJNE

R0,#22,$+3


; so sánh R0 (giá trị đọc được từ ADC) với 22

JNC

RANK5

; R0 >= 22

MOV

A,#36

; R0 < 22, xuất string 5

SJMP

THOAT

RANK5:

MOV

A,#45

THOAT:

RET

MESSAGE:

USD",0

DB "10.0 USD",0,"12.0 USD",0,"14.5 USD",0,"20.0 USD",0,"18.0 USD",0,"16.5

RANK3:

RANK4:

; xuất string 6

END

Bài tập 5 :
Hãy thực hiện bài tập 4A Nhưng tự thiết kế phần cứng.Thiết kế sơ đồ phần cứng trên Proteus Và
chạy mô phỏng trên phần mềm này. Khi viết chương trình khơng dùng lệnh MOVX và khơng dùng
phần cứng của kit thí nghiệm .


Thiết kế phần cứng:

Code:

LCD_E

BIT P3.1

LCD_RS

BIT P3.0


START

BIT P3.2

OE

BIT P3.3

EOC

BIT P3.4

ORG

0000H

MAIN:
ACALL CLEAR

; xóa màn hình

ACALL INIT_LCD

; cấu hình LCD

CALL

READADC

; đọc ADC


MOV

A,#0C0H

; xuống hàng 2 cột 1


RANK0:

RANK1:

RANK2:

RANK3:

RANK4:

RANK5:

CALL

WRITECOM

; ghi lệnh lên LCD

CJNE

R0,#10,$+3


; so sánh R0(giá trị đọc từ ADC) với 10

JNC

RANK1

; R0 >= 10

MOV

A,#0

; R0 < 10, xuất chuỗi 1

SJMP

DISPLAY

CJNE

R0,#12,$+3

; so sánh R0(giá trị đọc từ ADC) với 12

JNC

RANK2

; R0 >= 12


MOV

A,#9

; R0 < 12, xuất chuỗi 2

SJMP

DISPLAY

CJNE

R0,#15,$+3

; so sánh R0(giá trị đọc từ ADC) với 15

JNC

RANK3

; R0 >= 15

MOV

A,#18

; R0 < 15, xuất chuỗi 3

SJMP


DISPLAY

CJNE

R0,#18,$+3

; so sánh R0(giá trị đọc từ ADC) với 18

JNC

RANK4

; R0 >= 18

MOV

A,#27

; R0 < 18, xuất chuỗi 4

SJMP

DISPLAY

CJNE

R0,#22,$+3

; so sánh R0(giá trị đọc từ ADC) với 22


JNC

RANK5

; R0 >= 22

MOV

A,#36

; R0 < 22, xuất chuỗi 5

SJMP

DISPLAY

MOV

A,#45

; xuất chuỗi 6


DISPLAY:

NEXT:

CALL

DISPLAYSTRING


; xuất chuỗi ra LCD

CALL

DISPLAYADC

; tách số từ giá trị đọc từ ADC

MOV

A,#80H

; hàng 1 cột1

CALL

WRITECOM

; viết lệnh lên LCD

MOV

A,R2

; lưu hàng trăm vào A

JZ

NEXT


; hàng trăm = 0, ko xuất hàng trăn

ADD

A,#30H

; khác 0, cộng với 30H để được mã ASCII

ACALL WRITETEXT

; viết kí tự lên LCD

MOV

A,R1

; tương tự xuất hàng chục lên LCD

ADD

A,#30H

ACALL WRITETEXT

MOV

A,#46

; xuất kí tự dấu chấm “.” Lên LCD


ACALL WRITETEXT

MOV

A,R0

ADD

A,#30H

; xuất hàng đơn vị lên LCD

ACALL WRITETEXT

UPDATE:

MOV

A,#75

; xuất kí tự “K” lên LCD

CALL

WRITETEXT

MOV

A,#71


CALL

WRITETEXT

MOV

R3,0H

; lưu giá trị đơn vị cũ vào R3

CALL

READADC

; đọc ADC

; xuất kí tự “G” lên LCD


INIT_LCD:

CALL

DISPLAYADC

; tách số của giá trị đọc được từ ADC

MOV


A,R3

; lưu giá trị cũ vào A

CJNE

A,0H,MAIN

; giá trị cũ khác giá trị mới, xuất giá trị mới

SJMP

UPDATE

; giá trị cũ = giá trị mới, kiểm tra lại

MOV

A, #38H

; chương trình con cấu hình LCD

ACALL WRITECOM
MOV

A, #0EH

ACALL WRITECOM
MOV


A, #06H

ACALL WRITECOM
MOV A, #0CH
ACALL WRITECOM
RET

CLEAR:

MOV

A, #01H

; chương trình con xóa màn hình

ACALL WRITECOM
RET

WRITECOM:

; chương trình con viết lệnh lên LCD
SETB

LCD_E

CLR

LCD_RS

MOV


P2, A

CLR

LCD_E

ACALL WAIT_LCD
RET
WRITETEXT:

; chương trình con viết kí tự lên LCD
SETB

LCD_E

SETB

LCD_RS


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×