LỜI CẢM ƠN Sau thời gian học tập và tìm hiểu, nhóm em xin gửi lời cảm ơn chân thành đến giảng viên hướng dẫn môn học “Vi Điều Khiển” là thầy Nguyễn Trọng Hải đã nhiệt tình hướng dẫn,
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH
VIỆN KỸ THUẬT HUTECH
BÁO CÁO TỔNG KẾT MÔN HỌC
VI ĐIỀU KHIỂN
Đề tài: Điều Khiển Hiển Thị Nhiệt Độ LCD
Ngành: Công nghệ kỹ thuật ô tô Khoa/Viện: Viện Kỹ Thuật
Hutech
Giảng viên hướng dẫn: Nguy n Tr ng H iễn Trọng Hải ọng Hải ải
Sinh viên thực hiện:
Nguyễn Văn Pháp
Trần Đoàn Anh Kiện
MSSV: 1911252973 MSSV: 1911255727
Lớp: 19DOTD2 Lớp: 19DOTD2
Tp.HCM, ngày 20 tháng 4 năm 2024
Trang 2LỜI CẢM ƠN
Sau thời gian học tập và tìm hiểu, nhóm em xin gửi lời cảm ơn chân thành đến giảng viên hướng dẫn môn học “Vi Điều Khiển” là thầy Nguyễn Trọng Hải đã nhiệt tình hướng dẫn, tạo mọi điều kiện thuận lợi giúp đỡ các thành viên trong nhóm trong suốt quá trình nghiên cứu và hoàn thiện bài báo cáo này
Tuy nhiên, chúng em thực hiện báo cáo môn học trong thời gian và kiến thức có hạn nên có thể sẽ không tránh khỏi những sai sót trong quá trình thực hiện Rất mong nhận sự đóng góp ý kiến của thầy cô, giảng viên hướng dẫn để nhóm em có thể rút kinh nghiệm để được hoàn thiện hơn
Nhóm xin trân trọng cảm ơn !!
Trang 3MỤC LỤC
I.Giới thiệu phần cứng 4
1.Tổng quan về Pic 4
2.Công cụ mô phỏng Proteus 5
3 Sử dụng LCD TC1602A 10
II.Thiết Kế Hệ Thống 13
1.Sơ đồ mạch 13
2.Chương trình chính 13
3 Chức năng ADC của PIC16F977A 16
4.Mạch hoàn chỉnh 16
TÀI LIỆU THAM KHẢO 19
Trang 4NỘI DUNG BÁO CÁO
I Giới thiệu phần cứng
1.Tổng quan về Pic
Các khái niệm:
- Thanh ghi
Trong một vi xử lý 8051 có rất nhiều thanh ghi (khoảng hơn trăm thanh) mỗi thanh là một chuỗi các bit, mỗi bit có 2 giá trị là 1 hoặc 0 và có thể đuợc gán bởi người lập trình, Đa số thanh ghi có 8 bit, ngoài ra còn có các thanh 13 bit Mỗi thanh như thế có các chức năng riêng
Có thanh chỉ đơn thuần chỉ để nhớ một giá trị nào đó, thanh ghi 8 bit thì chỉ nhớ được 2® = 256 giá trị
từ 0 tới 255
Có thanh dùng để điều khiển, ví dụ thanh ghi cho phép xuất hoặc nhập PORTB PORTB có 8 chân, mỗi chân được điều khiển là chân xuất hay nhập bởi thanh ghi PORTB Nếu thanh ghi PORTB có giá trị 00000001b thì có nghĩa là chân B0 là chân nhập dữ liệu, còn các chân B1-B7 là chân xuất dữ liệu
- Cờ (flag)
Cờ cũng là 1bit, nhưng nó có chức năng đặc biệt hơn các bit khác nên người ta đặt tên cho nó Ta sẽ hiểu kỹ hơn về nó qua một ví dụ trong phần
timer
- Định thời (Timer)
Định thời là một chức năng không thể thiếu của các vi điều khiển, nó cho phép vi điều khiển đếm thời gian Tuy nhiên không thể đếm một cách trực tiếp như con người được, timer đếm thời gian thông qua việc đếm xung dao động Một vi điều khiển có khoảng vài timer
Bộ định thời cũng là các thanh ghi, chúng được điều khiển bởi bit định thời Khi ta set bit định thời bằng
1 thì thanh ghi định thời bắt đầu nhảy số 0, 1, 10 cho đến khi thanh ghi định thời có giá trị 11111111 Bit 7 của thanh ghi định thời là một cờ, bình thường thì bit này bằng 0, cho đến khi thanh ghi đã đếm lên tới giá trị max thì bit này mới bằng 1, và sau đó thanh ghi timer lại trả về giá trị 0 và bắt đầu đếm lại, ,
và nó chỉ dừng khi bit định thời được gán bằng 0 trở lại Cờ này như một cách đánh dấu một chu kỳ đếm, giữa 2 lần cờ này bằng 1 là 256 giá trị đã được đếm
Cũng có timer nhiều hơn 8bit
- Hợp ngữ ASM
Vi điều khiển muốn hoạt động được phải có các chỉ dẫn cho nó làm việc, đó là các file hex Mở một file hex ta thấy toàn những 0 với 1 Con người sẽ mất rất nhiều thời gian để viết nên 1 chương trình toàn 0 với 1, vì vậy người ta xây dựng các ngôn ngữ lập trình Thay vì viết 1 dòng lệnh toàn 0 với 1 thì ta viết một dòng lệnh khác tương đương nhưng gần gũi hơn với ngôn ngữ con người Ngôn ngữ càng gần với con người thì có cấp càng cao
ASM là ngôn ngữ gần với file hex nhất Làm việc với ASM ta chủ yếu làm việc với các bit, như việc set bit bằng 1 hay di chuyển giá trị từ thanh ghi này sang thanh ghi khác,
- Khối mạch của chúng ta gồm 3 phần:
+"IN":LM35-dùng để đo nhiệt độ và xuất ra giá trị điện áp tương ứng
+"Xử Lý":PIC16F877A-dùng để chuyển đổi giá trị điện áp được xuất ra từ LM35 bằng cách dùng bộ ADC của PIC
+Hiển thị:LCD
Trang 52 Công cụ mô phỏng Proteus:
Lập trình Pic dùng CCS PCWH V4.023
Ngoài chương trình MPLAB IDE cũng được coi là phần mền lập trình biên dịch khá mạnh cho Pic thì CCs cũng vậy
CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng Microchip
Chương trình là sự tích hợp của 3 trình biên dịch riêng biết cho 3 dòng PIC khác nhau đó
là:
PCB cho dòng PIC 12 -bit opcodes
PCM cho dòng PIC 14-bit opcodes
Sơ đồ chân của PIC16F877A
Trang 7Để PIC hoạt động ta cần cấp nguồn cho PIC Ngoài ra có thể thêm vào bộ dao động thạch anh,
và nút nhấn reset:
Trang 8Và đây là mạch nháy Led PortB:
Trang 9Mô phỏng bằng Proteus:
Mạch nhấp nháy Led
PIC16F877A
Led
Trang 10 Trở 330 Ohm
Dùng 1 DCVolmeter ở chân B0, ta thấy điện áp xuất ra ở chân này thay đổi 0V, 5V sau mỗi thời
gian delay
Code:
#include<16f877a.h>
#device* =16 ADC=8
#FUSES
NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,N
OCPD,NOWRT
#use delay (clock=20000000)
void main()
{
//Thiet lap che do cho PORT B
Set_tris_b(0x00); //Tat ca PORT B deu la cong xuat du lieu
output_b(0xFF); //Mo het cac Led
While(TRUE) //Vong lap vo han
}
output_b(0xFF); //Cho các Led sáng delay_ms(500); // Delay 0.5s output_b(0x00); //Tat het cac Led delay_ms(500); Cho 0.5s
}
}
Tinh thể lỏng (liquid crystal ) là chất lỏng hữu cơ mà phân tử của nó có khả năng phân cực ánh sáng dẫn đến thay đổi cường độ sáng.Trường tĩnh điện được dùng để điều khiển hướng phân tử tinh thể lỏng.
Trang 11Thay vì các điểm ảnh riêng biệt là các phần tử phát sáng được định địa chỉ một cách tuần tự Do
vậy, trên các monitor này hình ảnh cũng được phát ra từng dòng một Quá trình quét ngược cũng
không còn nữa vì ở đây đơn giản chỉ là việc thay đổi địa chỉ về phần tử đầu dòng tiếp theo
Cấu trúc LCD
Polarizing filter (Bộ lọc phân cực) Điều khiển ánh sáng đi vào và thoát ra
Glass substrate (Hợp chất thuỷ tinh đặc biệt) Lọc chặn điện từ các điện cực
Transparent electrodes (Điện cực trong suốt ) Là các thanh dẫn điện trong suốt cho phép ánh sáng xuyên qua
Alignment layer ( Sắp xếp lớp ) Là hai bề mặt có rãnh, ở giữa là các phân tử tinh thể lỏng, các phân tử được sắp xếp theo hình soắn ốc 900
Liquid crystals ( Các tinh thể lỏng)
Spacer ( Khoảng trống ) Duy trì khoảng cách đều giữa các tấm kính
Color filter ( Bộ lọc mầu ) Mầu được lọc và thể hiện khi dùng các bộ lọc R, G và B
Backlighting ( Ánh sáng phía sau ) Ánh sáng được chiếu từ phía sau màn hình xuyên qua các lớp trên, ở màn hình điện thoại, người ta sử dụng ánh sáng chiếu từ xung quanh sau đó dùng lớp phản xạ để hướng ánh sáng chiếu thẳng góc với màn hình từ sau về phía trước
Đây là LCD 2 hàng, mỗi hang 16 ký tự
Để sử dụng LCD , ta hãy đọc file “LCD.C” trong thư viện Driver của CCS Ở đó CCS hướng dẫn cách
ta đi dây cho các chân của LCD, đồng thời CCS viết sẵn cho ta các hàm thao tác cho LCD:
Sơ đồ chân LCD
Trang 12Nguyên tắc hoạt động
- Active element ( Transistor ) - Phần tử tích cực
[ X Electronic - Điện cực X
| Y Electronic - Điện cực Y | Light - Ánh sáng
- Các điện cực X và Y sắp xếp thành hàng và dãy, mỗi điểm giao nhau có một Transistor trường, chân S
đấu vào điện cực Y, chân G đấu vào điện cực X, khi Transistor dẫn thì chân D sẽ có điện áp bằng điện cực Y tạo ra một điện áp chênh lệch với đế trên của LCD Mỗi Transistor sẽ điều khiển một điểm mầu, các tín hiệu ngắt mở được đưa đến điện cực X, tín hiệu Video được đưa đến điện cực Y, điện áp chênh lệch giữa điện cực X và Y sẽ làm Transistor dẫn tạo ra một điểm mầu có cường độ sáng nhất định
Trang 13II Thiết kế hệ thống
1 Sơ đồ mạch
2 Chương trình chính
Cách nối dây :
// As defined in the following structure the pin connection is as
follows:
//
DO enable
//
D1 rs
D2 rw
Trang 14D4 D4
11
D5 D5
ᎠᏮ ᎠᏮ
//
D7 D7
// LCD pins D0-D3 are not used and PIC D3 is not used
Các hàm thông dụng
lcd_init() : là hàm phải có để báo rằng sẽ sử dụng LCD
lcd_putc( char c) : hàm để xuất ký tự ra LCD
lcd_gotoxy( BYTE x, BYTE y) : hàm cho phép con trỏ nhảy tới vị trí (x,y) trên LCD
Mô phỏng ví dụ dùng LCD bằng Proteus:
Code:
#define <16f877a.h>
#include "16F877A.h"
#device *=16 adc=8
//#device PIC16F877A *=16
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include <LCD.C>
void main()
{
lcd_init( ;
lcd_putc("Do an ky thuat");
}
Kết quả:
LM35
Đây là cảm biến nhiệt độ
LM35 có 3 chân : 2 chân cấp nguồn và 1 chân xuất điện áp ra tùy theo nhiệt độ
Trang 15Nhiệt độ tăng 1C thì điện áp xuất ra ở chân out của LM35 tăng 10mV
Các đặc tính kỹ thuật khác :
Features
■Calibrated directly in Celsius (Centigrade) Linear + 10.0 mV/°C scale factor
0.5°C accuracy guaranteeable (at +25°C)
■Rated for full -55° to +150°C range
■Suitable for remote applications
■Low cost due to wafer-level trimming
■ Operates from 4 to 30 volts
Less than 60 μA current drain A current drain
Low self-heating, 0.08°C in still air Nonlinearity only ±1⁄4°C typical
Low impedance output, 0.1 $2 for 1 mA load
Nhiệt độ là 27C, điện áp xuất ra là V=0.27176 chứng tỏ sự tăng 10mV /C là khá chính xác
Trang 16Khi mô phỏng Proteus, nếu khối LM35 không hoạt động, thì click chuột phải/ edit properties/ bỏ check exclude from Simulation đi
3 Chức năng ADC của PIC16F977A
Chức năng ADC cho phép PIC nhận tín hiệu tương tự từ các chân có hỗ trợ ADC và chuyển tín hiệu đó sang tín hiệu số để xử lý
Các chân có hỗ trợ ADC của PIC16F877A là : A0 A1 A2 A3 A5 EO E1 E2 Một số lệnh căn bản khi dùng ADC:
Muốn dùng ADC, ta phải khai báo #DEVICE cho biết dùng ADC mấy bit, chẳng hạn #device*=16
ADC=8 cho biết dùng ADC 8 bit
Setup_ADC(mode)
.Mode là ADC_OFF : tắt chức năng ADC
.Mode là ADC_CLOCK_INTERNAL : thời gian lấy mẫu bằng xung clock
.Mode là ADC_CLOCK_DIV_2: gian lấy mẫu bằng xung clock /
2
Setup_ADC_ports(value) //Xác định chân lấy tín hiệu Analog và điện thế chuẩn
.Value là ALL_ANALOGS : dùng tất cả các chân có hỗ trợ ADC
.Value là NO_ANALOG : không dùng ADC
.Value la ANi : dùng chân ANi là chân ADC
Set_ADC_channel(channel) //chọn chân để đọc giá trị analog bằng lệnh
read_adc()
.Với PIC16F877A channel có 8 giá trị 0-7 tương ứng là các chân A0-E2 như đã kể ở trên
.Để chính xác ta nên delay khoảng 10ms trước khi đọc tín hiệu:
delay_ms(10);
read = read_adc( ; Sau đoạn code này , read sẽ có giá trị bằng giá trị điện áp mà chân được
Mô phỏng bằng Proteus
Kết quả:
Trang 17Code:
#define <16f877a.h>
#include "16F877A.h"
#device *=16 adc=8
//#device PIC16F877A *=16
#use delay(clock=12000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,
NOBROWNOUT, NOLVP, NOCPD, NOWRT
//#use
rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include <LCD.C>
#INT_EXT
int8 read;
void main(void)
{
// set_tris_b(0);
set_tris_a(0xFF);
set_tris_d(0x00);
// Khoi tao cho ngat ngoai
enable_interrupts (INT_EXT);
Trang 18ext_int_edge(H_TO_L);
enable_interrupts (GLOBAL);
//Khoi tao ADC
setup_adc_ports(ANO);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(50);
while(TRUE)
{
lcd_init( ;
read=read_adc();
read read*1.960784314;
printf(lcd_putc,"\rNhiet do: %u",read);
delay_us(20);
}
}
Khi dùng ADC 8bit tín hiệu ADC đọc được từ chân ADC như sau:
Tức là nếu điện áp vào 1V thì tín hiệu digital tăng 51
1V →ADC=51
1C →10mV→ADC=10*51/1000
Suy ra T →ADC = T*10*51/1000
Suy ra T = ADC*1000/10/51 = ADC * 1.960784314
Công thức này đã dùng ở đoạn code trên
Trang 19Tham khảo : Nguồn sách giáo trình và sách điện tử
Công cụ :
sử dụng phần mềm MPLAP IDE 8.02 để soạn thảo Code
(http://www.microchip.com/stellent/idcplg? IdcService=SS GET
PAGE&nodeId=1406&dDocName=en023073) sử dụng phần mềm proteus 7.7 (http://forum.sharingvn.net/threads/96111+Proteus+7+7+Sp2+full+Key+Crack)
Website tham khảo :
http://lab3i.com
http://diendanict.edu.vn