Nhận Xét của giáo viên Hướng Dẫn Nhận Xét của giáo viên Hướng Dẫn Ngày Tháng Năm Nhận xét của giáo viên phản biện Ngày Tháng Năm Lời nói đầu Với khoa học và kĩ thuật phát triển như hiện nay thì việc đ[.]
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
thị trị số nhiệt độ đo được
2 Hoạt động của ADC0804
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
Trang 6INTR (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)
D0 – 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
(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:
(WRITE)
NOP
MOV A,ADC ;Đọc giá trị đã chuyển đổi vào thanh ghi A
SETBREAD
RET
3 Cảm biến LM35
Đâ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
4 Hoạt động của LCD
Trang 7Chức năng của từng chân LCD
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
Trang 8Dự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
CLR EN ; Xung Enable
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 9 Sơ đồ Timing
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:
CLR RS ; Lệnh
SETB RW ; Chế độ đọc
MOV DATABUS,#0FFH
CLR EN ; Xung Enable
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
Trang 10MOV A,#30H ;MODE 8 BIT,1 LINE
LCALL SEND_COM
MOV A,#0CH ;Cho phép LCD hiển thị
LCALL SEND_COM
RET
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
CLR EN ; Xung Enable
NOP
SETB EN
LCALL WAIT_LCD
RET
5 Lưu đồ giải thuật
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”
1
No
Trang 126 Chương trình
$MOD51
;LCD
;ADC
;DATA
TEMP EQU 21H ;Byte lưu giá trị nhiệt độ (Hex)
LJMPMAIN
; **********************************************************
; MAIN
; **********************************************************
MAIN:
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á 100oC hay không
ACALL DISPLAY ;Hiển thị trên LCD
Trang 13; **********************************************************
; Giao tiếp ADC0804
; **********************************************************
READ_ADC:
NOP
CLR READ ;Đưa xung mức thấp đến chân RD (cho phép đọc
dữ liệu)
SETBREAD ;Đưa chân RD trở về mức cao (sẳn sàng tiếp tục đọc)
RET
; **********************************************************
; Chuyển mã
; HEX -> BCD -> ASCII (R3,R2)
; **********************************************************
HEX_ASCII:
MOV A,TEMP ;Đưa giá trị Hex vào thanh ghi A để xử lý
MOVB,#10
DIV AB ;A chứa nữa byte cao của mã BCD, B chứa nữa byte thấp
ADD A,#30H ;Mã ASCII của nhiệt độ (chỉ số hàng chục)
MOV R3,A ;Lưu vào R3
MOV A,B
ADD A,#30H ;Mã ASCII của nhiệt độ (chỉ số hàng đơn vị)
MOV R2,A ;Lưu vào R2
RET
; **********************************************************
; HIEN THI LCD
; **********************************************************
DISPLAY: ;HIEN THI "TEMP" & t
LCALL CLEAR_LCD
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'T' ;Hiển thị chuổi text “TEMP”
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
Trang 14MOV A,#'M'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
MOV A,#' ' ;Khoảng trắng
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,R3 ;Hiển thị chỉ số nhiệt độ
LCALL WRITE_TEXT
MOV A,R2
LCALL WRITE_TEXT
MOV A,#0DFH ;Kí tự oC
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,COUNT ;Bắt đầu từ số 0
LCALL WRITE_TEXT
MOV A,COUNT
CJNE A,#3AH,NEXT ;Đến số 9 thì Reset
NEXT:
; *********************************************************
; DELAY 0.5s
; *********************************************************
DELAY_500M:
MOV R4,#10 ;10 x 50000us = 0.5s
LOOP:
Trang 15RET
; **********************************************************
; Kiểm tra xem có quá nhiệt độ hay không ?
; **********************************************************
TEST_TEMP:
MOV A,R3
SUBB A,#30H ;ASCII -> HEX
MOVB,#10
DIV AB ;Nếu A khác 0 thì T >= 100oC
RET
TEST2:
MOV A,R2
SUBB A,#30H ;ASCII -> HEX
ACALL T100
RET
; **********************************************************
; Thông báo "OVER TEMP"
; **********************************************************
OVER_TEMP:
LCALL CLEAR_LCD
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'O' ;Chuổi text “OVER TEMP”
LCALL WRITE_TEXT
MOV A,#'V'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'R'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'T'
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'M'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
ACALL DELAY_500M
Trang 16; **********************************************************
; Hiển thị 1000C
; **********************************************************
T100:
LCALL CLEAR_LCD
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'T' ;Chuồi text “TEMP 100oC”
LCALL WRITE_TEXT
MOV A,#'E'
LCALL WRITE_TEXT
MOV A,#'M'
LCALL WRITE_TEXT
MOV A,#'P'
LCALL WRITE_TEXT
MOV A,#' '
LCALL WRITE_TEXT
MOV A,#'1'
LCALL WRITE_TEXT
MOV A,#'0'
LCALL WRITE_TEXT
MOV A,#'0'
LCALL WRITE_TEXT
MOV A,#0DFH
LCALL WRITE_TEXT
MOV A,#'C'
LCALL WRITE_TEXT
ACALL SPACE
RET
; **********************************************************
; LCD DISPLAY
; **********************************************************
INIT_LCD:
MOV A,#30H ;Chế độ 8 BIT,1 dòng
LCALL SEND_COM
MOV A,#0CH ;Cho phép LCD hiển thị
LCALL SEND_COM
RET
CLEAR_LCD:
Trang 17SEND_COM:
CLR RS ;Đặt RS=0 cho xuất lệnh
CLR RW ;Đặt RW=0, Chọn chế độ ghi
MOV DATABUS,A ;Mã lệnh chứa trong thanh A
NOP
SETBEN
LCALL WAIT_LCD ;Đợi cho lệnh được thực thi hoàn toàn bời LCD
RET
WRITE_TEXT:
SETB RS ;Đặt RS=1 cho xuất dữ liệu
CLR RW ;Đặt RW=0, Chọn chế độ ghi
MOV DATABUS,A ;Mã ASCII của text chứa trong thanh ghi A
NOP
SETBEN
LCALL WAIT_LCD ;Đợi cho lệnh được thực thi hoàn toàn bời LCD
RET
WAIT_LCD:
CLR RS ;Gửi lệnh
SETB RW ;Chế độ đọc
MOV DATABUS,#0FFH ;Cấu hình P2 làm port nhập
NOP
SETBEN
MOV A,DATABUS ;Đọc dữ liệu từ LCD
JB ACC.7,WAIT_LCD ;Nếu bit 7 ở mức cao, LCD vẫn bận
RET
;***************************************************
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END
Trang 18Tà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í