You are on page 1of 36

Đo nhiệt độ dùng LM35 + PIC16F877A + Hiển thị tiếng Việt trên LCD

và LED 7 đoạn

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 và LED 7 đoạn.
Để đo nhiệt độ ta dùng bộ ADC trong PIC16F877A,mình sẽ trình bày cụ
thể dưới đây:
I.ADC trong CCS:

Những sự lựa chọn này cho phép người sử dụng định hình thể và sử dụng bộ
chuyển đổi từ tín hiệu tương tự sang tín hiệu số.Chúng chỉ có sẵn trên thiết bị
với phần cứng ADC.Sự lựa chọn cho những chức năng và chỉ dẫn thay đổi
phụ thuộc vào con chip và đã được liệt kê trong phần header file của thiết
bị.Trên 1 vài thiết bị có 2 bộ ADC độc lập. đối với những chip này bộ ADC
thứ 2 được định hình thể để sử dụng chức năng cài đặt ADC thứ cấp(Ví dụ
setup_ADC2)
Những chức năng có liên quan:
Setup_adc(mode):Cài đặt chế độ ADC
Cú pháp: setup_adc (mode);
setup_adc2(mode);
Thông số:mode-chế độ tín hiệu tương tự sang tín hiệu số.Sự lựa chọn hợp lý
thay đổi phụ thuộc vào thiết bị.Xem những thiết bị có tập tin .h cho tất cả sự
lựa chọn.Một vài sự lựa chọn tiêu biểu bao gồm:
ADC_OFF
ADC_CLOCK_INTERNAL
ADC_CLOCK_DIV_32
Trả về:Không được định nghĩa
Chức năng: Định hình thể chuyển từ tín hiệu tương tự sang tín hiệu số
Tiện lợi:Chỉ có trong những thiết bị có bộ chuyển đổi tín hiệu tương tự sang
tín hiệu số
Yêu cầu:Những hằng số đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ: setup_adc_ports( ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
value = read_adc();
setup_adc( ADC_OFF );
Ví dụ những tập tin: ex_admm.c
Xem thêm: setup_adc_ports(), set_adc_channel(), read_adc(), #device, ADC
overview,xem tập tin header của thiết bị đã được chọn
setup_adc_ports(value):Thiết lập những chân ADC có sẵn để chuyển từ tín
hiệu tương tự sang tín hiệu số
Cú pháp: setup_adc_ports (value)
Thông số: value -Một hằng số được định nghĩa trong tập tin .h của thiết bị
Trả về:Không được định nghĩa
Chức năng:Cài đặt những chân ADC là tín hiệu tương tự,tín hiệu số hoặc
một sự kết hợp và điện áp tham chiếu để sử dụng khi tính tóan giá trị
ADC.Sự kết hợp các chân tín hiệu tương tự đã được cho phép thay đổi phụ
thuộc vào con chip và được định nghĩa bằng cách sử dụng từng bit OR để
ghép những chân đã được chọn cùng với nhau.Kiểm tra thiết bị bao gồm tập
tin các chân và điện áp tham chiếu đã được sắp đặt trong danh sách hòan
chỉnh.Hằng số ALL_ANALOG và NO_ANALOG là hợp lý cho tất cả con
chip.Một vài ví dụ khác định nghĩa chân là :
ANALOG_RA3_REF- Kích họat tất cả các chân tín hiệu tương tự và chân
RA3 là điện áp tham chiếu
RA0_RA1_RA3_ANALOG- Chỉ có chân RA0,RA1,RA3 là tín hiệu tương
tự
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng
Analog/Digital
Yêu cầu: Những hằng số đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ:
//Tất cả các chân analog
setup_adc_ports( ALL_ANALOG );
Chân A0,A1,A3 là analog,và tất cả các chân còn lại là digital. Điện áp +5V
được sử dụng như điện áp tham chiếu
setup_adc_ports( RA0_RA1_RA3_ANALOG );
//Chân A0,A1 là analog,chân A3 được sử dụng cho điện áp tham chiếu và tất
cả các chân còn lại là digital
setup_adc_ports( A0_RA1_ANALOGRA3_REF );
Ví dụ những tập tin: ex_admm.c
Xem them: setup_adc(), read_adc(), set_adc_channel(), ADC overview
set_adc_channel(channel):Chỉ rõ những kênh dung để sử dụng cho việc gọi
Analog/Digital
Cú pháp: set_adc_channel (chan)
Thông số:Chân là số kênh được chọn.Số chân bắt đầu tại 0 và đã được đặt
nhãn trong datasheet AN0,AN1
Trả về:Không được định nghĩa
Chức năng:Chỉ rõ những kênh được sử dụng cho việc gọi lệnh
READ_ADC().Hãy biết rằng bạn phải chờ 1 khỏang thờii gian ngắn sau khi
thay đổi kênh trước khi bạn có thể nhận được giá trị đọc hợp lý.Thời gian
thay đổi phụ thuộc vào trở kháng của nguồn đầu vào.Khỏang 10us nói chung
là tốt cho hầu hết các ứng dụng.Bạn không cần thay đổi kênh trước mỗi lần
đọc nếu kênh không thay đổi
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng
Analog/Digital
Yêu cầu:Không cần thứ gì
Ví dụ: set_adc_channel(2);
delay_us(10);
value = read_adc();
Ví dụ những tập tin: ex_admm.c
Xem thêm: read_adc(), setup_adc(), setup_adc_ports(), ADC overview
read_adc(mode):Bắt đầu quá trình chuyển đổi và đọc giá trị.Chế độ này có
thể cũng điều khiển chức năng.
Cú pháp: value = read_adc ([mode])
Thông số: mode là một thông số không bắt buộc.Nếu được sử dụng giá trị có
thể:
ADC_START_AND_READ (Liên tục đọc,và đây là mặc định )
ADC_START_ONLY (Bắt đầu quá trình chuyển đổi và trả về giá trị)
ADC_READ_ONLY (Đọc kết quả chuyển đổi cuối cùng )
Trả về:8 bit hoặc 16 bit số nguyên phụ thuộc vào #DEVICE ADC= directive
(directive:lời chỉ dẫn,8 hoặc 16).
Chức năng: Đây là chức năng đọc giá trị số từ bộ chuyển đổi tín hiệu tương
tự sang tín hiệu số.Gọi lệnh setup_adc(), setup_adc_ports() and
set_adc_channel() nên được làm vài lần trước khi chức năng này được
gọi.Dãy giá trị trả về phụ thuộc vào số lượng bit tbộ chuyển đổi
Analog/Digital trong con chip và sự sắp đặt trong DEVICE ADC= directive
như sau:
#DEVICE 8 bit 10 bit 11 bit 12 bit 16 bit
ADC=8 00-FF 00-FF 00-FF 00-FF 00-FF
ADC=10 x 0-3FF X 0-3FF x
ADC=11 x x 0-7FF x x
ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFF0 0-FFFF
Lưu ý:X không được định nghĩa
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng
Analog/Digital
Yêu cầu: Những chân cố định đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ: setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while ( input(PIN_B0)
{
delay_ms( 5000 );
value = read_adc();
printf("A/D value = %2x\n\r", value);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
Ví dụ tập tin: ex_admm.c, ex_14kad.c
Xem thêm : setup_adc(), set_adc_channel(), setup_adc_ports(), #DEVICE,
ADC overview
ADC_done():Trả về 1 nếu bộ chuyển đổi đã hòan thành việc chuyển đổi của

Tiền xử lý có liên quan:
#DEVICE ADC=xx : Định hình thể read_adc rồi trả về kính thước.Ví dụ, sử
dụng 1 con PIC với 10 bit A/D bạn có thể sử dụng 8 hoặc 10 cho xx- 8 sẽ trả
về bye có trọng số cao nhất,10 sẽ trả về tòan bộ giá trị đọc A/D 10 bit
Các ngắt có liên quan:
INT_AD: Ngắt xảy ra khi quá trình chuyển đổi đã hòan tất
INT_ADOF: Ngắt xảy ra khi quá trình chuyển đổi trong thời gian chờ
Các tập tin có liên quan:
Không có,tất cả chức năng được cài đặt sẵn
Các thông số getenv() có liên quan:
ADC_CHANNELS : Số kênh Analog/Digital
ADC_RESOLUTION : Số lượng bit trả về bởi lệnh read_adc
II.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

III. LCD

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

#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ả:
Đo nhiệt độ dùng LM35 + PIC16F877A + Hiển thị
tiếng Việt trên LCD và LED 7 đoạn
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 và LED 7 đoạn.
Để đo nhiệt độ ta dùng bộ ADC trong PIC16F877A,mình sẽ trình bày cụ thể dưới đây:
I.ADC trong CCS:

Những sự lựa chọn này cho phép người sử dụng định hình thể và sử dụng bộ chuyển đổi
từ tín hiệu tương tự sang tín hiệu số.Chúng chỉ có sẵn trên thiết bị với phần cứng ADC.Sự
lựa chọn cho những chức năng và chỉ dẫn thay đổi phụ thuộc vào con chip và đã được liệt
kê trong phần header file của thiết bị.Trên 1 vài thiết bị có 2 bộ ADC độc lập. đối với
những chip này bộ ADC thứ 2 được định hình thể để sử dụng chức năng cài đặt ADC thứ
cấp(Ví dụ setup_ADC2)
Những chức năng có liên quan:
Setup_adc(mode):Cài đặt chế độ ADC
Cú pháp: setup_adc (mode);
setup_adc2(mode);
Thông số:mode-chế độ tín hiệu tương tự sang tín hiệu số.Sự lựa chọn hợp lý thay đổi phụ
thuộc vào thiết bị.Xem những thiết bị có tập tin .h cho tất cả sự lựa chọn.Một vài sự lựa
chọn tiêu biểu bao gồm:
ADC_OFF
ADC_CLOCK_INTERNAL
ADC_CLOCK_DIV_32
Trả về:Không được định nghĩa
Chức năng: Định hình thể chuyển từ tín hiệu tương tự sang tín hiệu số
Tiện lợi:Chỉ có trong những thiết bị có bộ chuyển đổi tín hiệu tương tự sang tín hiệu số
Yêu cầu:Những hằng số đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ: setup_adc_ports( ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
value = read_adc();
setup_adc( ADC_OFF );
Ví dụ những tập tin: ex_admm.c
Xem thêm: setup_adc_ports(), set_adc_channel(), read_adc(), #device, ADC
overview,xem tập tin header của thiết bị đã được chọn
setup_adc_ports(value):Thiết lập những chân ADC có sẵn để chuyển từ tín hiệu tương tự
sang tín hiệu số
Cú pháp: setup_adc_ports (value)
Thông số: value -Một hằng số được định nghĩa trong tập tin .h của thiết bị
Trả về:Không được định nghĩa
Chức năng:Cài đặt những chân ADC là tín hiệu tương tự,tín hiệu số hoặc một sự kết hợp
và điện áp tham chiếu để sử dụng khi tính tóan giá trị ADC.Sự kết hợp các chân tín hiệu
tương tự đã được cho phép thay đổi phụ thuộc vào con chip và được định nghĩa bằng cách
sử dụng từng bit OR để ghép những chân đã được chọn cùng với nhau.Kiểm tra thiết bị
bao gồm tập tin các chân và điện áp tham chiếu đã được sắp đặt trong danh sách hòan
chỉnh.Hằng số ALL_ANALOG và NO_ANALOG là hợp lý cho tất cả con chip.Một vài
ví dụ khác định nghĩa chân là :
ANALOG_RA3_REF- Kích họat tất cả các chân tín hiệu tương tự và chân RA3 là điện áp
tham chiếu
RA0_RA1_RA3_ANALOG- Chỉ có chân RA0,RA1,RA3 là tín hiệu tương tự
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
Yêu cầu: Những hằng số đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ:
//Tất cả các chân analog
setup_adc_ports( ALL_ANALOG );
Chân A0,A1,A3 là analog,và tất cả các chân còn lại là digital. Điện áp +5V được sử dụng
như điện áp tham chiếu
setup_adc_ports( RA0_RA1_RA3_ANALOG );
//Chân A0,A1 là analog,chân A3 được sử dụng cho điện áp tham chiếu và tất cả các chân
còn lại là digital
setup_adc_ports( A0_RA1_ANALOGRA3_REF );
Ví dụ những tập tin: ex_admm.c
Xem them: setup_adc(), read_adc(), set_adc_channel(), ADC overview
set_adc_channel(channel):Chỉ rõ những kênh dung để sử dụng cho việc gọi
Analog/Digital
Cú pháp: set_adc_channel (chan)
Thông số:Chân là số kênh được chọn.Số chân bắt đầu tại 0 và đã được đặt nhãn trong
datasheet AN0,AN1
Trả về:Không được định nghĩa
Chức năng:Chỉ rõ những kênh được sử dụng cho việc gọi lệnh READ_ADC().Hãy biết
rằng bạn phải chờ 1 khỏang thờii gian ngắn sau khi thay đổi kênh trước khi bạn có thể
nhận được giá trị đọc hợp lý.Thời gian thay đổi phụ thuộc vào trở kháng của nguồn đầu
vào.Khỏang 10us nói chung là tốt cho hầu hết các ứng dụng.Bạn không cần thay đổi kênh
trước mỗi lần đọc nếu kênh không thay đổi
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
Yêu cầu:Không cần thứ gì
Ví dụ: set_adc_channel(2);
delay_us(10);
value = read_adc();
Ví dụ những tập tin: ex_admm.c
Xem thêm: read_adc(), setup_adc(), setup_adc_ports(), ADC overview
read_adc(mode):Bắt đầu quá trình chuyển đổi và đọc giá trị.Chế độ này có thể cũng điều
khiển chức năng.
Cú pháp: value = read_adc ([mode])
Thông số: mode là một thông số không bắt buộc.Nếu được sử dụng giá trị có thể:
ADC_START_AND_READ (Liên tục đọc,và đây là mặc định )
ADC_START_ONLY (Bắt đầu quá trình chuyển đổi và trả về giá trị)
ADC_READ_ONLY (Đọc kết quả chuyển đổi cuối cùng )
Trả về:8 bit hoặc 16 bit số nguyên phụ thuộc vào #DEVICE ADC= directive (directive:lời
chỉ dẫn,8 hoặc 16).
Chức năng: Đây là chức năng đọc giá trị số từ bộ chuyển đổi tín hiệu tương tự sang tín
hiệu số.Gọi lệnh setup_adc(), setup_adc_ports() and set_adc_channel() nên được làm vài
lần trước khi chức năng này được gọi.Dãy giá trị trả về phụ thuộc vào số lượng bit tbộ
chuyển đổi Analog/Digital trong con chip và sự sắp đặt trong DEVICE ADC= directive
như sau:
#DEVICE 8 bit 10 bit 11 bit 12 bit 16 bit
ADC=8 00-FF 00-FF 00-FF 00-FF 00-FF
ADC=10 x 0-3FF X 0-3FF x
ADC=11 x x 0-7FF x x
ADC=16 0-FF00 0-FFC0 0-FFEO 0-FFF0 0-FFFF
Lưu ý:X không được định nghĩa
Tiện lợi:Chức năng này có sẵn trong các thiết bị với phần cứng Analog/Digital
Yêu cầu: Những chân cố định đã được định nghĩa trong tập tin .h của thiết bị
Ví dụ: setup_adc( ADC_CLOCK_INTERNAL );
setup_adc_ports( ALL_ANALOG );
set_adc_channel(1);
while ( input(PIN_B0)
{
delay_ms( 5000 );
value = read_adc();
printf("A/D value = %2x\n\r", value);
}
read_adc(ADC_START_ONLY);
sleep();
value=read_adc(ADC_READ_ONLY);
Ví dụ tập tin: ex_admm.c, ex_14kad.c
Xem thêm : setup_adc(), set_adc_channel(), setup_adc_ports(), #DEVICE, ADC
overview
ADC_done():Trả về 1 nếu bộ chuyển đổi đã hòan thành việc chuyển đổi của nó
Tiền xử lý có liên quan:
#DEVICE ADC=xx : Định hình thể read_adc rồi trả về kính thước.Ví dụ, sử dụng 1 con
PIC với 10 bit A/D bạn có thể sử dụng 8 hoặc 10 cho xx- 8 sẽ trả về bye có trọng số cao
nhất,10 sẽ trả về tòan bộ giá trị đọc A/D 10 bit
Các ngắt có liên quan:
INT_AD: Ngắt xảy ra khi quá trình chuyển đổi đã hòan tất
INT_ADOF: Ngắt xảy ra khi quá trình chuyển đổi trong thời gian chờ
Các tập tin có liên quan:
Không có,tất cả chức năng được cài đặt sẵn
Các thông số getenv() có liên quan:
ADC_CHANNELS : Số kênh Analog/Digital
ADC_RESOLUTION : Số lượng bit trả về bởi lệnh read_adc
II.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

III. LCD

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

#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ả:
IV.Mở rộng:Hiển thị tiếng Việt trên LCD

Datasheet LCD viết bằng tiếng Việt


Click here to download
Tài liệu hướng dẫn viết tiếng Việt lên LCD
Click here to download
V.Sơ đồ nguyên lý:
Đây là sơ đồ hiển thị nhiệt độ ra LCD:
Đây là sơ đồ hiển thị nhiệt độ ra LED 7 đoạn:

VI.Sơ đồ mạch in PCB:


VII.Code đo nhiệt độ dùng LM35+PIC16F877A+hiển thị tiếng Việt trên LCD
Code:
#define<16f877a.h>
#include"16f877A.h"
#device adc=8
#use delay(clock=12000000)
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#include<lcd.c>
int8 read;
int8 ketqua[10];
int8 dem[10];
byte const CGRAM[24]={ 0X0E,0X00,0X0E,0X11,0X1F,0X10,0X0E,0X04,
0X01,0X03,0X01,0X07,0X09,0X09,0X07,0X00,
0X0E,0X00,0X0E,0X11,0X11,0X11,0X0E,0x04,};

byte const LED[10]={ 0b00000011,


0b10011111,
0b00100101,
0b00001101,
0b10011001,
0b01001001,
0b01000001,
0b00011111,
0b00000001,
0b00001001,
};

void main()
{
int8 i,j,max,tam;
int8 solan;
set_tris_a(0xFF);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);

lcd_init();
lcd_send_byte(0,0x2D);// viet cau lenh lcd 4 bit , 2 hang , 5*10dots
lcd_send_byte(0,0x40); // viet cau lenh , ra lenh cho lcd chi toi
cgram
//lcd_send_byte(0,0x07);// Dich sang trai khi co hanh dong ghi vao
CGRAM

for(i=0;i<24;i++)
lcd_send_byte(1,CGRAM[I]);// viet du lieu vao cgram co dia chi
la 0x00 ++
while(TRUE)
{
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

for(i=0;i<10;i++)
{
if(adc_done())
{
ketqua[i]=read_adc();
delay_us(20);
}
}
setup_adc( ADC_OFF ); //Sau khi lay 10 gia tri xong thi tat ADC
for(i=0;i<10;i++)
{
dem[i]=0;
for(j=0;j<9;j++)
{
if(ketqua[i]==ketqua[j])
dem[i]++;
}
}
tam=dem[0];
max=ketqua[0];
for(i=0;i<9;i++)
{
if(tam<=dem[i+1])
{
tam=dem[i+1];
max=ketqua[i+1];
}
}
lcd_gotoxy(1,1);
max=max/0.51;
printf(lcd_putc,"Nhiet do max: %u",max);
delay_us(20);
//ting trung binh
tam=0;
for(i=0;i<10;i++)
{
tam=tam+ketqua[i];
}
max=tam/10/0.51;
LCD_GOTOXY(3,0);
LCD_SEND_BYTE(1,'N');
LCD_SEND_BYTE(1,'h');
LCD_SEND_BYTE(1,'i');
LCD_SEND_BYTE(1,0x00);
LCD_SEND_BYTE(1,'t');
LCD_SEND_BYTE(1,' ');
LCD_SEND_BYTE(1,0x01);
LCD_SEND_BYTE(1,0x02);
LCD_SEND_BYTE(1,' ');
LCD_SEND_BYTE(1,'T');
LCD_SEND_BYTE(1,'B');
LCD_SEND_BYTE(1,':');
printf(lcd_putc,"%u",max);

lcd_send_byte(0,0x1c);
delay_ms(1000);
}

}
VIII.Code đo nhiệt độ dùng LM35+PIC16F877A+Hiển thị LED 7 đoạn

Code:
#define<16f877a.h>
#include"16f877A.h"
#device adc=8
#use delay(clock=12000000)
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
int8 read;
byte const LED[10]={ 0b00001001,//0
0b00111111,//1
0b10010001,//2
0b00010011,//3
0b00100111,//4
0b01000011,//5
0b01000001,//6
0b00011111,//7
0b00000000,//8
0b00000010,//9
};

void main()
{
int8 chuc,donvi;
int1 done;
int8 i;
set_tris_a(0xFF);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
while(TRUE)
{
setup_adc(ADC_START_ONLY);
done=adc_done();
while(!done)
{
done=adc_done();
}
delay_ms(100);
READ=READ_ADC();

for(i=0;i=200;i++)
{
chuc=read/10;
donvi=read%10;
output_low(pin_c0);
output_b(led[chuc]);
delay_ms(10);
output_high(pin_c0);
output_low(pin_c1);
output_b(led[donvi]);
delay_ms(10);
output_high(pin_c1);
}
}
}

IX.Thành quả thực tế:


Đục lỗ câu dây (do nhầm lẫn chân linh kiện giữa datasheet trên mạng và linh kiện
ngoài thực tế)
THE END
CHÚC CÁC BẠN HỌC TỐT
IV.Mở rộng:Hiển thị tiếng Việt trên LCD

Datasheet LCD viết bằng tiếng Việt


Click here to download
Tài liệu hướng dẫn viết tiếng Việt lên LCD
Click here to download
V.Sơ đồ nguyên lý:
Đây là sơ đồ hiển thị nhiệt độ ra LCD:
Đây là sơ đồ hiển thị nhiệt độ ra LED 7 đoạn:

VI.Sơ đồ mạch in PCB:


VII.Code đo nhiệt độ dùng LM35+PIC16F877A+hiển thị tiếng Việt trên
LCD
Code:
#define<16f877a.h>
#include"16f877A.h"
#device adc=8
#use delay(clock=12000000)
#FUSES
NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,N
OCPD,NOWRT
#include<lcd.c>
int8 read;
int8 ketqua[10];
int8 dem[10];
byte const
CGRAM[24]={ 0X0E,0X00,0X0E,0X11,0X1F,0X10,0X0E,0X0
4,
0X01,0X03,0X01,0X07,0X09,0X
09,0X07,0X00,
0X0E,0X00,0X0E,0X11,0X11,0X
11,0X0E,0x04,};

byte const LED[10]={ 0b00000011,


0b10011111,
0b00100101,
0b00001101,
0b10011001,
0b01001001,
0b01000001,
0b00011111,
0b00000001,
0b00001001,
};

void main()
{
int8 i,j,max,tam;
int8 solan;
set_tris_a(0xFF);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);

lcd_init();
lcd_send_byte(0,0x2D);// viet cau lenh lcd 4 bit
, 2 hang , 5*10dots
lcd_send_byte(0,0x40); // viet cau lenh , ra
lenh cho lcd chi toi cgram
//lcd_send_byte(0,0x07);// Dich sang trai khi co
hanh dong ghi vao CGRAM

for(i=0;i<24;i++)
lcd_send_byte(1,CGRAM[I]);// viet du lieu
vao cgram co dia chi la 0x00 ++
while(TRUE)
{
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);

for(i=0;i<10;i++)
{
if(adc_done())
{
ketqua[i]=read_adc();
delay_us(20);
}
}
setup_adc( ADC_OFF ); //Sau khi lay 10 gia
tri xong thi tat ADC
for(i=0;i<10;i++)
{
dem[i]=0;
for(j=0;j<9;j++)
{
if(ketqua[i]==ketqua[j])
dem[i]++;
}
}
tam=dem[0];
max=ketqua[0];
for(i=0;i<9;i++)
{
if(tam<=dem[i+1])
{
tam=dem[i+1];
max=ketqua[i+1];
}
}
lcd_gotoxy(1,1);
max=max/0.51;
printf(lcd_putc,"Nhiet do max: %u",max);
delay_us(20);
//ting trung binh
tam=0;
for(i=0;i<10;i++)
{
tam=tam+ketqua[i];
}
max=tam/10/0.51;
LCD_GOTOXY(3,0);
LCD_SEND_BYTE(1,'N');
LCD_SEND_BYTE(1,'h');
LCD_SEND_BYTE(1,'i');
LCD_SEND_BYTE(1,0x00);
LCD_SEND_BYTE(1,'t');
LCD_SEND_BYTE(1,' ');
LCD_SEND_BYTE(1,0x01);
LCD_SEND_BYTE(1,0x02);
LCD_SEND_BYTE(1,' ');
LCD_SEND_BYTE(1,'T');
LCD_SEND_BYTE(1,'B');
LCD_SEND_BYTE(1,':');
printf(lcd_putc,"%u",max);

lcd_send_byte(0,0x1c);
delay_ms(1000);
}

}
VIII.Code đo nhiệt độ dùng LM35+PIC16F877A+Hiển thị LED 7 đoạn

Code:
#define<16f877a.h>
#include"16f877A.h"
#device adc=8
#use delay(clock=12000000)
#FUSES
NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,N
OCPD,NOWRT
int8 read;
byte const LED[10]={ 0b00001001,//0
0b00111111,//1
0b10010001,//2
0b00010011,//3
0b00100111,//4
0b01000011,//5
0b01000001,//6
0b00011111,//7
0b00000000,//8
0b00000010,//9
};
void main()
{
int8 chuc,donvi;
int1 done;
int8 i;
set_tris_a(0xFF);
set_tris_d(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
while(TRUE)
{
setup_adc(ADC_START_ONLY);
done=adc_done();
while(!done)
{
done=adc_done();
}
delay_ms(100);
READ=READ_ADC();

for(i=0;i=200;i++)
{
chuc=read/10;
donvi=read%10;
output_low(pin_c0);
output_b(led[chuc]);
delay_ms(10);
output_high(pin_c0);
output_low(pin_c1);
output_b(led[donvi]);
delay_ms(10);
output_high(pin_c1);
}
}
}

IX.Thành quả thực tế:


Đục lỗ câu dây (do nhầm lẫn chân linh kiện giữa datasheet trên mạng và
linh kiện ngoài thực tế)
THE END
CHÚC CÁC BẠN HỌC TỐT

You might also like