1. Trang chủ
  2. » Tất cả

Kĩ thuật lập trình 8051 giao tiếp với adc0804 do an 1 v9

19 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 231,5 KB

Nội dung

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 đ[.]

Nhận Xét giáo viên Hướng Dẫn Ngày…….Tháng…… Năm……… Nhận xét giáo viên phản biện Năm……… Ngày…… Tháng…… Lời nói đầu Với khoa học kĩ thuật phát triển việc đo nhiệt độ mơi trường thực dẽ dàng nhiệt kế thủy ngân, mạch đo nhiệt độ trình bày đồ án này, 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 cảm biến LM35, ADC0804, 89C51, LCD số phụ kiện khác ta dễ dàng ráp mạch đo nhiệt độ hiển thị xác rõ ràng hình tinh thể lỏng Một điều đáng nói đến mạch dễ dàng nâng cấp để đo nhiệt độ cao cách thay cảm biến nhiệt điều chỉnh mã chương trình Do chưa có nhiều kinh nghiệm điều kiện có hạn nên đề tài chúng em cịn nhiều sai sót Rất mong đóng góp ý kiến chân tình thầy bạn để đề tài hoàn chỉnh Mục lục o0o Giới thiệu mô tả chức ………………… … Trang Hoạt động ADC0804……………………………….Trang Cảm biến LM35D……………………………………… Trang Hoạt động LCD………………………………… Trang Lưu đồ giải thuật…………………………………………Trang 10 Chương trình…………………………………………… Trang 12 Giới thiệu mô tả chức VR2 19 VR1 1K R1 10K C1 150 p\ C LK R V R E F /2 DB DB DB DB DB DB DB DB C L K IN RD WR IN T R 18 17 16 15 14 13 12 11 10 11 12 13 14 15 16 17 P 0/A D P 1/A D P 2/A D P 0/A P 1/A P 2/A 10 P 3/A 11 P 4/A 12 P 5/A 13 P 6/A 14 P 7/A 15 P P 1 P C2 18 X2 PSEN A LE P 3/A D P 4/A D P 5/A D P 6/A D P 7/A D P P P P P Y1 19 SW P 0/R X D P 1/T X D P 2/IN T P 3/IN T P 4/T P 5/T P 6/W R P 7/R D VCC + IN X1 C3 C4 31 RS T 895 39 38 37 21 22 23 24 25 26 27 28 29 30 36 35 34 33 32 8 10 11 12 13 14 15 16 LC D 20 R3 R EA GND 20 A D C 804 CS GND A G ND - IN V+ out G nd V C C /V R E F T he r 10 C5 100 u 40 V C C + 5V Do đặc tính LM35D nên mạch có đo đuợc khoảng nhiệt độ từ >100 C, ứng dụng mạch để đo nhiệt độ phòng Mạch hoạt động dựa nguyên tắc chung sau: cảm biến đo nhiệt độ biến thiên theo tỉ lệ 10mV/1oC , sau đưa vào biến đổi ADC để biến đổi thành mã nhị phân bit, sau liệu đưa vào 89C51 Vi xử lý kiểm tra xem 100oC hiển thị thơng báo “OVER TEMP”, khơng hiển thị trị số nhiệt độ đo o Hoạt động ADC0804 RD (Read) – đọc Đây chân tín hiệu vào, tích cực mức thấp, tín hiệu điều khiển cho phép đọc Khi ADC chuyển đổi xong tín hiệu tương tự sang số giữ ghi Nếu có tính hiệu RD (xung cao xuống thấp) liệu số dạng bit đưa tới chân liệu từ D0 – D7 WR (Write) – Ghi Đây chân vào tích cực mức thấp dùng để báo cho ADC0804 bắt đầu trình chuyển đổi tín hiệu tương tự sang số Lượng thời gian cần thiết cho trình chuển đổi phụ thuộc vào tần số đưa vào chân CLK IN CLK R Khi việc chuyển đổi hồn tất thì chân INTR ADC0804 hạ xuống mức thấp INTR (Interrupt) – Ngắt Đây chân xuất, tích cực mức thấp Bình thường chân mức thấp việc chuyển đổi liệu hồn tất hạ xuống thấp để báo cho VDK kết thúc trình chuyển đổi, sẵn sàng để đọc liệu (RD) D0 – D7 Đây chân liệu số (D7 bit có trọng số cao MSB) Giá trị số đầu tính theo cơng thức: Vref/2 Đây chân điện áp đầu vào dùng làm điện áp tham chiếu.Nếu chân hở dãy điện áp đầu vào Vin nằm dãy -> 5V (giá trị đo Vref/2 2.5V) Nếu cấp áp cho Vref dãy điện áp đầu vào Vin nằm khoảng -> 2Vref/2 Ở mạch cảm biến LM35 biến thiên 10mV/1 oC nên độ phân giải R (R=2Vref / 256) phải 10mV Vì dãy điện áp Vin nằm khoảng -> 2,56V, lý ta cấp cho Vref/2 điện áp 1,28V Chiết áp VR1 dùng để thay đổi trị số R (10 ± α), Vì ta dùng VR1 chỉnh lại trị số nhiệt độ mạch cho hiển thị xác nhiệt độ thực tế mơi trường Chương trình đọc liệu từ ADC0804 READ_ADC: CLR WRITE ;Xung Tạo xung từ cao xuống thấp chân P1.1 (WRITE) NOP SETB WRITE ;Cho phép ADC bắt đầu chuyển đổi JB INTR,$ CLR READ MOV A,ADC MOV TEMP,A SETB READ RET ;Chờ ADC chuyển đổi xong (Khoảng 110us) ;Cho phép đọc ADC ;Đọc giá trị chuyển đổi vào ghi A ;Lưu số nhiệt độ vào ô nhớ TEMP Cảm biến LM35 Đây cảm biến nhiệt, mạch tích hợp, xác cao, có điện áp đầu tỉ lệ tuyến tính với nhiệt độ theo thang độ Celsius (độ C) Cảm biến nhiệt khơng u cầu cân chỉnh bên ngồi chỉnh Cảm biến cho điện áp 10mV/1oC, dãi nhiệt độ từ -> 100oC Hoạt động LCD Chức chân LCD PINS Chức Ground Vcc Chỉnh độ sáng “R/S” Chọn ghi “R/W” Đọc/Ghi “EN” xung clock - 14 “DATA” Các chân xuất nhập liệu Chân 3: chân điều khiển VEE dùng để thay đổi độ tương phản hiển thị Lý tưởng chân nên nối nguồn điện áp thay đổi được, người ta thực cách gắn mạch chia áp dùng biến trở có đầu thay đổi đưa vào chân này; nhiên nên ý số module cần nguồn điện DC – 7V Đơn giản người ta nối chân với 0V (xuống đất ) Chân 4: đường RS (Register Select=chọn ghi ) ngõ vào điều khiển lệnh.Khi chân để mức thấp liệu truyền đến LCD xử lí mệnh lệnh liệu đọc trạng thái Bằng cách đưa đường RS lên mức cao liệu ký tự xuất /nhập module Chân 5: đường R/W (read / wile ) Chân kéo xuống mức thấp để ghi lệnh hay liệu ký tự vào module léo lên mức cao để đọc liệu ký tự hay thông tin trạnh thái từ ghi Chân 6: đường E (enable), ngõ vào dùng để khởi động việc chuyển lệnh hay liệu ký tự module đường liệu Khi ghi hình hiển thị LCD, liệu chuyển có cạnh xuống tín hiệu E Tuy nhiên đọc từ LCD liệu khã dụng sau có chuyển tiếp từ thấp lên cao trì liệu khã dụng tín hiệu xuống thấp lần  Gửi lệnh đến LCD Dựa chân điều khiển RS, RW, EN ta viết đoạn lệnh thực gởi lệnh đến LCD sau: SEND_COM: CLR RS ; RS = : Dữ liệu truyền xử lý ; mệnh lệnh CLR RW ; RW = : Ghi lệnh MOV DATABUS,A ; Mã lệnh chứa A CLR EN ; Xung Enable NOP SETB EN LCALL WAIT_LCD ; Kiểm tra trạng thái bận LCD RET Bảng mã lệnh LCD 16xx, 20xx R/S R/W D7 D6 D5 D4 D3 D2 D1 D0 Instruction/Description 14 13 12 11 10 Chân 0 0 0 0 Xóa hình 0 0 0 0 * Trả trỏ vị trí 0 0 0 ID S Chế độ nhập kí tự 0 0 0 D C B Hiển thị tắt/mở & cursor 0 0 SC RL * 0 0 DL N F 0 A A A A A A Đặt địa CGRAM 0 A A A A A A A Đặt địa DDRAM BF * D D D D D D D D Ghi liệu hình LCD 1 D D D D D D D D Đọc liệu từ LCD * * * * * Dịch hiển thị/cursor * * Đặt chức * * Cờ bận & đếm địa  Sơ đồ Timing  Kiểm tra trạng thái bận LCD LCD thực thi lệnh khoảng thời gian, nên ta phải ln kiểm tra xem LCD có bận không trước gởi lệnh hay liệu đến đ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 cách liên đọc RET  Khởi động LCD Trước sử dụng LCD ta phải khởi động đặt cấu hình cho Việc thực cách gởi số lệnh khởi động đến LCD INIT_LCD: MOV A,#30H LCALL SEND_COM MOV A,#0CH LCALL SEND_COM RET ;MODE BIT,1 LINE ;Cho phép LCD hiển thị  Hiển thị kí tự Giống đoạn mã gửi lệnh khác chổ thay RS = WRITE_TEXT: SETB RS CLR RW MOV DATABUS,A CLR EN NOP SETB EN LCALL WAIT_LCD RET ; Chế độ gửi liệu ; Xung Enable Lưu đồ giải thuật 10 Start Khởi động LCD Đặt cờ cho phép hiển thị lên mức Cho phép chuyển đổi liệu (WR = 0) Read ADC Chờ chuyển đổi liệu xong Cho phép đọc liệu số (RD = 0) Hex->ASCII Chuyển liệu sang mã ASII Lưu mã ASCII chuyển vào R3, R2 No t >= 100 Yes Xóa cờ cho phép hiển thị DISP_FLAG TEST_TEMP No t = 100 t > 100 Yes Hiển thị text: “TEMP 100OC” 11 No “TEMP OVER” Chương trình $MOD51 ;LCD DATABUS RS BIT RW BIT EN BIT ;ADC ADC_BUS READ WRITE INTR BIT EQU P0.0 P0.1 P0.2 P2 EQU P3 BIT P1.0 BIT P1.1 P1.2 ;DATA TEMP COUNT DISP_FLAG EQU 21H ;Byte lưu giá trị nhiệt độ (Hex) EQU 22H ;Byte chứa mã ASCII (tăng từ 0->9) BIT 00H ;Cờ cho phép hiển thị ORG 000H LJMP MAIN ORG 030H ; ********************************************************** ; MAIN ; ********************************************************** MAIN: MOV SP,#2FH ;Vị trí 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ị 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ó q 100oC hay khơng ACALL DISPLAY ;Hiển thị LCD SETB DISP_FLAG ;Đặt cờ cho phép hiển thị SJMP SAMPLE 12 ; ********************************************************** ; Giao tiếp ADC0804 ; ********************************************************** READ_ADC: MOV ADC_BUS,#0FFH CLR WRITE NOP SETB WRITE ;Tạo xung từ cao xuống thấp chân WR (P1.1) ;Cho phép ADC bắt đầu chuyển đổi tương tự -> số JB INTR,$ ;Chờ chuyển đổi liệu xong CLR READ ;Đưa xung mức thấp đến chân RD (cho phép đọc liệu) MOV TEMP,ADC_BUS ;Lưu mã Hex nhiệt độ vào byte nhớ TEMP SETB READ ;Đưa chân RD trở 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 ghi A để xử lý MOV B,#10 DIV AB ;A chứa byte cao mã BCD, B chứa byte thấp ADD A,#30H ;Mã ASCII nhiệt độ (chỉ số hàng chục) MOV R3,A ;Lưu vào R3 MOV A,B ADD A,#30H ;Mã ASCII 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 JNB DISP_FLAG,EXIT ;Nếu cờ DISP_FLAG=0 khơng hiển thị 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 13 MOV 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ị 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 SPACE: ;Tạo khoảng trắng MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT STATUS: ;Hiển thị trạng thái thực thi MOV A,COUNT ;Bắt đầu từ số LCALL WRITE_TEXT INC COUNT ;Tăng từ 1->9 MOV A,COUNT CJNE A,#3AH,NEXT ;Đến số Reset MOV COUNT,#30H ;RESET số NEXT: ; ********************************************************* ; DELAY 0.5s ; ********************************************************* DELAY_500M: MOV R4,#10 ;10 x 50000us = 0.5s LOOP: MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) ACALL DELAY DJNZ R4,LOOP 14 EXIT: RET ; ********************************************************** ; Kiểm tra xem có nhiệt độ hay không ? ; ********************************************************** TEST_TEMP: MOV A,R3 SUBB A,#30H ;ASCII -> HEX MOV B,#10 DIV AB ;Nếu A khác  T >= 100oC JNZ TEST2 ;Nhảy T >= 100 RET TEST2: CLR DISP_FLAG ;Không cho hiển thị gọi DISPLAY MOV A,R2 SUBB A,#30H ;ASCII -> HEX JNZ OVER_TEMP ;Nhảy T > 100 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 15 RET ; ********************************************************** ; 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 LCALL SEND_COM MOV A,#0CH LCALL SEND_COM RET CLEAR_LCD: MOV A,#01H LCALL SEND_COM ;Chế độ BIT,1 dòng ;Cho phép LCD hiển thị ;Mã lệnh xóa hình LCD 16 RET SEND_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 A CLR EN ;Xung Enable NOP SETB EN LCALL WAIT_LCD ;Đợi cho lệnh thực thi hoàn toàn bời LCD RET WRITE_TEXT: SETB RS ;Đặt RS=1 cho xuất liệu CLR RW ;Đặt RW=0, Chọn chế độ ghi MOV DATABUS,A ;Mã ASCII text chứa ghi A CLR EN ;Xung Enable NOP SETB EN LCALL WAIT_LCD ;Đợi cho lệnh 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 CLR EN ;Xung Enable NOP SETB EN MOV A,DATABUS ;Đọc liệu từ LCD JB ACC.7,WAIT_LCD ;Nếu bit mức cao, LCD bận RET ;*************************************************** DELAY: ;Delay theo giá trị TH0 & TL0 MOV TMOD,#01H SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET END 17 Tài liệu tham khảo 1) Vi xử lý Hồ Trung Mỹ 2) Datasheet of ADC0804, LM35D 3) Cấu trúc lập trình họ VDK 8051 Nguyễn Tăng Cường 4) Tài liệu lý thuyết & TH Vi Điều khiển thầy Phạm Quang Trí 18

Ngày đăng: 02/04/2023, 06:34

w