Tải bản đầy đủ (.docx) (24 trang)

đo nhiệt độ độ sáng và báo cháy với pic18f4550

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.07 MB, 24 trang )

ĐỒ ÁN 1

1

ỦY BAN NHÂN DÂN THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC SÀI GÒN
KHOA ĐIỆN TỬ - VIỄN THÔNG

ĐỒ ÁN MÔN HỌC

ĐO NHIỆT ĐỘ ĐỘ SÁNG VÀ BÁO CHÁY
VỚI PIC18F4550
HỆ ĐẠI HỌC
NIÊN KHÓA: 2014-2019


ĐỒ ÁN 1

MỤC LỤC
CHƯƠNG 1: TỔNG QUAN VỀ PIC18F4550 VÀ CÁC CẢM BIẾN........3
1.1 PIC18F4550...........................................................................................3
1.2 LM35......................................................................................................8
1.3 QUANG TRỞ........................................................................................10
CHƯƠNG 2: THIẾT KẾ MẠCH NGUYÊN LÝ........................................11
2.1 SƠ ĐỒ KHỐI.........................................................................................11
2.2 LƯU ĐỒ GIẢI THUẬT.........................................................................12
2.3 NHÚNG VÀ MÔ PHỎNG....................................................................12
CHƯƠNG 3: LÀM MẠCH THỰC TẾ........................................................21
3.1 MẠCH IN...............................................................................................21
3.2 BOARD VÀ LINH KIỆN......................................................................22
CHƯƠNG 4: KẾT LUẬN............................................................................23


4.1 ƯU NHƯỢC ĐIỂM...............................................................................24
4.2 HƯỚNG PHÁT TRIỂN.........................................................................24

2


ĐỒ ÁN 1

3

CHƯƠNG 1: TỔNG QUAN VỀ PIC18F4550 VÀ CÁC CẢM BIẾN
1.1 PIC18F4550
1.1.1 Tổng quan
PIC 18F4550 là vi điều khiển 40 chân, có khả năng giao tiếp USB hiệu năng cao,
được tăng cường bộ nhớ Flash sử dụng công nghệ nanoWatt.

− Là bộ vi xử lý được trang bị tính năng giao tiếp USB 2.0.
− Có khả năng truyền nhận dữ liệu tốc độ thấp (1.5 Mb/s) và tốc độ cao (12 Mb/s).
− Hỗ trợ việc điều khiển, ngắt, truyền dữ liệu kích thước lớn và truyền dữ liệu đồng
thời.
− Hỗ trợ lên đến 32 điểm đầu cuối (16 đường truyền song hướng).
− 1 kb bộ nhớ RAM truy cập kép cho USB.
− Bộ thu phát USB cùng với bộ điều chỉnh điện áp 3.3 V trên chip.
− Giao tiếp bộ thu phát USB riêng bên ngoài.
− Có port truyền dữ liệu song song (SPP) cho việc truyền dòng dữ liệu USB (chỉ có ở
vi điều khiển 40 chân).
− Run: CPU hoạt động, các khối ngoại vi hoạt động. − Idle: CPU không hoạt động,
các khối ngoại vi hoạt động. Dòng điện ở chế độ idle giảm xuống chỉ còn 5.8 μA.
− Sleep: CPU không hoạt động, các khối ngoại vi không hoạt động. Dòng điện ở chế
độ sleep giảm xuống chỉ còn 0.1 μA.

− Bộ dao động Timer1 với các thông số: 1.1 μA, 32 kHz, 2 V.
− Bộ định thời watchdog hoạt động với dòng chỉ bằng 2.1 μA.
− Có chế độ khởi động bộ dao động hai tốc độ.
− Công nghệ nanowatt Tất cả các vi điều khiển trong họ PIC18F đều có tính năng
giảm đáng kể lượng công suất tiêu thụ trong quá trình hoạt động. Chế độ chạy luân phiên


ĐỒ ÁN 1

4

Hoạt động theo xung clock từ bộ điều khiển Timer1 hoặc bộ dao động nội, công suất tiêu
thụ trong quá trình thực thi chương trình có thể giảm đến 90%. Chế độ tĩnh (idle) phức hợp
Vi điều khiển có thể chạy với CPU ngưng hoạt động, nhưng các khối ngoại vi vẫn hoạt
động. Ở trạng thái này, công suất tiêu thụ có thể giảm hơn nữa, ít hơn đến 4% lượng công
suất mà chế độ họat động bình thường yêu cầu. Chế độ on-to-fly Chế độ quản lý công suất
được gọi bởi chương trình của người dùng trong quá trình hoạt động, cho phép người lập
trình kết hợp các ý tưởng tiết kiệm năng lượng thành thiết kế ứng dụng của họ.

1.1.2 Tính năng bộ đa dao động
Dòng vi điều khiển PIC18F đều có tính năng lựa chọn 12 nguồn dao động khác nhau, cho
phép người dùng nhiều sự lựa chọn hơn trong việc phát triển các ứng dụng. Tính năng này
bao gồm: − 4 nguồn dao động thạch anh sử dụng thạch anh hoặc bộ cộng hưởng ceramic.
− 4 nguồn dao động ngoại.
− 1 khối tạo dao động nội cung cấp nguồn xung 8 MHz (độ chính xác ±2%), một
nguồn dao động nội dùng RC INTRC (xấp xỉ 31 KHz không bị ảnh hưởng bởi nguồn cung
cấp và nhiệt độ), cũng như một dãi 6/8 tần số mà người dùng có thể lựa chọn có dãi tần từ
125 kHz đến 4 MHz. Lựa chọn này giúp ta có thêm hai chân dao động trống để sử dụng
cho các giao tiếp I/O. − Một bộ nhân tần số vòng lặp khóa pha (PLL) sử dụng cả thạch anh
tần số cao và bộ dao động ngoại cho phép tần số từ 4 MHz đến 48 MHz.

− Hoạt động với nguồn xung clock kép không đồng bộ, cho phép chế độ USB sử
dụng bộ dao động tần số cao, trong khi phần còn lại của vi điều khiển được cấp xung clock
từ bộ dao động công suất thấp bên trong.
Bộ dao động nội bên cạnh vai trò nguồn xung, còn cung cấp nguồn tham chiếu ổn
định cho một số tính năng bổ sung như: − Giám sát lỗi xung clock (Fail-Safe Clock
Monitor): chế độ này giám sát liên tục nguồn xung sơ cấp dựa vào tín hiệu tham chiếu từ
nguồn dao động nội. Nếu xảy ra lỗi xung clock, vi điều khiển sẽ chuyển sang sử dụng bộ
dao động nội cho phép tiệp tục hoạt động tốc độ thấp hoặc shutdown các ứng dụng một
cách an toàn. − Chế độ khởi động hai tốc độ: lựa chọn này cho phép bộ dao động nội phục
vụ như một nguồn xung, cấp cho chế độ reset khi đang mở nguồn (Power-on Reset), hoặc
đánh thức đưa hệ thống thoát khỏi chế độ sleep cho đến khi nguồn xung clock chính hoạt
động trở lại.

1.1.3 Tính năng đặc biệt khác
Độ bền của bộ nhớ Bộ nhớ flash tăng cường dùng cho cả chương trình và dữ liệu
EEPROM có thể ghi xóa với chu kỳ đến hàng ngàn lần, có thể lên đến 100.000 lần đối với
bộ nhớ chương trình, và 1000.000 lần cho EEPROM. Khả năng duy trì dữ liệu mà không
cần làm tươi bộ nhớ có thể trên 40 năm.
Tính tự lập trình Linh kiện này có thể ghi vào các chỗ trống trong bộ nhớ chương
trình của nó dưới sự điều khiển của phần mềm nội. Bằng cách sử dụng thủ tục khởi động
trong khối boot nằm trên cùng của bộ nhớ chương trình, có thể tạo lập một ứng dụng có
khả năng tự cập nhật.
Thiết lập các lệnh mở rộng Họ PIC 18F đưa ra các lựa chọn mở rộng các lệnh thiết
lập gồm 8 cấu trúc lệnh mới và một chế độ ghi địa chỉ offset đánh chỉ số bằng chữ. Lựa


ĐỒ ÁN 1

5


chọn mở rộng này như một lựa chọn về cấu hình thiết bị, được thiết kế đặc biệt để tối ưu
các mã chương trình của ngôn ngữ cấp cao như C.
Khối CCP tăng cường Trong chế độ PWM, khối này cung cấp các ngõ ra điều chế 1,
2, 4 để điều khiển các driver cầu và bán cầu. Các tính năng khác bao gồm chế độ auto
shutdown để vô hiệu ngõ ra PWM theo ngắt hay theo các điều kiện khác. Ngoài ra còn có
chế độ auto-restart để kích hoạt lại ngõ ra PWM một khi điều kiện kể trên bị xóa.
Khối USART tăng cường có khả năng lập địa chỉ Khối truyền thông nối tiếp này có
khả năng hoạt động theo chuẩn RS-232 và cung cấp sự hỗ trợ cho giao thức bus LIN. Tính
năng tăng cường bao gồm nhận dạng tốc độ baud tự động, và một bộ tạo tốc độ baud 16-bit
nhằm cải thiện độ phân giải khi truyền dữ liệu. Khi vi điều khiển sử dụng bộ dao động nội
thì EUSART sẽ vẫn hoạt động ổn định trên các ứng dụng mà không cần phải dùng đến dao
động thạch anh bên ngoài.
ADC 10-bit Khối này kết hợp với chu kỳ thời gian nhận tín hiệu chuyển đổi khả trình
cho phép chọn lựa kênh chuyển đổi và khởi xướng quá trình chuyển đổi mà không cần đợi
chu kỳ lấy mẫu. Do đó, tính năng này làm giảm bớt các mã có thể vượt quá giới hạn
chuyển đổi.
Port ICD/ICSP dành riêng Port dành riêng này cung cấp việc sử dụng các chân sửa lỗi
và chân lập trình không tích hợp các chức năng khác của vi điều khiển. Tính năng này cho
phép người dùng phát triển các ứng dụng chuyên về I/O trong khi vẫn duy trì khả năng lập
trình và sửa lỗi trên chip.


ĐỒ ÁN 1

1.1.4 Sơ đồ khối PIC18F4550

6


ĐỒ ÁN 1


7

1.1.5 Bộ chuyển đổi ADC
PIC 18F4550 có 13 chân ngõ vào nhận tín hiệu tương tự để chuyển thành tín hiệu số với độ
phân giải là 10-bit. Khối AD (Analog to Digital) gồm có 5 thanh ghi: ADRESH (AD Result
High register), ADRESL (AD Result Low register), ADCON0 (AD Control register 0),
ADCON1 và ADCON2

Sơ đồ khối bộ chuyển đổi ADC


ĐỒ ÁN 1

8

Các thanh ghi liên kết với bộ ADC

1.2 LM35
Cảm biến nhiệt độ LM35 là một loại cảm biến tương tự rất hay được ứng dụng trong
các ứng dụng đo nhiệt độ thời gian thực. Vì nó hoạt động khá chính xác với sai số
nhỏ, đồng thời với kích thước nhỏ và giá thành rẻ là một trong những ưu điểm của
nó.


ĐỒ ÁN 1

Biểu đồ nhiệt độ và điện áp ngõ ra

Biểu đồ sai số ở các nhiệt độ khác nhau


9


ĐỒ ÁN 1

10

1.3 QUANG TRỞ
Quang trở là một loại "vật liệu" điện tử rất hay gặp và được sử
dụng trong những mạch cảm biến ánh sáng. Có thể hiểu một cách
dễ dàng rằng, quang trở là một loại ĐIỆN TRỞ có điện trở thay đổi
theo cường độ ánh sáng. Nếu đặt ở môi trường có ít ánh sáng, có
bóng râm hoặc tối thì điện trở của quang trở sẽ tăng cao còn nếu
đặt ở ngoài nắng, hoặc nơi có ánh sáng thì điện trở sẽ giảm.

Biểu đồ liên hệ giữa điện trở và cường độ sáng


ĐỒ ÁN 1

CHƯƠNG 2: THIẾT KẾ MẠCH NGUYÊN LÝ
2.1 SƠ ĐỒ KHỐI

2.2 LƯU ĐỒ GIẢI THUẬT

11


ĐỒ ÁN 1


12

2.3 NHÚNG VÀ MÔ PHỎNG

#include

#define E_PIN LATDbits.LATD2

#include <stdlib.h>

#define TRIS_E TRISDbits.TRISD2

#include <delays.h>

#define DON

0b00001111

#ifndef __bootlcd_H

#define DOFF

0b00001011

#define __bootlcd_H

#define CURSOR_ON 0b00001111

#include "p18f4550.h"


#define CURSOR_OFF 0b00001101

#define UPPER 1

#define BLINK_ON 0b00001111

#define DATA_PORT

PORTD

#define TRIS_DATA_PORT
TRISD
#define RS_PIN LATDbits.LATD0
#define TRIS_RS TRISDbits.TRISD0
#define RW_PIN LATDbits.LATD1
#define TRIS_RW TRISDbits.TRISD1

#define BLINK_OFF 0b00001110
#define SHIFT_CUR_LEFT 0b00000100
#define SHIFT_CUR_RIGHT 0b00000101
#define SHIFT_DISP_LEFT 0b00000110
#define SHIFT_DISP_RIGHT 0b00000111
#define FOUR_BIT
0b00100000
Interface: 0b00101100 */

/* 4-bit



ĐỒ ÁN 1
#define EIGHT_BIT
Interface
*/

13
0b00111100

{ Delay1KTCYx(25); // Delay of 5ms
return; }

#define LINE_5X7
0b00110000
characters, single line */
#define LINE_5X10
characters
*/

/* 8-bit

0b00110100

#define LINES_5X7
0b00101000
characters, multiple line: 0b00111000 */

/* 5x7
/* 5x10

void displaylcd_l2 (unsigned int intval)

{
unsigned int volt;

/* 5x7

#define putcXLCD WriteDataXLCD
void OpenXLCD(void);
void
SetCGRamAddr(PARAM_SCLASS
unsigned char);
void
SetDDRamAddr(PARAM_SCLASS
unsigned char);

char o[10];
volt = ((intval*25)/255) ;
itoa(volt,o);
while(BusyXLCD());
SetDDRamAddr(0x00);
putrsXLCD("Do sang:");
while(BusyXLCD());

unsigned char BusyXLCD(void);

if (volt >99)

unsigned char ReadAddrXLCD(void);
char ReadDataXLCD(void);
void
WriteCmdXLCD(PARAM_SCLASS

unsigned char);
void WriteCmd8bit(PARAM_SCLASS unsigned
char);

{
WriteDataXLCD(o[0]);
while(BusyXLCD());
WriteDataXLCD(o[1]);
while(BusyXLCD());

void WriteDataXLCD(PARAM_SCLASS char);

WriteDataXLCD(o[2]);

void putsXLCD(PARAM_SCLASS char *);

while(BusyXLCD());

void putrsXLCD(const rom char *);

WriteDataXLCD(0x25);

extern void DelayFor18TCY(void);

}

extern void DelayPORXLCD(void);

else


extern void DelayXLCD(void);

if (volt > 9 & volt <= 99)
{

void DelayFor18TCY( void )

WriteDataXLCD(0x20);

{ Delay10TCYx(2); // Delay of 5us

while(BusyXLCD());

return; }

WriteDataXLCD(o[0]);

void DelayPORXLCD (void)

while(BusyXLCD());

{Delay1KTCYx(75); // Delay of 15ms

WriteDataXLCD(o[1]);

return; }

while(BusyXLCD());

void DelayXLCD (void)


WriteDataXLCD(0x25);


ĐỒ ÁN 1

14

}

putrsXLCD("Temp:");

else

itoa(v, out);

if (volt >= 0 & volt <= 9)

while(BusyXLCD());

{

if (v >99)

WriteDataXLCD(0x20);

{

while(BusyXLCD());


WriteDataXLCD(out[0]);

WriteDataXLCD(0x20);

while(BusyXLCD());

while(BusyXLCD());

WriteDataXLCD(out[1]);

WriteDataXLCD(o[0]);

while(BusyXLCD());

while(BusyXLCD());

WriteDataXLCD(out[2]);

WriteDataXLCD(0x25);

while(BusyXLCD());

}

WriteDataXLCD(0xDF);

else

}


{

else

WriteDataXLCD('Error');

if (v > 9 & v <= 99)

}
while(BusyXLCD());
WriteDataXLCD(0x20);
while(BusyXLCD());
WriteDataXLCD(0x20);
while(BusyXLCD());
WriteDataXLCD(0x20);
while(BusyXLCD());
WriteDataXLCD(0x20);
}

{
while(BusyXLCD());
WriteDataXLCD(0x20);
WriteDataXLCD(out[0]);
while(BusyXLCD());
WriteDataXLCD(out[1]);
while(BusyXLCD());
WriteDataXLCD(0xDF);
}

void displaylcd_l1 (unsigned int intv)


else
if (v>= 0 & v <= 9)

{
unsigned int v;
char out[10];
v = ((intv*125) / 256) ;
while(BusyXLCD()); // Wait if LCD busy
SetDDRamAddr(0x40); // Select line 2

{
while(BusyXLCD());
WriteDataXLCD(0x20); while(BusyXLCD());
WriteDataXLCD(0x20);
WriteDataXLCD(out[0]);
while(BusyXLCD());


ĐỒ ÁN 1

15

WriteDataXLCD(0xDF);

}

}

}


else
{

void main( void )

WriteDataXLCD('Error'); }

{

putrsXLCD("C

char temdata;

");

if (v > 39) PORTDbits.RD3=1;
PORTDbits.RD3=0;}

else

void jal (void)
{

unsigned int current_ad_value;
TRISAbits.TRISA0 = 1;
TRISAbits.TRISA1 = 1;
TRISDbits.TRISD3 = 0;

char

t[16]={'J','a','c','k','m','a','t','h','e','m','a','t','i','c','a','l'}
;

ADCON2bits.ADCS0 = 0; // Fosc/32 clock

char
h[16]={'3','1','1','4','5','2','0','0','7','8','
','D','K','T','4','2'};

ADCON2bits.ADCS2 = 0; //

unsigned char u,v;
for (u=0;u<16;u++){
for (v=17;v>u;v--){

ADCON2bits.ADCS1 = 1; //

ADCON2bits.ADFM = 1; // Right justified
ADCON0bits.ADON = 1; // Enable ADC
OpenXLCD();
jal();

while(BusyXLCD());
SetDDRamAddr(v-1);
while(BusyXLCD());
WriteDataXLCD(t[u]);
Delay1KTCYx(50);
}
}
for (u=0;u<16;u++){

for (v=17;v>u;v--){
while(BusyXLCD());
SetDDRamAddr(64+(v-1));
while(BusyXLCD());

// configure external LCD

Delay10KTCYx(250);
while(1)
{
ADCON1 = 0b00000000; // Vref = VDD
ADCON0bits.CHS3 = 0;
ADCON0bits.CHS2 = 0;
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 0;
Delay100TCYx(2); // Give the ADC time to get
ready
ADCON0bits.GO = 1;
conversion

WriteDataXLCD(h[u]);

while (ADCON0bits.GO);

Delay1KTCYx(50);

displaylcd_l1(ADRES);

}


Delay10KTCYx(50);
ADCON1 = 0b00000000;

// Start the ADC


ĐỒ ÁN 1

16

ADCON0bits.CHS3 = 0;
Delay10KTCYx(0x01);

ADCON0bits.CHS2 = 0;
ADCON0bits.CHS1 = 0;
ADCON0bits.CHS0 = 1;

WriteCmdXLCD(0x20);

Delay100TCYx(2); // Give the ADC time to get
ready
ADCON0bits.GO = 1;
conversion

// Start the ADC

while( BusyXLCD() );
//-------------------------------------------------------------------------

while (ADCON0bits.GO);

displaylcd_l2(ADRES);
Delay10KTCYx(50);

// Set data interface width, # lines, font

}

while(BusyXLCD());
busy

}

WriteCmd8bit(FOUR_BIT & LINES_5X7);
// Function set cmd

void OpenXLCD()
{

// Wait if LCD

DATA_PORT &= 0x0f;

while(BusyXLCD());

TRIS_DATA_PORT &= 0x0F;
TRIS_RW = 0;
signals made outputs

WriteCmdXLCD(LINES_5X7);
// All control


// Turn the display on then off
Delay10KTCYx(0x05);
// Wait if LCD busy

TRIS_RS = 0;
TRIS_E = 0;
RW_PIN = 0;

// R/W pin made

WriteCmdXLCD(DOFF&CURSOR_OFF&
BLINK_OFF); // Display OFF/Blink OFF

RS_PIN = 0;
pin made low

// Register select

while(BusyXLCD());
Wait if LCD busy

low

E_PIN = 0;
// Clock pin made
low
// Delay for 15ms to allow for LCD
Power on reset
Delay1KTCYx(75); // Delay of 15ms

//-------------------reset procedure
software----------------------

through

WriteCmdXLCD(0x30);

//

WriteCmdXLCD(DON&CURSOR_OFF&B
LINK_OFF);
// Display ON/Blink ON

// Clear display
while(BusyXLCD());
Wait if LCD busy

//

WriteCmdXLCD(0x01);
// Clear display

Delay10KTCYx(0x05);
// Set entry mode inc, no shift
WriteCmdXLCD(0x30);

while(BusyXLCD());
Wait if LCD busy

//



ĐỒ ÁN 1

17

WriteCmdXLCD(SHIFT_DISP_LEFT);
// Entry Mode

TRIS_DATA_PORT &= 0x0f;
Make port output

// Set DD Ram address to 0
while(BusyXLCD());
Wait if LCD busy

DATA_PORT &= 0x0f;
write upper nibble

//

SetDDRamAddr(0x80);
// Set Display data ram address to 0
return;
}void SetCGRamAddr(unsigned char CGaddr)
{

//

DATA_PORT |= ((DDaddr | 0b10000000) &

0xf0);
RW_PIN = 0;
// Set
control bits
RS_PIN = 0;
DelayFor18TCY();
// Clock the

DelayFor18TCY();
E_PIN = 0;

DATA_PORT &= 0x0f;
write upper nibble

// and

DATA_PORT |= ((CGaddr | 0b01000000) &
0xf0);
RW_PIN = 0;
signals

// and

E_PIN = 1;
cmd and address in

// Upper nibble interface

TRIS_DATA_PORT &= 0x0f;
Make nibble input


// Set control

// Upper nibble interface
DATA_PORT &= 0x0f;
lower nibble

// Write

DATA_PORT |= ((DDaddr<<4)&0xf0);
DelayFor18TCY();
E_PIN = 1;
cmd and address in

RS_PIN = 0;
DelayFor18TCY();

// Clock the

DelayFor18TCY();

E_PIN = 1;
// Clock cmd
and address in
DelayFor18TCY();
E_PIN = 0;
// Write lower nibble

//


DATA_PORT &= 0x0f;

DATA_PORT |= ((CGaddr<<4)&0xf0);

E_PIN = 0;
// Upper nibble interface
TRIS_DATA_PORT |= 0xf0;
Make port input

//

return;
}unsigned char BusyXLCD(void)

DelayFor18TCY();
E_PIN = 1;
and address in

// Clock cmd

{
RW_PIN = 1;
bits for read
RS_PIN = 0;

DelayFor18TCY();

DelayFor18TCY();

E_PIN = 0;

TRIS_DATA_PORT |= 0xf0;
Make inputs
return;

//

E_PIN = 1;
command

// 4-bit interface
// Upper nibble interface

// Clock in the

DelayFor18TCY();

}void SetDDRamAddr(unsigned char DDaddr)
{

// Set the control

// Upper nibble interface
if(DATA_PORT&0x80)
{


ĐỒ ÁN 1

18


E_PIN = 0;

// Reset clock line

DelayFor18TCY();
E_PIN = 1;

// Clock out other

// Upper nibble interface
data = DATA_PORT&0xf0;
nibble into the upper nibble of data

// Read the

nibble
DelayFor18TCY();

E_PIN = 0;

E_PIN = 0;

DelayFor18TCY();

RW_PIN = 0;

// Reset control

line
return 1;


// Reset the clock

E_PIN = 1;
lower nibble

// Return TRUE

// Clock out the

DelayFor18TCY();

}

// Upper nibble interface

else

// Busy bit is low

{
E_PIN = 0;

data |= (DATA_PORT>>4)&0x0f;
the nibble into the lower nibble of data

// Read

// Reset clock line
E_PIN = 0;


DelayFor18TCY();
E_PIN = 1;

// Clock out other

nibble

RW_PIN = 0;
control lines

// Reset the

DelayFor18TCY();
return (data&0x7f);
address, Mask off the busy bit

E_PIN = 0;
RW_PIN = 0;

// Reset control

line
return 0;

// Return FALSE

// Return the

}char ReadDataXLCD(void)

{

char data;
// 4-bit interface

}}
RW_PIN = 1;

unsigned char ReadAddrXLCD(void)

RS_PIN = 1;

{
char data;
retrieved from the LCD

DelayFor18TCY();

// Holds the data

E_PIN = 1;
of the LCD
DelayFor18TCY();

// 4-bit interface
RW_PIN = 1;
for the read

data = DATA_PORT&0xf0;
upper nibble of data

E_PIN = 0;

DelayFor18TCY();

DelayFor18TCY();

// Upper nibble interface

// Set control bits

RS_PIN = 0;

E_PIN = 1;
the LCD controller

// Clock the data out

line
// Clock data out of

DelayFor18TCY();

// Read the

// Reset the clock


ĐỒ ÁN 1

19


E_PIN = 1;
nibble out of the LCD

// Clock the next

E_PIN = 0;
// Make data nibble input

DelayFor18TCY();

TRIS_DATA_PORT |= 0xf0;

// Upper nibble interface
data |= (DATA_PORT>>4)&0x0f;
the lower nibble of data

return;
// Read

}void WriteCmd8bit(unsigned char cmd)
{

E_PIN = 0;
RS_PIN = 0;

// 4-bit interface

// Reset the control


bits

// Upper nibble interface
RW_PIN = 0;

TRIS_DATA_PORT &= 0x0f;
DATA_PORT &= 0x0f;

return(data);

// Return the data

DATA_PORT |= cmd&0xf0;

byte

RW_PIN = 0;
signals for command

}
void WriteCmdXLCD(unsigned char cmd)

RS_PIN = 0;

{

DelayFor18TCY();

// 4-bit interface
// Upper nibble interface


E_PIN = 1;

// Clock command

in

TRIS_DATA_PORT &= 0x0f;
DATA_PORT &= 0x0f;

DelayFor18TCY();

DATA_PORT |= cmd&0xf0;

E_PIN = 0;

RW_PIN = 0;
signals for command

// Set control

TRIS_DATA_PORT |= 0xf0;

// Set control

return;

RS_PIN = 0;

}void WriteDataXLCD(char data)


DelayFor18TCY();

{

E_PIN = 1;

// Clock command

// Upper nibble interface

in

TRIS_DATA_PORT &= 0x0f;

DelayFor18TCY();

DATA_PORT &= 0x0f;

E_PIN = 0;
// Upper nibble interface

DATA_PORT |= data&0xf0;

DATA_PORT &= 0x0f;
DATA_PORT |= (cmd<<4)&0xf0;

// Clock command

DelayFor18TCY();

E_PIN = 1;

in
DelayFor18TCY();

// Set control bits

RW_PIN = 0;

DelayFor18TCY();
E_PIN = 1;

RS_PIN = 1;

LCD

// Clock nibble into


ĐỒ ÁN 1

20

DelayFor18TCY();
E_PIN = 0;
interface

// Upper nibble

WriteDataXLCD(*buffer); // Write

character to LCD
buffer++;

DATA_PORT &= 0x0f;

}

DATA_PORT |= ((data<<4)&0xf0);
DelayFor18TCY();
E_PIN = 1;

// Increment buffer

// Clock nibble into

LCD

return;
}void putrsXLCD(const rom char *buffer)
{
while(*buffer)
LCD up to null

DelayFor18TCY();
E_PIN = 0;

// Write data to

{
// Upper nibble interface


while(BusyXLCD());
LCD is busy

TRIS_DATA_PORT |= 0xf0;
return;}

WriteDataXLCD(*buffer); // Write
character to LCD

void putsXLCD(char *buffer)

buffer++;

{
while(*buffer)
LCD up to null

// Wait while

}

// Write data to

{
while(BusyXLCD());
while LCD is busy

return;
// Wait


}

// Increment buffer



CHƯƠNG 3: LÀM MẠCH THỰC TẾ
3.1 MẠCH IN


3.2 BOARD VÀ LINH KIỆN


CHƯƠNG 4: KẾT LUẬN
4.1 ƯU NHƯỢC ĐIỂM
 Ưu điểm:
 Nhỏ gọn, không chiếm nhiều không gian để lắp đặt.
 Dễ dàng lắp đặt và sử dụng.
 Hoạt động ổn định chính xác cao.
 Dễ dàng nâng cấp thêm nhiều chức năng
 Nhược điểm:
 Chỉ báo động có cháy khi nhiệt độ môi trường cao.
 Chưa tối ưu linh kiện.
 Giá thành còn cao
4.2 HƯỚNG PHÁT TRIỂN
Mạch được thiết kế với các jumper có thể cắm vào các chân port IC
Từ đó ta có thể nâng cấp mạch thêm nhiều tính năng cùng với sự đa
năng của Pic18f4550 như:
-lưu dữ liệu nhiệt độ các ngày

-điều khiển các thiết bị
-giao tiếp với các board khác hoặc máy tính
-mở rộng số cảm biến
-…

CHƯƠNG 5: KẾT LUẬN
Mạch báo cháy có nhiều loại, từ đơn giản tới phức tạp, nhưng nó
vẫn có tầm quan trọng trong việc phòng tránh và giảm thiểu hậu quả
do hỏa hoạn gây ra. Mạch báo cháy ở trên tuy đơn giản ít chức năng
nhưng hứa hẹn nhiều hướng phát triển và sẽ đạt hiệu quả cao hơn so
với các mạch báo cháy thông thường.
TÀI LIỆU THAM KHẢO
[1] TS. Văn Tấn Lượng -Ths. Nguyễn Quốc Đán (2015) “Giáo trình kĩ thuật
vi xử lý”, đại học Sài Gòn.



×