1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÁO CÁO ĐỒ ÁN THIẾT KẾ KỸ THUẬT CĂN BẢN VỀ PIC16F877A ĐO NHIỆT ĐỘ DÙNG LM35, HIỂN THỊ LÊN LCD.doc

17 6,8K 59
Tài liệu đã được kiểm tra trùng lặp

Đ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 17
Dung lượng 0,97 MB

Nội dung

BÁO CÁO ĐỒ ÁN THIẾT KẾ KỸ THUẬT CĂN BẢN VỀ PIC16F877A ĐO NHIỆT ĐỘ DÙNG LM35, HIỂN THỊ LÊN LCD

Trang 1

BÁO CÁO Đ ÁN THI T K KỸ THU T Ồ Ế Ế Ậ CĂN B N V PIC16F877A Ả Ề

ĐO NHI T Đ DÙNG LM35, HI N TH LÊN LCD Ệ Ộ Ể Ị

Sau đây là qui trình tìm hiểu về PIC của nhóm

1 Tr ướ ế c h t nhóm đã lên m ng tìm hi u t ng quan v PIC đ xem mình ạ ể ổ ề ể nên b t đ u t đâu ắ ầ ừ , và chủ yếu học từ diễn đàn www.picvietnam.com, tiện thể nhóm xin gửi lời cám ơn tới diễn đàn này

Nhóm đã tìm được 1 bài dẫn dắt về PIC của tác giả FALLEAF, và theo đó thì để học PIC ta nên bắt đầu bằng việc tìm hiểu về các khái niệm và làm các công việc

-Thanh ghi-register -Cờ-flag

-Định thời-Timer -Làm mạch nhấp nháy Led Nhưng nếu search trên mạng với từ khoá PIC và các khái niệm này thì có rất ít, thậm chí nhóm tìm không ra Lý do đơn giản vì các phần kiến thức này đáng lẽ phải được học trong các môn tiền đề cho PIC như kiến trúc máy tính hay vi xử lý

Nhóm tìm tới hỏi các anh đi trước, và theo hướng dẫn của anh Ca ( SV Bách Khoa K05) thì nên tìm hiểu về vi điều khiển 8051 trước, và nên học lập trình bằng ASM

Để tìm hiểu 8051, nhóm đã tìm đọc sách về 8051 của tác giả Tống Văn On Chính trong sách này, nhóm đã hiểu được các khái niệm về thanh ghi, định thời, và ngôn ngữ ASM (chỉ ở mức căn bản)

Nhóm xin được nói về cách hiểu của mình về các khái niệm trên

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

Trang 2

Có thanh chỉ đơn thuần chỉ để nhớ một giá trị nào đó, thanh ghi 8 bit thì chỉ nhớ được 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,…

Trang 3

2 Sau khi tìm hi u qua sách v nh ng khái ni m này t xong, nhóm b t ể ở ữ ệ ừ ắ

đ u chính th c tìm hi u v PIC ầ ứ ể ề

Công cụ mô phỏng hữu hiệu là Proteus

Ngôn ngữ lập trình là CCS, học từ Tutorial của anh Trần Xuân Trường K2001 ĐHBK

Nhóm tìm hiểu về PIC thông qua tutorial của tác giả Nguyễn Trung Chính trên diễn đàn picvietnam, xin cám ơn anh Chính đã viết một tutorial rất hay và căn bản và xin phép lấy các hình ảnh minh hoạ từ tutorial này

Sơ đồ chân của PIC16F877A :

Trang 4

Để 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 5

Và đây là mạch nháy Led PortB:

Trang 6

Mô phỏng bằng Proteus:

- Mạch nhấp nháy Led

PIC16F877A

Led

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,NOCPD,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

Trang 7

{

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

}

}

Sau đó tiến hành thực nghiệm:

Phải làm nguồn 5V cho PIC

Phải làm mạch nhấp nháy Led

Sau khi xem qua các linh kiện của một anh K05 (anh Ca) để biết mặt các linh kiện nó ra làm sao thì ra Nhật Tảo mua

- Các dụng cụ cơ bản;

Test board

Board đục lỗ

Mỏ hàn, chì, nhựa thông

Mũi khoan

Hút chì

- Các linh kiện cho nguồn 5V:

Board đục lỗ

Biến áp cách ly-còn gọi là tăng phô

7805- dùng để xén 5V (7806 thì xén 6V), có thêm nhôm tản nhiệt

Domino

Cầu diod

Tụ 1000 uF 35V

Tụ 10uF 50V5

Tụ kẹo 104

Trang 8

Sơ đồ mạch nguồn 5V

3 S d ng LCD TC1602A ử ụ

Đâ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:

Cách nối dây:

// As defined in the following structure the pin connection is as follows:

// D0 enable

// D1 rs

// D2 rw

// D4 D4

// D5 D5

// D6 D6

// 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)

Trang 9

#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ả:

Trang 10

4 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 độ

Nhiệ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 :

Trang 11

Mô phỏng bằng Proteus:

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

Khi 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

5 Ch c năng ADC c a PIC16F877A ứ ủ

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 E0 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)

Trang 12

.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 truớc khi đọc tín hiệu:

.Vd: set_ADC_channel(0);

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

Trang 13

6 T i đây ta đã đ công c đ làm m ch hoàn ch nh ớ ủ ụ ể ạ ỉ

Mô phỏng bằng Proteus:

Kết quả :

Code:

#define <16f877a.h>

#include "16F877A.h"

#device *=16 adc=8

//#device PIC16F877A *=16

#use delay(clock=12000000)

Trang 14

#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);

ext_int_edge(H_TO_L);

enable_interrupts (GLOBAL);

//Khoi tao ADC

setup_adc_ports(AN0);

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

Trang 15

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

7 Làm m ch th c t : ạ ự ế

Vẽ mạch in dùng chức năng ARES trong Proteus:

Xin cám ơn bạn Thái Thiện đã hướng dẫn tôi cách sử dụng ARES

Sau khi vẽ xong sơ đồ nguyên lý như trên, ta chọn nút ARES để chuyển qua mạch vẽ mạch in, sau khi sắp xếp, bổ sung, đi dây mạch và in ra PDF (dùng chương trình in máy in ảo “Virtual PDF Printer” ta có được một sơ đồ như sau:

Trang 16

Có thể xem ở chế độ 3D :

Đem mạch in trên ra tiệm in Laser (in phun không được), chú ý các xem bản in có vừa với chân PIC không, nếu không thì phải in lại với tỉ lệ thích hợp Thông thường

in lên giấy kiếng, nhưng in lên giấy A4 thường cũng được

Mua board đồng và đặt bản in lên, dùng bản ủi ủi qua lại khoảng 5ph, lúc đầu cứ nghĩ ủi lâu sẽ ăn mực, nhưng không phải vậy Đợi board đồng nguội rồi gỡ ra, nếu dùng giấy A4 thường thì nên thấm thêm ít nước để mực dễ bám vào đồng

Mua thêm cây viết vẽ mạch in, nếu mực chỗ nào chưa bám tốt thì đồ lên

Đem board đồng ngâm vào dung dịch FeCl3 mua ở chợ, vớt lên xem nếu đồng đã bị trôi hết thì lấy ra, nếu chưa thì ngâm tiếp

Dùng xăng chùi đi lớp mực còn bám, ta có được một mạch hoàn chỉnh

Và cuối cùng nhóm xin cám ơn những người đã chỉ dẫn cho chúng tôi

Ngày đăng: 27/08/2012, 11:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w