Với tính ưu việt của vi điều khiển thì trong phạm vi đồ án nhỏ này, em chỉ dùng vi điều khiển Mục đích của đề tài hướng đến: ứng dụng tính năng của DS18b20 và vi điều khiển để đo và hiển
Trang 1MỤC LỤC
Trang
Lời mở đầu - 2
I Giới thiệu đề tài - 3
1.1.Yêu cầu và giới thiệu đề
tài -1.2 Mục đích của đề
tài -II Giải quyết đề tài - 3
2.1.Vi điều khiển MSP430G2252 - 3
2.2.Cảm biến nhiệt DS18B20 - 5
2.3 Text LCD -8
III Sơ đồ - 9
3.1.Sơ đồ khối - 9
3.2.Sơ đồ mạch chi tiết - 10
IV Lập trình cho vi điều khiển -10
1 Lưu đồ giải thuật -10
2 Code -11
V Kết luận -17
1 Ưu điểm -17
2 Khuyết điểm -17
3 Hướng phát triển và ứng dụng -18
VI VII Tài liệu tham khảo -18
Trang 2LỜI NÓI ĐẦU
Kỹ thuật vi điều khiển hiện nay rất phát triển, nó được ứng dụng vào rất nhiều lĩnh vực sản xuất công nghiệp, tự động hóa, trong đời sống và còn nhiều lĩnh vực khác nữa So với kỹ thuật số thì kỹ thuật vi điểu khiển nhỏ gọn hơn rất nhiều do nó được tích hợp lại
và có khả năng lập trình được để điều khiển Nên rất tiện dụng và cơ động Với tính ưu việt của vi điều khiển thì trong phạm vi đồ án nhỏ này, em chỉ dùng vi điều khiển
Mục đích của đề tài hướng đến: ứng dụng tính năng của DS18b20 và vi điều khiển để đo và hiển thị nhiệt độ
Việc thực hiện xong đồ án môn học bằng các kiến thức đã học, một số sách tham khảo và một số nguồn tài liệu khác nên không tránh khỏi những thiếu sót
Vì vậy, nhóm rất mong sự đóng góp ý kiến quý báo của thầy cô, anh chị và các bạn bè để đề tài được hoàn thành tốt hơn về cả phương diện kinh tế, thẩm mĩ cũng như
kỹ thuật
Qua đây tôi xin gửi lời cảm ơn chân thành đến thầy Trần Hửu Danh người trực tiếp giảng dạy, cùng với sự đóng góp ý kiến của các bạn đã tạo điều kiện cho tôi hoàn thành đồ án môn học này
Cần Thơ, ngày 30 tháng 11 năm 2011
Trang 3ĐỀ TÀI MẠCH ĐO NHIỆT ĐỘ HIỂN THỊ LCD
I GIỚI THIỆU ĐỀ TÀI
1.1 Yêu cầu và giới hạn đề tài
Yêu cầu:
Yêu cầu đặc ra của đề tài đó chính là thiết kế mạch đo, hiển thị được nhiệt độ và cập nhật sự thay đổi nhiệt độ môi trường một cách liên tục
Giới hạn của đề tài:
Đo và hiển thị nhiệt độ của môi trường ra màn hình LCD
Dùng cảm biến DS18B20 cập nhật sự thay đổi của nhiệt độ môi trường
Mạch có thể mở rộng thêm phần báo động nhiệt độ
2.1 Mục đích của đề tài :
Một số mục tiêu cần đạt được khi thực hiện đề tài:
Hiểu được cấu tạo của vi điều khiển MSP430
Tìm hiểu cảm biến nhiệt độ DS18B20
Cách lập trình bằng ngôn ngữ C sử dụng phần mềm IAR để lập trình cho họ vi điều khiển MSP430
II – GIẢI QUYẾT ĐỀ TÀI
2.1 Vi điều khiển MSP430G2252 :
Sơ đồ chân:
Trang 4
Một số đặc tính kĩ thuật:
Là vi điều khiển 16 bit kiến trúc kiểu RISC
Tần số hoạt động lên tới 16MHz
Điện thế hoạt động thấp 1,8 _ 3,6V
Ultra-Low Power Consumption:
−Active Mode: 220 mA at 1 MHz, 2.2 V
−Standby Mode: 0.5 mA
−Off Mode (RAM Retention): 0.1 mA
10 Bit 200-ksps (kilosamples per second) A/D converter
Có 5 chế độ tiết kiệm điện
Có 16 chân xuất nhập
Hỗ trợ giao tiếp I2C,SPI
16 bit Timer
Sơ đồ khối:
Chức năng của các chân :
Chân 1: được nối với nguồn Vcc
Chân 2: xuất/nhập thông thường, Timer0_A, ngã vào TACLK, ngã ra ACLK, ngã vào A0 của ADC10, comparator_A+, ngã vào CA0
Chân 3: xuất/nhập thông thường, Timer0_A, capture: CCI0A input, compare: ngã ra OUT0, ngã vào A1 của ADC10, comparator_A+, ngã vào CA0
Chân 4: xuất/nhập thông thường, Timer0_A, capture: CCI1A input, compare: ngã ra OUT1, ngã vào A2 của ADC10, comparator_A+, ngã vào CA2
Trang 5 Chân 5: xuất/nhập thông thường, ngã ra xung đồng hồ của bộ biến đổi ADC10, ngã ra comparator_A+, ngã vào A3 của ADC10, điện thế tham chiếu âm của ADC10, comparator_A+, ngã vào CA3
Chân 6: xuất/nhập thông thường, ngã ra tín hiệu SMCLK, Timer0_A, capture: CCI2A input, compare: ngã ra OUT2, ngã vào A4 của ADC10, điện thế tham chiếu dương của ADC10, comparator_A+, ngã vào CA4
Chân 7: xuất/nhập thông thường, Timer0_A, compare: ngã ra OUT0, USI: xung clock ngã vào ở chế độ I2C, xung clock vào/ra ở chế độ SPI, ngã vào A5 của ADC10, comparator_A+, ngã vào CA5
Chân 8: xuất/nhập thông thường
Chân 9: xuất/nhập thông thường
Chân 10: xuất/nhập thông thường
Chân 11: xuất/nhập thông thường
Chân 12: xuất/nhập thông thường
Chân 13: xuất/nhập thông thường
Chân 14: xuất/nhập thông thường, Timer0_A, compare: ngã ra OUT1, USI: ngã ra dữ liệu ở chế độ SPI, USI: xung đồng hồ I2C ở chế độ I2C, ngã vào A6 của ADC10, comparator_A+, ngã vào CA6
Chân 15: xuất/nhập thông thường, ngã ra comparator_A+, dữ liệu ngã vào
ở chế độ SPI mode, dữ liệu I2C ở chế độ SPI, ngã vào A6 của ADC10, comparator_A+, ngã vào CA7
Chân 16: Reset
Chân 17: chọn chế độ kiểm tra cho các chân JTAG ở Port 1, cầu chì bảo vệ được kết nối đến Test
Chân 18: ngã ra kết nối của bộ dao động thạch anh, xuất/nhập thông thường
Chân 19: ngã vào của bộ dao động thạch anh, xuất/nhập thông thường, Timer0_A, compare: ngã ra OUT1
2.2 Cảm biến nhiệt DS18B20
o Ðể đo nhiệt độ được chính xác, tất nhiên cần có một đầu dò thích hợp Ðầu
dò là một cảm biến nhiệt độ có nhiệm vụ vận chuyển từ nhiệt độ qua tín hiệu điện Dựa vào lý thuyết và thực tế của mạch cần thiết kế ta dùng phương pháp đo bằng IC cảm biến nhiệt độ
o Các IC cảm biến nhiệt độ có độ chính xác cao, dễ tìm và giá thành rẻ Một trong số đó là IC DS18B20, là loại thông dụng trên thị trường hiện nay, đồng thời nó có những đặc tính làm việc phù hợp với thiết kế chi tiết của mạch
a.Các đặc tính của DS18B20
Các đặc điểm kỹ thuật của cảm biến DS18B20 có thể kể ra một cách tóm tắt như
sau:
Sử dụng giao diện một dây nên chỉ cần có một chân ra để truyền thông
Độ phân giải khi đo nhiệt độ từ 9 bit tới 12bit Dải đo nhiệt độ -55°C đến 125°C, với khoảng nhiệt độ là -10°C to +85°C thì độ chính xác ±0.5°C.Có chức năng cảnh báo nhiệt độ vượt qua giá trị cho trước
Trang 6 Rất thích hợp với các ứng dụng đo lường đa điểm vì nhiều đầu đo có thể được nối trên một bus, bus này được gọi là bus một dây (1-wire)
Thời gian lấy mẫu và biến đổi thành số tương đối nhanh, không quá 200 ms
Không cần thêm linh kiện bên ngoài
Điện áp nguồn nuôi có thể thay đổi trong khoảng rộng, từ 3.0 V đến 5.5 V
DC và có thể được cấp thông qua đường dẫn dữ liệu
Dòng tiêu thụ tại chế độ nghỉ cực nhỏ
Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit
Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ nhớ ROM trên chip, các giá trị này giúp phân biệt giữa các IC với nhau trên cùng 1 bus
Byte 0 và 1 lưu giá trị nhiệt độ chuyển đổi
Byte 2 và 3 lưu giá trị ngưỡng nhiệt độ ( giá trị này được lưu khi mất điện)
Byte 4 là thanh ghi cấu hình cho hoạt động của DS1820
Byte 5,6 và 7 không sử dụng
Byte 8 là thanh ghi chỉ đọc lưu giá trị CRC từ byte 0 đến byte 7
• Việc đo nhiệt độ của DS18B20 được thực hiện theo từng lần lấy mẫu Mỗi lần lấy mẫu được ngăn cách bởi 1 tín hiệu reset và 1 presence pulse Reset được xem như quá trình ngăn cách và khởi động lại quá trình đo nhiệt độ mới, presence pulse giống như tín hiệu báo hiệu cho vđk biết là DS18B20 đang có mặt
• Các bước của 1 lần lấy mẫu:
- Khởi tạo xung reset và nhận tín hiệu nhận dạng từ DS18B20
- Gửi các lệnh ROM
- Gửi các lệnh chức năng bộ nhớ
Trang 7 Nhiệt độ / giá trị chuyển đổi:
Độ phân giải nhiệt độ đo có thể được cấu hình ở chế độ 9 bits, 10bits, 11bits, 12bits Ở chế độ mặc định thì DS1820 hoạt động ở độ phân giải 12bits
Giá trị nhiệt độ lưu trong bộ nhớ gồm 2bytes-16bits: số âm sẽ được lưu dưới dạng
bù 2
Bit cao nhất là bit dấu (S) nếu S=0 thì giá trị nhiệt độ dương và S=1 thì giá trị nhiệt độ âm
Nếu cấu hình độ phân giải là 12bits thì tất cả các bit đều được sử dụng Nếu độ phân giải 11bits thì bit 0 không được sử dụng Tương tự nếu cấu hình là 10bits thì bit 1,0 không được sử dụng, nếu cấu hình là 9 bits thì bit 2,1,0 không được sử dụng
b.Giãn đồ thời gian chương trình reset, đọc và ghi cho DS18B20:
Reset
Đọc và ghi:
Trang 8b.Cách kết nối DS18B20 với vi điều khiển
2.3 Text LCD:
Là một thiết bị thông dụng dùng để hiển thị thông tin đặc biệt là hiển thị các chữ cái LCD 1602 có 2 hàng và 16 cột, hiển thị tối đa 32 ký tự cùng lúc (16 chữ cái hàng trên và 16 chữ cái ở hàng dưới )
Trang 9 Cách bố trí chân:
VSS: Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển
VDD: Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với VCC=5V của mạch điều khiển
Vee: Chân này dùng để điều chỉnh độ tương phản của LCD
RS: Chân chọn thanh ghi (Register select) Nối chân RS với logic “0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi
R/W: Chân chọn chế độ đọc/ghi (Read/Write) Nối chân R/W với logic “0”
để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc
E: Chân cho phép (Enable) Sau khi các tín hiệu được đặt lên bus
DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
LCD cho phép giao tiếp với bộ điều khiển ngoài theo chế độ 4 bit Trong chế độ này, các chân D0, D1, D2 và D3 của LCD không được sử dụng (để trống), chỉ có 4 chân từ D4 đến D7 được kết nối với chip bộ điều khiển ngoài Các instruction và data 8 bit sẽ được ghi và đọc bằng cách chia thành 2 phần, gọi là các Nibbles, mỗi nibble gồm 4 bit và được giao tiếp thông qua 4 chân D7:4, nibble cao được xử lí trước và nibble thấp sau
Ưu điểm lớn nhất của phương pháp này tối thiểu số lines dùng cho giao tiếp LCD Tuy nhiên, việc đọc và ghi từng nibble tương đối khó khăn hơn đọc và ghi dữ liệu 8 bit
Trang 10III SƠ ĐỒ
3.1 Sơ đồ khối :
Các linh kiện chính dùng trong khối:
- Khối cảm biến:DS18B20
- Khối xử lý trung tâm: MSP430G2252
- Khối hiển thị: LCD 1602
3.2 Sơ đồ mạch chi tiết :
IV Lập trình cho vi điều khiển:
4.1 Lưu đồ giải thuật
U 1
M S P 4 3 0
V c c 1 / R S T
1 6
T E S T
1 7
P 2 7
1 8
P 2 6
1 9
P 2 4
1 2
P 2 5
1 3
P 2 0 8
P 2 1 9
P 2 2
1 0
V s s 2 0
P 1 0 2
P 1 1 3
P 1 2 4
P 1 3 5
P 1 4 6
P 1 5 7
P 1 6 1 4
P 1 7 1 5
P 2 3 1 1
U 3
D S 1 8 B 2 0
G N D
1 D Q 2
U 4 L C D - 1 6 0 2
R 1
1 0 k
V C C _ C I R C L E
R 2
3 3 0
Y 1
2 2 p
V C C _ C I R C L E
2 2 p
4 7 k
V C C _ C I R C L E
V C C _ C I R C L E
1 0 k
J 1
1
1 8
S W 1
1 u
1 9
1 6
V C C _ C I R C L E
1 6
U 5
L M 7 8 0 5
I N
1 O U T 3
2 1 0 0 0 u
V C C _ C I R C L E
U 6
L M 1 1 7 / T O
V I N 3
O U T 2
1 0 0 0 u
1 1
Trang 114.2 Code:
#include <msp430.h>
#define RS BIT2
#define EN BIT3
#define DQ BIT0
#define B4 BIT4
#define B5 BIT5
#define B6 BIT6
#define B7 BIT7
#define line_1 0x80
#define line_2 0xC0
#define clr_scr 0x01
//******************reset cho ds18b20*****************
unsigned char reset(void)
{
unsigned char pre;
P2DIR|=DQ;
P2OUT&=~DQ;
delay_cycles(480);
P2DIR&=~DQ;
delay_cycles(70);
Trang 12if ((P2IN&DQ)==0)
{
pre=1;
}
else
{
pre=0;
}
delay_cycles(410);
return(pre);
}
//***************doc bit*************************
unsigned char read_bit(void)
{
P2DIR |=DQ;
P2OUT&=~DQ ;
delay_cycles(2);
P2DIR&=~DQ;
delay_cycles(6);
return(DQ);
}
//********************ghi bit*******************
void viet_bit1()
{
P2DIR|=DQ;
P2OUT &=~DQ;
delay_cycles(4);
P2DIR&=~DQ ;
delay_cycles(38);
}
void viet_bit0()
{
P2DIR|=DQ;
P2OUT&=~DQ;
delay_cycles(41);
P2DIR&=~DQ;
}
//************************doc nhiet do******************************
unsigned char read_byte()
{
unsigned char i,tam=1;
unsigned char value = 0;
for (i=0;i<8;i++)
{
read_bit();
if((P2IN&DQ)==1)
Trang 13{
value+=tam;
}
tam*=2;
delay_cycles(40);
}
return (value);
}
//***************************ghi vao
ds18b20*******************************
void viet_byte(char hang)
{
unsigned char i;
for (i=0; i<8; i++)
{
unsigned char temp;
temp=0x01;
temp&=hang;
if (temp==0x01)
{
viet_bit1();
}
else viet_bit0();
hang>>=1;
}
}
//****************************************************************
//**************cac ham phuc vu cho LCD***************************
void enable()
{
P1DIR|=EN;
P1OUT|=EN;
delay_cycles(10);
P1OUT&=~EN;
delay_cycles(20);
}
//**********thiet lap du lieu cho cac chan du lieu****************************
void set_data_lsb(unsigned char data) //ham gui byte data thap
{
unsigned char convert=0;
convert=data&0x01;
if(convert==0x01)
{P1DIR|=B4;
P1OUT|=B4;
}
Trang 14else P1OUT&=~B4;
convert=data&0x02;
if(convert==0x02)
{ P1DIR|=B5;
P1OUT|=B5;}
else P1OUT&=~B5;
convert=data&0x04;
if(convert==0x04)
{P1DIR|=B6;
P1OUT|=B6;
}
else P1OUT&=~B6;
convert=data&0x08;
if(convert==0x08)
{ P1DIR|=B7;
P1OUT|=B7;}
else P1OUT&=~B7;
}
void set_data_msb(unsigned char data) //ham gui byte data cao
{
unsigned char convert=0;
convert=data&0x10;
if(convert==0x10)
{P1DIR|=B4;
P1OUT|=B4;}
else P1OUT&=~B4;
convert=data&0x20;
if(convert==0x20)
{P1DIR|=B5;
P1OUT|=B5;}
else P1OUT&=~B5;
convert=data&0x40;
if(convert==0x40)
{P1DIR|=B6;
P1OUT|=B6;}
else P1OUT&=~B6;
convert=data&0x80;
if(convert==0x80)
{ P1DIR|=B7;
P1OUT|=B7;}
else P1OUT&=~B7;
}
//************************HAM GUI
LENH******************************************
void ghilenh(unsigned char cmd)
{
P1DIR|=RS;
Trang 15P1OUT&=~RS;
set_data_msb(cmd);
enable();
set_data_lsb(cmd);
enable();
}
//**************************ham gui
data*************************************
void lcd_putchar(unsigned char data)
{
P1DIR|=RS;
P1OUT|=RS;
set_data_msb(data);
enable();
set_data_lsb(data);
enable();
}
//////////////////////////////////////////////////////////////////
void hienthi_nhietdo(char giatri)
{
unsigned char chuc;
unsigned char donvi;
unsigned char tram;
unsigned char phandu;
tram=giatri/100;
phandu=giatri%100;
chuc=phandu/10;
donvi=phandu%10;
tram+=0x30;
chuc+=0x30;
donvi+=0x30;
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
}
void hienthi_sole(int phanle)
{
int nghinle,du_nghin;
unsigned char tramle,du_tram;
unsigned char chucle;
unsigned char donvile;
nghinle=phanle/1000;
du_nghin=phanle%1000;
tramle=du_nghin/100;
du_tram=du_nghin%100;
chucle=du_tram/10;
donvile=du_tram%10;
Trang 16nghinle+=0x30;
tramle+=0x30;
chucle+=0x30;
donvile+=0x30;
lcd_putchar(nghinle);
lcd_putchar(tramle);
lcd_putchar(chucle);
lcd_putchar(donvile);
}
void hienthi_do(char nhiet)
{
nhiet+=0x30;
lcd_putchar(nhiet);
}
void lcd_putsf(char *s)
{
while(*s)
{
lcd_putchar(*s);
s++;
};
}
//****************************ham khoi tao lcd*************************
void lcd_init()
{
delay_cycles(100);
P1OUT&=~RS; // che do gui lenh
set_data_lsb(0x03);
enable();
enable();
enable();
set_data_lsb(0x02);
enable();
ghilenh ( 0x28 ); //cd 4bit,2dong,5x7
ghilenh( 0x0c); //bat hien thi,tat con tro
ghilenh ( 0x06 ); //* entry mode set, increment & scroll left
ghilenh ( 0x01 ); //* clear display
}
//************************************************
//**************************************************
void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//P1_dir->_byte=0xff; //port1 la dau ra
//P2_dir->_bit.b0=0; //bit 0 cua port2 la dau vao
//sw=1; //set muc logic cua dau vao len 1