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

báo cáo thí nghiệm 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 (688.4 KB, 42 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA
TP.HỒ CHÍ MINH
------

Thành viên nhóm:
Đinh Xuân Tuế

MSSV:
41104041

Đỗ Mạnh Thưởng
Nguyễn Đức Bình

41100298

Nguyễn Hữu Thạnh

41003060


Bài 1: Thí nghiệm với LED đơn
Chớp tắt đèn p1.0 với chu kì là 500ms
Thuật toán: tạo vòng lặp liên tục chớp tắt đèn với chu kì là 500ms
Lưu đồ thuật toán:
ORG

CPL P1.0 ;Chớp
đèn P1.0

z


DELAY 500ms

Source code:
ORG

2000H

LAP:
CPL
CALL
SJMP
DL500:
PUSH
PUSH
PUSH
MOV
L2:
MOV
L1:
MOV
DJNZ
DJNZ
DJNZ
POP

P1.0
DL500
LAP

;thay đổi trạng thái p1.0 sang trạng thái ngược lại

;gọi delay 500ms để đèn sáng được lâu
;quay trở lại chương trình để đèn được chớp liên tục

05
06
07
R5, #10

;chương trình delay 500s
;đặt để cất giá trị ở thanh ghi r5 r6 r7 vào ngăn xếp

R6, #100

;gán r6 = 100

R7, #250
R7, $
R6, L1
R5, L2

;gán r7 = 250

07

;gán r5 = 10

;thực hiện 10x100x250x2
; chu kì máy (1 chu kì 1us)
;lấy lại giá trị r7 lưu trong



;ngăn xếp để bảo tồn giá trị
; ( theo quy tắc cất trước thì lấy sau)
POP
POP
RET

06
05

END

Bài 2: Thí Nghiệm Hiển Thị LED
Hiển thị đèn LED từ 0 đến 9 sau đó lặp lại.
Thuật toán: sử dụng thanh ghi DPTR để kết nối LED bằng cách move địa chỉ thanh
ghi DPTR vào địa chỉ #0000H. Lựa chọn đèn LED nào sáng vào hiển thị giá trị số nào
bằng cách gán nội dụng vào thanh ghi DPTR (đó là @DPTR) (sử dụng 8 bit). 4 bit
đầu quy định led nào sẽ sáng 4 bit sau quy định số sẽ sáng.
VD: chọn LED số 4 thì LED số 4 phải ở mực thấp: 1110E, hiển thị số 0 thì nội
dụng @DPTR phải là #0E0H
Tương tự: LED 3 hiển thị số 2: 1101 0010  @DPTR là #0D2H
LED 2 hiển thị số 1: 1011 0001  @DPTR là #0B2H
Sử dụng vòng lặp tăng giá trị lên. Dùng delay điều chỉnh thời gian thi hành chậm lại
để có thể lưu ảnh trong mắt người quan sát. Đồng thời kiểm tra nếu quá 9 sẽ trở lại về
0 (sử dụng CJNE)
Lưu đồ thuật toán:
ORG

DPTR#0000H
A#0E0H


@DPTRA
DELAY
INC A

A>9

N


Y

Source code:

AGAIN:
NEXT:

ORG
MOV
MOV
MOVX
DPTR
LCALL
INC
CJNE

SJMP

DELAY:
LAP1:


MOV
MOV
MOV
MOV
SETB
JNB
CLR
CLR
DJNZ
RET
END

2000H
DPTR,#0000H
A, #0E0H
@DPTR, A

; truy xuất đến LED
;gán A là 1110 0000B
;Đưa A vào nội dung thanh ghi

;( bằng cách mov vào @DPTR)
DELAY
;Gọi delay để có thời gian chờ để lưu
;ảnh trong mắt.
A
;Tăng giá trị A lên để đếm đến 9
A, #0EAH, NEXT
;Kiểm tra xem có

;vượt quá 9 không
; nếu không vượt thì tiếp tục quay lại
;hiển thị rồi tăng A
AGAIN
;trở lại để hiển thị từ 0

R7,#10
;vòng lặp delay sử dụng timer 1
TMOD,#01H
TH0,#HIGH(-50000)
TL0,#LOW(-50000)
TR0
TF0,$
TR0
TF0
R7,LAP1

Bài 3:Thí Nghiệm Hiển Thị LCD
Hiển thị chữ ‘HELLO’ trên màn hình LCD
Thuật toán: -Sử dụng thanh ghi DPTR để kết nối LCD bằng cách move địa chỉ thanh
ghi DPTR vào địa chỉ #8000H
-Viết 2 chương trình con:


+Thứ nhất: chương trình con nhận lệnh truyền đến để thực hiện (WRITE). Để nhận
lệnh thì ta phải setb p3.4 và clr p3.5. Chương trình này giúp LCD nhận lệnh từ máy
như xóa màn hình LCD, hiển thị kiểu nào, con trỏ ở đâu.v..v
+Thứ hai: chương trình nhận kí tự xuất ra LCD hiển thị (WRITE_TEXT). Để nhận
chuỗi kí tự ta phải setb p3.4 và cả p3.5.
-Viết chương trình con khởi động LCD (tên là LCD) với phổ biến là truyền 3

lệnh sau:
+#06H: hiển thị tăng và không shift
+#0EH: hiển thị cursor nhưng không hiển thị blinking
+#38H: giao tiếp 8 bit, 2 dòng với font 5x8
-Viết chương trình con lấy kí tự từ bảng (là chuỗi kí tự muốn hiển thị) (chương
trình con BANG).
-Viết chương trình con delay để tạo độ trễ. Để có thể xuất hiện từng chữ một
trên LCD.
-Chương trình chính:
+Khởi động LCD.
+Xóa màn hình đang hiện thị trên LCD bằng cách truyền lệnh #01H.
+Tạo vòng lặp hiển thị từng chữ một trên LCD bằng cách tra bảng.


Lưu đồ thuật toán:

ORG

DPTR#8000H
CALL LCD ; khởi động LCD
A#01H
CALL WRITE ;xóa màn hình
R5#5
A#0
R4#0

CALL BANG
CALL WRITE_TEXT
R4R4+1
AR4

R5R5-1

R5=0

Y

SJMP $
; lặp
tại chỗ để chương
trình không kết thúc

N


Source code:
ORG
MAIN:
MOV
CALL
MOV

2000H
DPTR , #8000H
LCD
A,#01H

CALL

WRITE


MOV

R5,#5

MOV
MOV
LAP: CALL
CALL
INC
MOV
DJNZ
SJMP

BANG:
MOV
MOVC
RET

;Truy xuất đến LCD
;Khởi động LCD cài đặt thông số cần thiết
;cho A=#01H để truyền lệnh vào
;LCD xóa màn
; hình LCD

;Tạo vòng lặp 5 lần ứng với
;chữ HELLO có 5 kí tự
A,#0
;Khởi tạo A bằng đầu từ kí tự thứ nhất
R4,#0
;Khởi tạo biến đếm để tăng giá trị A

; (vì A dễ thay đổi trong quá trình làm)
BANG
;Gọi bảng mang kí tự
WRITE_TEXT
;Hiển thị lên LCD
R4
;Tăng biến đêm R4 để gán vào A
A,R4
R5,LAP
;Giảm R5 rồi quay lại
$
;Lặp tại chỗ để không làm
; tiếp câu lệnh tiếp theo

DPTR,#TABLE
A,@A+DPTR

;gọi bảng
;Gán vào A kí tự thứ A của chuỗi kí tự

MOV

A,#38H

;Khởi động LCD
;truyền lệnh cho LCD giao tiếp 8 bit,
; 2 dòng với font 5x8

LCALL
MOV


WRITE
A,#0EH

LCALL
MOV

WRITE
A,#06H

LCALL
RET

WRITE

LCD:

WRITE_TEXT:
MOV
SETB

DPTR,#8000H
P3.4

;truyền lệnh cho LCD hiển thị cursor nhưng
;không hiển thị blinking
; truyền lệnh cho LCD hiển
;thị tăng, không shift

;hiển thị kí tự trong thanh ghi A bằng LCD

;Truy xuất đến LCD
;Khởi động chế độ


SETB
MOVX

P3.5
@DPTR,A

CLR
LCALL
RET

P3.4
WAIT

WRITE:
MOV
SETB
CLR

DPTR,#8000H
P3.4
P3.5

MOVX

@DPTR,A


CLR
LCALL
RET

P3.4
WAIT

WAIT:
PUSH
PUSH
MOV
LAP1:
MOV
DJNZ
DJNZ
POP
POP
RET

;Bật chế độ nhận kí tự hiển thị ra LCD
;Nhận kí tự qua từ thanh ghi A vào nội dung
; DPTR (là @DPTR)
;để hiển thị
;Kết thúc chế độ

07

;nhận lệnh từ thanh ghi A vào LCD
;Truy xuất đến LCD
;khởi động chế độ

;Bật chế độ nhập lệnh từ
;thanh ghi A vào LCD
;Nhận lệnh từ thanh ghi A vào
; nội dung DPTR (là @DPTR)
;Kết thức chế độ

;tạo thời gian delay để nhận lệnh, hay tốc độ
; hiện kí tự trên LCD

06
R7,#250
R6,#250
R6,$
R7,LAP1
06
07

TABLE:
DB 'HELLO'
END

;Bảng chứa chuỗi kí tự muốn hiển thị trên LCD

4) Giao Tiếp Qua Cổng Nối Tiếp:
Lý thuyết cơ bản:
Về cơ bản, phần cứng đã có trong giáo trình. Phần này ta sử dụng thêm hiển thị LCD
đã được nói ở thí nghiệm trước.
Lưu ý: xác định chính xác tốc độ baud. Trên LCD do hiển thị có 2 hàng mỗi hang 16
ký tự, nhưng thực tế thì
Yêu Cầu: Viết chương trình nhập 1 ký tự từ cổng nối tiếp hiển thị lên CLD đồng thời

phát ra cổng nối tiếp.



Lưu đồ giải thuật:

ORG

Khởi tạo các giá trị cho:
1. SCON
2. TMOD
3.
LCD

Gọi chương trình con nhập dữ
liệu.

Xuất dữ liệu lên LCD và cổng
nối tiếp.

Yes

No
Nhập ký tự nữa
hay không.

Code:
ORG

2000H


MOV

SCON,#52H

; cổng nối tiếp , chế độ 1

MOV

TMOD,#20H

; time 1 mode 2

MOV

TH1,#-3

; Trị nạp cho 19200 baud

SETB

TR1

; cho time 1 chạy

MOV

A,#01H

; xóa màn hình LCD


CALL

WRITE

MOV

DPTR,#8000H

Nhảy tại chỗ chờ
lệnh kế tiếp.


CALL

LCD

CALL

IN

CALL

WRITE_TEXT

CALL

OUT

SJMP


LAP

SJMP

$

LAP:
; Gọi chương trình con nhập dữ liệu vào.

; Gọi chương trình con xuất dữ liệu ra.

;================
;============================
;======= Các chương trình con.

OUT:
JNB

TI,$

; Chờ phát xong byte trước đó

CLR

TI

;Chuẩn bị phát byte kế tiếp.

MOV


SBUF,A

;Phát

JNB

RI,$

;Chờ nhận xong 1 byte

CLR

RI

;Nhận byte kế tiếp

MOV

A,SBUF

; Chuyển byte kế tiếp vào trong A

RET
IN:

RET
;================================
;=====================================
;=== Dưới đây là phần giao tiếp với LCD đã được nói ở mục trước.

LCD: MOV

A,#38H

LCALL

WRITE

MOV

A,#0EH

LCALL

WRITE

MOV

A,#06H

LCALL

WRITE


RET

WRITE_TEXT:
MOV


DPTR,#8000H

SETB

P3.4

SETB

P3.5

MOVX

@DPTR,A

CLR

P3.4

LCALL

WAIT

RET

WRITE:
MOV

DPTR,#8000H

SETB


P3.4

CLR

P3.5

MOVX

@DPTR,A

CLR

P3.4

LCALL

WAIT

RET
WAIT:
MOV

R7,#4

LAP1:
MOV

R6,#250


DJNZ

R6,$

DJNZ

R7,LAP1

RET
END


5) Điều Khiển ADC:
Lý thuyết cơ bản:
Về cơ bản, phần cứng đã có trong giáo trình. Phần này ta sử dụng thêm hiển thị
LCD đã được nói ở thí nghiệm trước. Tuy nhiên lưu ý thêm về hoạt động và thiết kế
của ADC0809 đã được nêu trong giáo trình.
Lưu ý:
Lưu ý các lệnh giao tiếp với ADC.
Cách hiện thị số nhị phân (hiện đang thể hiện giá trị thập phân ).
Yêu cầu: Viết chương trình thực hiện đọc điện áp kênh 0 và hiển thị lên LCD.
Lưu đồ giải thật:

ORG 2000H

Kết hợp địa chỉ ADC với kênh
Lệnh chuyển đổi kênh
Delay

Lấy dữ liệu từ ADC ra cất vào thanh ghi

A
Nhân A với 5.
Hiển thị hang đơn vị .
Nhân giá trị hang thập phân thứ nhất với
10
Hiển thị giá trị thập phân thứ nhất.
yes

no
Giá trị có thay
đổi

Nhảy tại chỗ


Lưu ý: Lưu đồ giải thuật của LCD đã được nói tại phần LCD.
CODE và chú thích:
ORG

2000H

MOV

A,#01H

CALL

WRITE

MOV


DPTR,#8000H

CALL

LCD

MOV

A,#01H

CALL

WRITE

MOV

DPTR,#4000H

LAP:
;xóa man hình LCD

;Giao tiếp với ADC địa chỉ
; ADC với kênh
;Lệnh chuyển đổi kênh tương ứng

MOVX

@DPTR,A


MOV

R7,#50

DJNZ

R7,$

MOVX

A,@DPTR

MOV

B,#05H

MUL

AB

; thực hiện phép nhân A.B

MOV

R3,A

; bit thấp vào R3

MOV


A,B

;bit cao chuyển vào A

MOV

DPTR,#TABLE

; hiển thị số. Giao tiếp với LCD

MOVC

A,@A+DPTR

CALL

WRITE_TEXT

MOV

A,#'.'

CALL

WRITE_TEXT

MOV

B,#10


;Delay rất quan trọng để đợi giá trị của ADC

; đọc ngoại vi để lấy giá trị

; chuyển 10 vào B


MOV

A,R3

; Lấy bit thấp

MUL

AB

; Hiển thị chữ số thập phân thứ nhất
; sau dấu phẩy

MOV

A,B

;chuyển bit cao vào A

MOV

DPTR,#TABLE


; Hiển thị số. Giao tiếp với LCD

MOVC

A,@A+DPTR

CALL

WRITE_TEXT

CALL

WAIT

MOV

A,#'V'

CALL

WRITE_TEXT

CALL

WAIT

SJMP

LAP


SJMP

$

;==============================
;====================================
;===== Các chương trình con giao tiếp với LCD đã nói ở phần trước
LCD: MOV

A,#38H

LCALL

WRITE

MOV

A,#0EH

LCALL

WRITE

MOV

A,#06H

LCALL

WRITE


RET
WRITE_TEXT:
MOV

DPTR,#8000H

SETB

P3.4

SETB

P3.5

MOVX

@DPTR,A

CLR

P3.4


LCALL

WAIT

RET


WRITE:
MOV

DPTR,#8000H

SETB

P3.4

CLR

P3.5

MOVX

@DPTR,A

CLR

P3.4

LCALL

WAIT

RET

WAIT:
PUSH


07

PUSH

06

MOV

R7,#4

LAP1: MOV

R6,#250

DJNZ

R6,$

DJNZ

R7,LAP1

POP

06

POP

07


RET
XUAT:
MOV

DPTR,#0000H

MOV

X @DPTR,A

RET
TABLE:
END

DB 030H,031H,032H,033H,034H,035H,036H,037H,038H,039H


6) Thí nghiệm giao tiếp cảm biến nhiệt độ
ĐỀ BÀI :Viết chương trình đo và hiển thị nhiệt độ lên LCD
CHUẨN BỊ:
-

Cách sử dụng giao thức 1-Wire
Datasheet DS18S20
Các chương trình con liên quan tới LCD ở các bài trước

Một vài chú ý trước khi viết code

Định dạng thanh ghi nhiệt độ.


Bit S ở đây đóng vai trò là bit dấu.
Tuy nhiên bài toán của chúng ta là đo nhiệt độ phòng. Nên mình xin phép bỏ qua bit
dấu luôn cho nó là 0 ( tức nhiệt độ luôn dương). Ta chỉ xét 8 bit thấp qui định giá trị
của nhiệt độ phòng. Mộ điểm lưu ý nữa là vì nhiệt độ phòng nên bỏ qua việc so sánh
với giá trị TH,TL vì nhiệt độ phòng ta thí nghiệm luôn nằm trong khoảng âm 55 độ C
tới dương 85 độ C
Bài này ta sẽ truy xuất với DS18S20 thông qua port P3.2


Sơ đồ định thì khởi động DS1820. Dùng chương trình con RESET _DS1820
Theo sơ đồ thì ta sẽ tạo 1 xung reset 50% chu kì khoảng 1ms bằng cách.
ban đầu CLR P3.2 sau đó delay khoảng 500 µs. Set bit P3.2 delay tương ứng 500 µs

Sơ đồ định thì khe thời gian đọc/ghi
Hình 1 dùng để định thì thời gian ghi. Dùng cho chương trình con WRITE_TIME
SLOT.theo sơ đồ thời gian clear P3.2 là khoảng 60 µs. thời gian set là khoảng 2 µs


Hình 2 dùng để định thì thời gian đọc. Dùng cho chương trình con READ_TIME
SLOT. Theo sơ đồ thời gian clear P3.2 khoảng 15 µs. set là 45 µs. nhưng thực tế khi
viết code nó không chạy đúng tham khảo tài liệu mà mình tự mày mò dịnh thì lại thì
mình định thì như trong chương trình con thì lại chạy ổn.
các lệnh NOP ở đây giúp tạo thời gian delay để hoàn tất việc nhận bit. Số lệnh NOP
do ta tự định thì. Việc định thì là công việc khó khăn nhất ở đây !
Với đặc thù kit chỉ có 1 cảm biến nhiệt đô nên ta chỉ sử dung 1 số lệnh RO M và chức
năng sau
lệnh ROM:
- SKIP ROM (CCh)
Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của
DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian

chờ đợi nhưng chỉ mang hiệu quả khi trên bus chỉ có một cảm biến.
Lệnh chức năng DS1820
- CONVERT T (44h)
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị
phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt
độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi không quá 200 ms, trong thời gian
đang chuyển đổi nếu thực hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- READ SCRATCHPAD (BEh)
Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá trình đọc bắt đầu từ bit
có ý nghĩa nhất của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ
có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có
một phần của dữ liệu trên bộ nhớ nháp cần được đọc.


ORG
2000

Tạo xung reset xác nhận sự có
mặt của cảm biến

Gọi lệnh SKIP ROM
Truy xuất thẳng tới DS1820

Cấu trúc 1 lần truy xuất
DS18S20 gồm 3 lệnh.
Tạo 1 xung reset

Gọi lệnh CONVERT T
Ra lệnh bắt đầu chuyển đổi
nhiệt độ


Tạo xung reset

Gọi lệnh SKIP ROM

Gọi lệnh READ SCRATCHPAD
Đọc nội dung bộ nhớ nháp chứa giá trị
nhiệt độ

Gọi chương trình READ BYTE
Đọc giá trị nhiệt độ khỏi cảm biến và
lưu trên thanh ghi A

Xuất giá trị ra
LCD

1 lệnh ROM
1 lệnh chức năng


Ví dụ : giả sử muốn thao tác lệnh SKIP ROM với DS18S20.
Thanh ghi A chứa giá trị 44H
Nhiệm vụ của write_time _slot:

C

P3.2

Chuyển 1 bit dữ liệu từ C vào P3.2. khi muốn truy xuất lệnh SKIPROM thì ta sẽ
chuyển dần từng bit mã lệnh của SKIPROM là 44H vào P3.2 thông qua cờ C


Nhiệm vụ của Read_time_slot:

C

P3.2

Đọc 1 bit dữ liệu từ P3.2 ra C . khi đọc dữ liệu ra thanh ghi A. ta cũng thực hiện tương
tự đọc dần từng bit thông qua cờ C.

SOURCE CODE
ORG 2000H
; gán dùng R2 như là thanh ghi đếm

DEM

EQU R2

JMP

CHUONG_TRINH_CHINH

WRITE_TIME_SLOT:
CLR

P3.2

; chương trình ghi từng bit vào DS18S20
; thông qua cổng P3.2


NOP
NOP
MOV

P3.2, C

MOV

R5, #30

LCALL

DELAY

SETB

P3.2

NOP
NOP
RET
READ_TIME_SLOT:
CLR
NOP
NOP

P3.2

; chương trình đọc từng bit từ DS1820 ra cờ C
; thông qua bit P3.2



SETB

P3.2

NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV

C,P3.2

MOV

R5,#50

LCALL

DELAY

RET
RESET_DS1820:

; tạo xung reset phát hiện sự có

; mặt của slave(DS18S20)

CLR

P3.2

MOV

R5,#255

LCALL

DELAY

SETB

P3.2

MOV

R5,#255

LCALL

DELAY

RET
; chương trình gọi lệnh điều

WRITE_BYTE:


; khiển DS1820
MOV

DEM,#8

; gán giá trị đếm là 8.
;Tức là ta dịch 8 bit

WRITE_LAI:
RRC

A

LCALL

WRITE_TIME_SLOT


DJNZ

DEM, WRITE_LAI

SETB

P3.2

MOV

R5,#50


LCALL

DELAY

RET
;chương trình gọi lệnh đọc

READ_BYTE:

; từng bit dữ liệu
DEM,#8

; chứa giá trị nhiệt độ

LCALL

READ_TIME_SLOT

; đọc 1 bit lưu vào cờ C

RRC A

;

MOV
READ_LAI:

DJNZ


DEM,READ_LAI

dịch bit từ cờ C vào A
; thưc hiện lần lượt 8 lần ứng
;vơi 8 bit

MOV

R5,#50

;delay 100µs dảm bảo
;hoàn tất việc dịch bit

LCALL

DELAY
; kết thúc chương trình con giá

RET

; trị nhị phân nhiệt độ lưu ở A
;chương trình delay R5*2 micro giây

DELAY:
DJNZ

R5,$

RET
DELAY_LONG:


; delay dài delay 2*255*R5
;micro giây

MOV

R6,#0FFH

DELAY_LAI:
LCALL

DELAY

DJNZ

R6, DELAY_LAI

RET


CHUONG_TRINH_CHINH:
;=======xóa màn hình LCD========
MOV

DPTR,#8000H

CALL

LCD


LAP: MOV

A,#01H

;===========================
CALL

WRITE

SETB

P3.2

;set bit P3.2 để bắt đầu thao
; tác với DS18S20

AGAIN:
LCALL

RESET_DS1820

;gọi chương trình tạo xung reset

MOV

A,#0CCH

; gọi lệnh SKIP ROM.
; Truy xuất thẳng


LCALL

WRITE_BYTE

; tới DS1820 vì ở đây
;chỉ có 1 cảm biến

MOV

A,#44H

; lệnh CONVERT T

LCALL

WRITE_BYTE

; bắt đầu chuyển đổi nhiệt
; độ sang nhị phân

LCALL

RESET_DS1820

; xong 1 lần truy xuất
;phải reset đợi lần kế
; tương tự trên gọi SKIP ROM

MOV


A,#0CCH

LCALL

WRITE_BYTE

MOV

A,#0BEH

;lệnh READ SCRATCHPAD

LCALL

WRITE_BYTE

; đọc dần ô nhớ nháp chứa
;giá trị nhiệt độ

LCALL

READ_BYTE

; đọc dần

CLR C

;xóa cờ C vì dùng cờ C để lưu bit 0

RRC A


; dịch phải A có cờ C để
; lưu bit vào cờ C


MOV

P1.0,C

; A đang chứa 7 bit
; phần nguyên của nhiệt độ

MOV

B,#10

DIV

AB

; chia A cho 10 vì giá trị
; nhiệt độ gồm 2 chữ số

MOV

DPTR,#TABLE

MOVC

A,@A+DPTR


; A chứa số hàng chục

CALL

WRITE_TEXT

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

MOV

A,B

;B chứa hàng đơn vị

MOV

DPTR,#TABLE

;chuyển B vào A để xuất ra LCD

MOVC

A,@A+DPTR

CALL

WRITE_TEXT

; xuất số hàng đơn vị ra LCD


MOV

A,#'.'

; xuất dấu . lên LCD

CALL

WRITE_TEXT

MOV

C, P1.0

;xét bit 0 tức là cờ C xem nhiệt độ

JC

DOLE

; có phần thập phân hay không

SJMP

DOCHAN

DOLE:
MOV


A,#'5'

; nếu bit 0 là 1 thì nhiệt
; độ lẻ xuất xx.5 độ C

CALL

WRITE_TEXT

SJMP

NHAY

DOCHAN:
MOV

A,#'0'

;nếu bit 0 là 0 thì nhiệt độ
;chẵn xuất xx.0 độ C

CALL

WRITE_TEXT

SJMP

NHAY

NHAY:

CALL

WAIT


×