Nếu có tính hiệu RD xung cao xuống thấp thì dữ liệu số dạng 8 bit được đưa tới các chân dữ liệu từ D0 – D7.. WR Write – Ghi Đây là chân vào tích cực mức thấp được dùng để báo cho ADC0804
Trang 1Nhận Xét của giáo viên Hướng Dẫn
Ngày…….Tháng…… Năm………
Trang 2Nhận xét của giáo viên phản biện
Ngày…… Tháng…… Năm………
Trang 3Lời nói đầu
Với khoa học và kĩ thuật phát triển như hiện nay thì việc đo nhiệt độ của môi trường có thể thực hiện được dẽ dàng bằng nhiệt kế thủy ngân, hoặc cũng có thể là mạch đo nhiệt độ được trình bày ở đồ án này, tuy nhiên chúng em muốn nói đến kĩ thuật lập trình 8051 giao tiếp với ADC0804 Với một con cảm biến LM35, ADC0804, 89C51, LCD và một số phụ kiện khác là ta có thể dễ dàng ráp 1 mạch đo nhiệt độ có thể hiển thị chính xác và rõ ràng trên màn hình tinh thể lỏng Một điều đáng nói đến nữa là mạch có thể dễ dàng nâng cấp để đo được nhiệt độ cao hơn bằng cách thay cảm biến nhiệt và điều chỉnh một ít mã của chương trình
Do chưa có nhiều kinh nghiệm và điều kiện có hạn nên đề tài của chúng em còn nhiều sai sót Rất mong sự đóng góp ý kiến chân tình của thầy cô và các bạn để đề tài được hoàn chỉnh hơn
Trang 4Mục lục
o0o 1 Giới thiệu và mô tả chức năng ……… … Trang 5
2 Hoạt động của ADC0804……….Trang 5
3 Cảm biến LM35D……… Trang 6
4 Hoạt động của LCD……… Trang 6
5 Lưu đồ giải thuật………Trang 10
6 Chương trình……… Trang 12
Trang 51 Giới thiệu và mô tả chức năng
C 2
V R 1
1K
V C C + 5V
S W 1
8951
29 30
31 19 18
9
39 38 37
36 35 34 33 32
1 2 3
4 5 6 7 8
21 22 23 24 25 26 27 28
10 11 12 13 14 15 16 17
P S E N
A LE
E A
X 1
X 2
R S T
P 0.0/A D 0
P 0.1/A D 1
P 0.2/A D 2
P 0.3/A D 3
P 0.4/A D 4
P 0.5/A D 5
P 0.6/A D 6
P 0.7/A D 7
P 1.0
P 1.1
P 1.2
P 1.3
P 1.4
P 1.5
P 1.6
P 1.7
P 2.0/A 8
P 2.1/A 9
P 2.2/A 10
P 2.3/A 11
P 2.4/A 12
P 2.5/A 13
P 2.6/A 14
P 2.7/A 15
P 3.0/R X D
P 3.1/T X D
P 3.2/IN T 0
P 3.3/IN T 1
P 3.4/T 0
P 3.5/T 1
P 3.6/W R
P 3.7/R D
A D C 0804
6
9
11 12 13 14 15 16 17 18
19
4
5
2 3
+ IN
V R E F /2
D B 7
D B 6
D B 5
D B 4
D B 3
D B 2
D B 1
D B 0
C LK R V
C LK IN
IN T R
R D
W R
R 1 10K
C 1 150p\
C 5
100u
LC D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
R 3
R
V R 2
Y 1
T her
1 2 3
V + out
G nd
Do đặc tính của LM35D nên mạch có đo đuợc khoảng nhiệt độ từ 0 ->100oC, có thể ứng dụng mạch để đo nhiệt độ phòng
Mạch hoạt động dựa trên nguyên tắc chung như sau: cảm biến đo nhiệt độ biến thiên theo tỉ lệ 10mV/1oC , sau đó được đưa vào bộ biến đổi ADC để biến đổi thành mã nhị phân 8 bit, sau đó dữ liệu được đưa vào 89C51 Vi xử lý kiểm tra xem nếu quá
100oC thì hiển thị thông báo “OVER TEMP”, nếu không thì sẽ hiển thị trị số nhiệt độ đo được
RD (Read) – đọc
Đây là chân tín hiệu vào, tích cực mức thấp, đây là tín hiệu điều khiển cho phép đọc Khi bộ ADC đã chuyển đổi xong tín hiệu tương tự sang số và giữ nó ở một thanh ghi trong Nếu có tính hiệu RD (xung cao xuống thấp) thì dữ liệu số dạng
8 bit được đưa tới các chân dữ liệu từ D0 – D7
WR (Write) – Ghi
Đây là chân vào tích cực mức thấp được dùng để báo cho ADC0804 bắt đầu quá trình chuyển đổi tín hiệu tương tự sang số Lượng thời gian cần thiết cho quá trình chuển đổi phụ thuộc vào tần số đưa vào chân CLK IN và CLK R Khi việc chuyển đổi hoàn tất thì thì chân INTR được ADC0804 hạ xuống mức thấp INTR (Interrupt) – Ngắt
Đây là chân xuất, tích cực mức thấp Bình thường chân này ở mức thấp khi việc chuyển đổi dữ liệu được hoàn tất thì nó hạ xuống thấp để báo cho VDK đã kết thúc quá trình chuyển đổi, và sẵn sàng để đọc dữ liệu (RD)
Trang 6D0 – D7
Đây là các chân dữ liệu số ra (D7 là bit có trọng số cao nhất MSB) Giá trị số đầu ra được tính theo công thức:
Vref/2
Đây là chân điện áp đầu vào dùng làm điện áp tham chiếu.Nếu chân này hở thì dãy điện áp đầu vào Vin nằm trong dãy 0 -> 5V (giá trị đo được tại Vref/2 là 2.5V) Nếu cấp áp cho Vref thì dãy điện áp đầu vào Vin nằm trong khoảng 0 -> 2Vref/2
Ở mạch này do cảm biến LM35 biến thiên 10mV/1oC nên độ phân giải R (R=2Vref / 256) phải bằng 10mV Vì vậy dãy điện áp Vin nằm trong khoảng 0 -> 2,56V, đó là lý do ta cấp cho Vref/2 một điện áp là 1,28V Chiết áp VR1 dùng để thay đổi trị số R (10 ± α), Vì vậy ta có thể dùng VR1 chỉnh lại trị số nhiệt độ của mạch sao cho hiển thị chính xác nhiệt độ thực tế của môi trường
Chương trình con đọc dữ liệu từ ADC0804
READ_ADC:
CLR WRITE ;Xung Tạo xung từ cao xuống thấp tại chân P1.1 (WRITE)
NOP
SETB WRITE ;Cho phép ADC bắt đầu chuyển đổi
JB INTR,$ ;Chờ ADC chuyển đổi xong (Khoảng 110us)
CLR READ ;Cho phép đọc ADC
MOV A,ADC ;Đọc giá trị đã chuyển đổi vào thanh ghi A
MOV TEMP,A ;Lưu chỉ số nhiệt độ vào ô nhớ TEMP
SETB READ
RET
Đây là cảm biến nhiệt, mạch tích hợp, chính xác cao, có điện áp đầu ra tỉ lệ tuyến tính với nhiệt độ theo thang độ Celsius (độ C) Cảm biến nhiệt này không yêu cầu cân chỉnh bên ngoài vì nó đã được căn chỉnh rồi Cảm biến này cho ra điện áp 10mV/1oC, và dãi nhiệt độ của nó từ 0 -> 100oC
Chức năng của từng chân LCD
3 Chỉnh độ sáng
4 “R/S” Chọn thanh ghi
Trang 75 “R/W” Đọc/Ghi
6 “EN” xung clock
7 - 14 “DATA” Các chân xuất nhập dữ liệu
Chân 3: là chân điều khiển VEE dùng để thay đổi độ tương phản của màn hiển thị Lý tưởng thì chân này nên nối nguồn điện áp thay đổi được, người ta thực hiện bằng cách gắn mạch chia áp dùng biến trở có đầu ra thay đổi đưa vào chân này; tuy nhiên nên chú ý là một số module cần nguồn điện DC – 7V Đơn giản nhất là người ta nối chân này với 0V (xuống đất )
Chân 4: là đường RS (Register Select=chọn thanh ghi ) đây là 1 trong 3 ngõ vào điều
khiển lệnh.Khi chân này để mức thấp thì các dữ liệu được truyền đến LCD được xử lí như các mệnh lệnh và các dữ liệu đọc ra chỉ trạng thái của nó Bằng cách đưa đường
RS này lên mức cao thì dữ liệu ký tự có thể xuất /nhập trên module này
Chân 5: là đường R/W (read / wile ) Chân này được kéo xuống mức thấp để ghi các
lệnh hay dữ liệu ký tự vào module hoặc được léo lên mức cao để đọc dữ liệu ký tự hay thông tin trạnh thái từ các thanh ghi của nó
Chân 6: là đường E (enable), ngõ vào này dùng để khởi động việc chuyển các lệnh
hay dữ liệu ký tự giữa module và các đường dữ liệu Khi ghi ra màn hình hiển thị LCD,
dữ liệu chỉ được chuyển khi có cạnh xuống ở tín hiệu E này Tuy nhiên khi đọc ra từ LCD thì dữ liệu khã dụng sau khi có chuyển tiếp từ thấp lên cao và duy trì dữ liệu khã dụng cho đến khi tín hiệu xuống thấp một lần nữa
Gửi lệnh đến LCD
Dựa trên các chân điều khiển RS, RW, EN ta có thể viết đoạn lệnh thực hiện gởi lệnh đến LCD như sau:
SEND_COM:
CLR RS ; RS = 0 : D li u đ c truy n x lý nhữ ệ ượ ề ử ư
; m nh l nhệ ệ
CLR RW ; RW = 0 : Ghi l nhệ
MOV DATABUS,A ; Mã l nh ch a trong Aệ ứ
NOP
SETB EN
LCALL WAIT_LCD ; Ki m tra tr ng thái b n c a LCDể ạ ậ ủ
RET
Bảng mã lệnh của LCD 16xx, 20xx
R/S R/W D7 D6 D5 D4 D3 D2 D1 D0 Instruction/Description
Trang 84 5 14 13 12 11 10 9 8 7 Chân
0 0 0 0 0 0 0 0 1 * Trả con trỏ về vị trí đầu tiên
0 0 0 0 0 0 0 1 ID S Chế độ nhập kí tự
0 0 0 0 0 0 1 D C B Hiển thị tắt/mở & cursor
0 0 0 0 0 1 SC RL * * Dịch hiển thị/cursor
0 0 0 0 1 DL N F * * Đặt chức năng
0 1 BF * * * * * * * Cờ bận & bộ đếm địa chỉ
1 0 D D D D D D D D Ghi dữ liệu ra màn hình LCD
1 1 D D D D D D D D Đọc dữ liệu từ LCD
Sơ đồ Timing
Trang 9 Kiểm tra trạng thái bận của LCD
LCD thực thi mỗi lệnh mất một khoảng thời gian, nên ta phải luôn kiểm tra xem LCD
có bận không trước khi gởi lệnh hay dữ liệu đến nó bằng đoạn lệnh sau:
WAIT_LCD:
SETB RW ; Ch đ đ cế ộ ọ
MOV DATABUS,#0FFH
NOP
SETB EN
MOV A,DATABUS
JB ACC.7,WAIT_LCD ; Ki m tra c b n b ng cách liên đ c nóể ờ ậ ằ ọ
RET
Khởi động LCD.
Trước khi sử dụng LCD thì ta phải khởi động và đặt cấu hình cho nó Việc này được thực hiện bằng cách gởi một số lệnh khởi động đến LCD
INIT_LCD:
MOV A,#30H ;MODE 8 BIT,1 LINE
LCALL SEND_COM
MOV A,#0CH ;Cho phép LCD hi n thể ị
LCALL SEND_COM
RET
Trang 10 Hiển thị kí tự
Giống đoạn mã gửi lệnh chỉ khác ở chổ thay RS = 1 WRITE_TEXT:
SETB RS ; Ch đ g i d li uế ộ ử ữ ệ
CLR RW
MOV DATABUS,A
NOP
SETB EN
LCALL WAIT_LCD
RET
Trang 11Khởi động LCD Đặt cờ cho phép hiển thị lên mức 1
Cho phép chuyển đổi dữ liệu
(WR = 0)
Chờ chuyển đổi dữ liệu xong
Chuyển dữ liệu sang
mã ASII
Cho phép đọc dữ liệu
số (RD = 0)
Lưu mã ASCII đã chuyển được vào R3, R2
Read ADC
Hex->ASCII
TEST_TEMP
t >= 100
Xóa cờ cho phép hiển thị DISP_FLAG
Yes
No
t = 100 Yes
No
Hiển thị text: “TEMP 100 O C”
t > 100 “TEMP OVER”
1
No
Trang 126 Chương trình
$MOD51
;LCD
DATABUS EQU P2
RS BIT P0.0
RW BIT P0.1
EN BIT P0.2
;ADC
ADC_BUS EQU P3
READ BIT P1.0
WRITE BIT P1.1
INTR BIT P1.2
;DATA
COUNT EQU 22H ;Byte ch a mã ASCII (tăng t 0->9) ứ ừ
DISP_FLAG BIT 00H ;C cho phép hi n th ờ ể ị
ORG 000H
LJMP MAIN
ORG 030H
; **********************************************************
; MAIN
; **********************************************************
MAIN:
MOV SP ,#2FH ;V trí c a Stack t 30H ị ủ ừ
MOV COUNT,#30H ;Bit đ m hi n th tr ng thái làm vi c ế ể ị ạ ệ
SETB DISP_FLAG ;Cho phép hi n th ho c không ể ị ặ
ACALL INIT_LCD ;Kh i đông LCD ở
LCALL CLEAR_LCD ;Xóa LCD
SAMPLE:
ACALL READ_ADC ;L y m u ấ ẫ
ACALL HEX_ASCII ;Chuy n t mã Hex->ASCII ể ừ
ACALL TEST_TEMP ;Ki m tra xem có quá 100 ể o C hay không
ACALL DISPLAY ;Hi n th trên LCD ể ị
SETB DISP_FLAG ;Đ t c cho phép hi n th ặ ờ ể ị
SJMP SAMPLE
; **********************************************************
; **********************************************************
READ_ADC:
MOV ADC_BUS,#0FFH
CLR WRITE ;T o xung t cao xu ng th p t i chân WR (P1.1) ạ ừ ố ấ ạ
NOP
SETB WRITE ;Cho phép ADC b t đ u chuy n đ i t ng t -> s ắ ầ ể ổ ươ ự ố
JB INTR,$ ;Ch chuy n đ i d li u xong ờ ể ổ ữ ệ
MOV TEMP,ADC_BUS ;L u mã Hex c a nhi t đ vào byte nh TEMP ư ủ ệ ộ ớ
Trang 13; **********************************************************
; HEX -> BCD -> ASCII (R3,R2)
; **********************************************************
HEX_ASCII:
MOV A ,TEMP ;Đ a giá tr Hex vào thanh ghi A đ x lý ư ị ế ư
MOV B ,#10
ADD A ,#30H ;Mã ASCII c a nhi t đ (ch s hàng ch c) ủ ệ ộ ỉ ố ụ
MOV A B
ADD A ,#30H ;Mã ASCII c a nhi t đ (ch s hàng đ n v ) ủ ệ ộ ỉ ố ơ ị
RET
; **********************************************************
; HIEN THI LCD
; **********************************************************
DISPLAY: ;HIEN THI "TEMP" & t
JNB DISP_FLAG,EXIT ;N u c DISP_FLAG=0 thì không hi n th ế ờ ể ị
LCALL CLEAR_LCD
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#'T' ;Hi n th chu i text “TEMP” ể ị ổ
LCALL WRITE_TEXT
MOV ,#'E'
LCALL WRITE_TEXT
MOV ,#'M'
LCALL WRITE_TEXT
MOV ,#'P'
LCALL WRITE_TEXT
MOV ,#' ' ;Kho ng tr ng ả ắ
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
LCALL WRITE_TEXT
MOV , R2
LCALL WRITE_TEXT
MOV ,#0DFH ;Kí t ự o C
LCALL WRITE_TEXT
MOV ,#'C'
LCALL WRITE_TEXT
SPACE: ;T o kho ng tr ng ạ ả ẳ
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
STATUS: ;Hi n th tr ng thái th c thi ể ị ạ ự
MOV ,COUNT ;B t đ u t s 0 ắ ầ ừ ố
LCALL WRITE_TEXT
INC COUNT ;Tăng t 1->9 ừ
Trang 14MOV A ,COUNT
CJNE A ,#3AH,NEXT ;Đ n s 9 thì Reset ế ố
MOV COUNT,#30H ;RESET v s 0 ề ố
NEXT:
; *********************************************************
; DELAY 0.5s
; *********************************************************
DELAY_500M:
LOOP:
MOV TH0 ,#HIGH(-50000)
MOV TL0 ,#LOW(-50000)
ACALL DELAY
DJNZ R4 ,LOOP
EXIT:
RET
; **********************************************************
; **********************************************************
TEST_TEMP:
MOV A R3
SUBB A ,#30H ;ASCII -> HEX
MOV B ,#10
JNZ TEST2 ;Nh y khi T >= 100 ả
RET
TEST2:
CLR DISP_FLAG ;Không cho hi n th khi g i DISPLAY ể ị ọ
MOV A R2
SUBB A ,#30H ;ASCII -> HEX
JNZ OVER_TEMP ;Nh y khi T > 100 ả
ACALL T100
RET
; **********************************************************
; Thông báo "OVER TEMP"
; **********************************************************
OVER_TEMP:
LCALL CLEAR_LCD
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#'O' ;Chu i text “OVER TEMP” ổ
LCALL WRITE_TEXT
MOV ,#'V'
LCALL WRITE_TEXT
MOV ,#'E'
LCALL WRITE_TEXT
MOV ,#'R'
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#'T'
LCALL WRITE_TEXT
MOV ,#'E'
LCALL WRITE_TEXT
MOV ,#'M'
LCALL WRITE_TEXT
MOV ,#'P'
LCALL WRITE_TEXT
ACALL DELAY_500M
Trang 15; **********************************************************
; **********************************************************
T100:
LCALL CLEAR_LCD
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#'T' ;Chu i text “TEMP 100 ồ o C”
LCALL WRITE_TEXT
MOV ,#'E'
LCALL WRITE_TEXT
MOV ,#'M'
LCALL WRITE_TEXT
MOV ,#'P'
LCALL WRITE_TEXT
MOV ,#' '
LCALL WRITE_TEXT
MOV ,#'1'
LCALL WRITE_TEXT
MOV ,#'0'
LCALL WRITE_TEXT
MOV ,#'0'
LCALL WRITE_TEXT
MOV ,#0DFH
LCALL WRITE_TEXT
MOV ,#'C'
LCALL WRITE_TEXT
ACALL SPACE
RET
; **********************************************************
; LCD DISPLAY
; **********************************************************
INIT_LCD:
MOV ,#30H ;Ch đ 8 BIT,1 dòng ế ộ
LCALL SEND_COM
MOV ,#0CH ;Cho phép LCD hi n th ể ị
LCALL SEND_COM
RET
CLEAR_LCD:
MOV ,#01H ;Mã l nh xóa màn hình LCD ệ
LCALL SEND_COM
RET
SEND_COM:
MOV DATABUS, A ;Mã l nh ch a trong thanh A ệ ứ
NOP
SETB EN
LCALL WAIT_LCD ;Đ i cho l nh đ c th c thi hoàn toàn b i LCD ợ ệ ượ ự ờ
RET
WRITE_TEXT:
MOV DATABUS, A ;Mã ASCII c a text ch a trong thanh ghi A ủ ứ
NOP
Trang 16SETB EN
LCALL WAIT_LCD ;Đ i cho l nh đ c th c thi hoàn toàn b i LCD ợ ệ ượ ự ờ
RET
WAIT_LCD:
MOV DATABUS,#0FFH ;C u hình P2 làm port nh p ấ ậ
NOP
SETB EN
MOV ,DATABUS ;Đ c d li u t LCD ọ ữ ệ ừ
RET
;***************************************************
DELAY: ;Delay theo giá tr trong TH0 & TL0 ị
MOV TMOD ,#01H
SETB TR0
JNB TF0 ,$
CLR TR0
CLR TF0
RET
END
Trang 17Tài liệu tham khảo
1) Vi xử lý của Hồ Trung Mỹ
2) Datasheet of ADC0804, LM35D
3) Cấu trúc và lập trình họ VDK 8051 của Nguyễn Tăng Cường 4) Tài liệu lý thuyết & TH Vi Điều khiển của thầy Phạm Quang Trí