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

đồ án vi xử lý điều khiển nhiệt độ độ ẩm

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 (750.12 KB, 42 trang )

II. phần cứng
1. Mạch nguyên ly

2. Các khối trong mạch
• Khối xử lý trung tâm




Khối nguồn

Tạo điện áp chuẩn 5V cho vi điều khiển. D1 tạo điện áp 1 chiều, các bộ tụ C1,
C2 để san phẳng và làm ổn định điện áp ra cho vi điều khiển.




Khối đo độ ẩm

HS1101 là cảm biến điện dung. Khi độ ẩm thay đổi, điện dung của HS1101 thay đổi. Do
vậy, để đo được độ ẩm người ta thiết kế mạch đo điện dung của HS1101.
Trong thực tế, người ta thường ghép nối HS1101 và IC NE555. Khi đó giá trị điện dung
của HS1101 thay đổi thì làm thay đổi tần số đầu ra của IC555. Như vậy chỉ cần đo tần số
đầu ra là có thể đo được điện dung của HS1101.


Khối đo nhiệt độ





Khối role

Khi t mở. Chân tiếp điểm kéo xuống đất. Vcc mức 1, tạo ra sự chênh áp.
• Khối hiển thị LCD




Khối reset




Khối dao động



Khối nút nhấn


III.tìm hiểu về các linh kiện được sử dụng
Trong mạch đo nhiệt độ và độ ẩm dùng cảm biến nhiệt độ DS18B20 và cảm biến điện
dung HS1101 hiển thị ra màn hình LCD ta cần sử dụng các linh kiện sau:
………….
1. Vi điều khiển 89S52
a. Hình ảnh


a. Cấu tạo và chức năng các chân trên 89s52


AT89S52 có tất cả 40 chân có chức năng như các đường xuất nhập. Trong
đó có 24 chân có tác dụng kép (có nghĩa là 1 chân có 2 chức năng), mỗi đường
có thể hoạt động như đường xuất nhập hoặc như đường điều khiển hoặc là
thành phần của các bus dữ liệu và bus địa chỉ.
* PORT
Port 0: là port có 2 chức năng ở các chân từ 32- 39. Trong các thiết kế cỡ nhỏ
không dùng đến bộ nhớ mở rộng thì port 0 có chức năng là xuất/nhập dữ liệu.
Nếu trong các thiết kế cỡ lớn phải dùng đến bộ nhớ mở rộng thì port 0 được
kết hợp giữa bus địa chỉ và bus dữ liệu.
Port 1: là port có 1 chức năng từ chân 1- 8. Có thể dùng cho giao tiếp với thiết
bị ngoài nếu cần. Vì không có chức năng khác ngoài xuất/nhập nên nó chỉ
được dùng giao tiếp với các thiết bị bên ngoài.
Port 2: là 1 port có tác dụng kép trên các chân 21- 28 được dùng như các
đường xuất nhập hoặc là byte cao của các bus địa chỉ đối với thiết bị dùng bộ
nhớ mở rộng.
Port3: là port có tác dụng kép trên các chân 10- 17, port này có nhiều chức
năng cụ thể như sau:


P3.0

RXT

Ngõ vào đữ liệu nối tiếp

P3.1

TXD

Ngõ xuất dữ liệu nối tiếp


P3.2

INT0

Ngõ vào ngắt 0

P3.3

INT1

Ngõ vào ngắt 1

P3.4

T0

Ngõ vào của timer/ couter 0

P3.5

T1

Ngõ vào của timer/ couter 1

P3.6

WR

Tín hiệu ghi dữ liệu lên bộ nhớ ngoài


P3.7

RD

Tín hiệu đọc dữ liệu bộ nhớ ngoài

* các ngõ tín hiệu điều khiển
PSEN
PSEN là tín hiệu ngõ ra ở chân 29 có ứng dụng cho phép đọc bộ nhớ
chương trình mở rộng thường được nối với chân 0E( output ennable) của
EPROM cho phép đọc các byte mã lệnh. PSEN ở mức 0 khi 89s52 lấy lệnh,
các mã lệnh của chương trình đọc từ EPROM qua bus dữ liệu và được chốt vào
thanh ghi lệnh để giải lệnh. PSEN ở mức 1 khi 89s52 thi hành chhuowng trình
trong ROM nội.
ALE
ALE ở chân số 30 dùng làm tín hiệu điều khiển để giải đa hợp các đường
địa chỉ và dữ liệu khi kết nối chúng với IC chốt. Vì khi 89s52 truy xuất bộ nhớ
bên ngoài port 0 có chức năng là đường địa chỉ và dữ liệu nên phải tách riêng
ra.
Tín hiệu ra ở chân ALE là một xung trong khoảng thời gian port 0 đóng vai
trò là địa chỉ thấp nên chốt địa chỉ hoàn toàn tự động.
EA
Ngõ tín hiệu vào EA ở chân 31 thường được mắc lên nguồn. Nếu ở mức 1
thì 89s52 thi hành chương trình từ ROM nội trong khaongr địa chỉ thấp
8kbyte. Nếu ở mức 0 thì 89s52 sẽ thi hành chương trình từ bộ nhớ mở rộng.
RST
Ngõ tín hiệu RST (reset) ở chân số 9. Khi 89s52 thực hiện 2 chu kỳ máy
hoặc khi cấp điện mạch tự động reset.
X1,X2

Ngõ tín hiệu dao động X1, X2 ở chân 18, 19. Thường được nối với thạch
anh để tạo dao động.
Vcc
Vcc là chân số 40, thường được nối lên nguồn 5V.
2. Cảm biến nhiệt độ DS18B20


a. Hình ảnh

DS18B20 là IC cảm biến nhiệt độ chỉ bao gồm 3 chân, đóng gói dạng TO-92
b. Cấu tạo


DS18B20 gồm 3 chân Vcc, GND, DATA.
Sơ đồ kết nối:

c. Đặc tính kỹ thuật

+ Lấy nhiệt độ theo giao thức 1 dây (1wire)
+ Cung cấp nhiệt độ với độ phân giải config 9,10,11,12 bit, tùy theo sử dụng.
Trong trường hợp không config thì nó tự động ở chế độ 12 bit.
Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit
+Có thể đo nhiệt độ trong khoảng -55 -> +125°C. Với khoảng nhiệt độ là -10°C to
+85°C thì độ chính xác ±0.5°C,±0.25°C ,±0.125°C,±0.0625°C. theo số bít config.


+ Có chức năng cảnh báo nhiệt khi nhiệt độ vượt ngưỡng cho phép. Người dùng có
thể lập trình chức năng này cho DS18B20. Bộ nhớ nhiệt độ cảnh báo không bị mất
khi mất nguồn vì nó có một mã định danh duy nhất 64 bit chứa trong bộ nhớ ROM
trên chip (on chip), giá trị nhị phân được khắc bằng tia laze.

+ Cam bien nhiet do DS18B20 có mã nhận diện lên đến 64-bit, vì vậy bạn có thể
kiểm tra nhiệt độ với nhiều IC DS18B20 mà chỉ dùng 1 dây dẫn duy nhất để giao
tiếp với các IC này.
Với DS18B20 bạn hoàn toàn có thể tạo cho mình mạch cảm biến nhiệt độ theo y
muốn.
+ Điện áp sử dụng : 3 – 5.5 V
+ Dòng tiêu thụ tại chế độ nghỉ rất nhỏ.
d. Lập trình đo nhiệt độ với vi điều khiển 89s52
Khi xử ly DS18b20 chúng ta cần quan tâm đến 2 nhóm lệnh sau:
+ nhóm lệnh truy cập ROM
+ nhóm lệnh chức năng bộ nhớ
• Nhóm lệnh truy cập ROM
- READ ROM (33h)
Cho phép đọc ra 8 byte mã đã khắc bằng laser trên ROM, bao gồm: 8
bit mã định tên linh kiện (10h), 48 bit số xuất xưởng, 8 bit kiểm tra
CRC. Lệnh này chỉ dùng khi trên bus có 1 cảm biến DS1820, nếu không
sẽ xảy ra xung đột trên bus do tất cả các thiết bị tớ cùng đáp ứng.
- MATCH ROM (55h)
Lệnh này được gửi đi cùng với 64 bit ROM tiếp theo, cho phép bộ điều
khiển bus chọn ra chỉ một cảm biến DS1820 cụ thể khi trên bus có
nhiều cảm biến DS1820 cùng nối vào. Chỉ có DS1820 nào có 64 bit trên
ROM trung khớp với chuỗi 64 bit vừa được gửi tới mới đáp ứng lại các
lệnh về bộ nhớ tiếp theo. Còn các cảm biến DS1820 có 64 bit ROM
không trùng khớp sẽ tiếp tục chờ một xung reset. Lệnh này được sử
dụng cả trong trường hợp có một cảm biến một dây, cả trong trường hợp
có nhiều cảm biến một dây.
- SKIP ROM (CCh)
Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ
nhớ của DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ
tiết kiệm được thời gian chờ đợi nhưng chỉ mang hiệu quả khi trên bú

chỉ có một cảm biến.
- SEARCH ROM (F0h)
Lệnh này cho phép bộ điều khiển bus có thể dò tìm được số lượng thành
viên tớ đang được đấu vào bus và các giá trị cụ thể trong 64 bit ROM
của chúng bằng một chu trình dò tìm.
- ALARM SEARCH (ECh)


Tiến trình của lệnh này giống hệt như lệnh Search ROM, nhưng cảm
biến DS1820 chỉ đáp ứng lệnh này khi xuất hiện điều kiện cảnh báo
trong phép đo nhiệt độ cuối cùng. Điều kiện cảnh báo ở đây được định
nghĩa là giá trị nhiệt độ đo được lớn hơn giá trị TH và nhỏ hơn giá trị
TL là hai giá trị nhiệt độ cao nhất và nhiệt độ thấp nhất đã được đặt trên
thanh ghi trong bộ nhớ của cảm biến.
Sau khi thiết bị chủ (thường là một vi điều khiển) sử dụng các lệnh
ROM để định địa chỉ cho các cảm biến một dây đang được đấu vào bus,
thiết bị chủ sẽ đưa ra các lệnh chức năng DS1820. Bằng các lệnh chức
năng thiết bị chủ có thể đọc ra và ghi vào bộ nhớ nháp (scratchpath) của
cảm biến DS1820. khởi tạo quá trình chuyển đổi giá trị nhiệt độ đo được
và xác định chế độ cung cấp điện áp nguồn. Các lệnh chức năng có thể
được mô tả ngắn gọn như sau:
- WRITE SCRATCHPAD (4Eh)
Lệnh này cho phép ghi 2 byte dữ liệu vào bộ nhớ nháp của DS1820.
Byte đầu tiên được ghi vào thanh ghi TH (byte 2 của bộ nhớ nháp) còn
byte thứ hai được ghi vào thanh ghi TL (byte 3 của bộ nhớ nháp). Dữ
liệu truyền theo trình tự đầu tiên là bit có y nghĩa nhất và kế tiếp là
những bit có y nghĩa giảm dần. Cả hai byte này phải được ghi trước khi
thiết bị chủ xuất ra một xung reset hoặc khi có dữ liệu khác xuất hiện.
- READ SCRATCHPAD (BEh)
Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá trình

đọc bắt đầu từ bit có y nghĩa nhấy của byte 0 và tiếp tục cho đến byte
rhứ 9 (byte 8 – CRC). Thiết bị chủ có thể xuất ra một xung reset để làm
dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệu
trên bộ nhớ nháp cần được đọc.
- COPYSCRATCHPAD (48h)
Lệnh này copy nội dung của hai thanh ghi TH và TL (byte 2 và byte 3)
vào bộ nhớ EEPROM. Nếu cảm biến được sử dụng trong chế dộ cấp
nguồn l bắt đầu việc đo.
- CONVERT T (44h)
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ
thành số (nhị phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được
lưu trữ trên thanh ghi nhiệt độ 2 byte trong bộ nhớ nháp Thời gian
chuyển đổi không quá 200 ms, trong thời gian đang chuyển đổi nếu thực
hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- READ POWER SUPPLY (B4h)
Một lệnh đọc tiếp sau lệnh này sẽ cho biết DS1820 đang sử dụng chế độ
cấp nguồn như thế nào, giá trị đọc được bằng 0 nếu cấp nguồn bằng


chính đường dẫn dữ liệu và bằng 1 nếu cấp nguồn qua một đường dẫn
riêng.
• Nhóm lệnh chức năng bộ nhơ
Để xử ly được nhiệt độ được từ DS18B20 chúng ta cần quan tâm đến
hàm :
-float ds18b20_readtemp(void): Đây là hàm giúp các bạn tính toán và
trả về giá trị nhiệt độ mà DS18b20 đo được
Chúng ta có hàm đọc nhiệt độ
float ds18b20_readtemp(void)
{
float temp;

unsigned char a,b;
DS18B20_Init();
// Khoi tao DS18b20
ds18b20_writebyte(0xCC) ; // Cho phep VDK truy cap thang den cac
lenh bo nho cua DS18b20
ds18b20_writebyte(0x44) ; // Khoi dong qua trinh do va chuyen doi nhiet
do ra so nhi phan
DS18B20_Init() ;
ds18b20_writebyte(0xCC) ;
ds18b20_writebyte(0xBE) ;
// Cho phep doc du lieu tu bo nho
DS18b20 ra ngoai
a = ds18b20_readbyte();
temp=((float)(a&0x0f))/16;
// Lay phan thuc cua gia tri nhiet do
b = ds18b20_readbyte();
a =((a&0xf0)>>4)|((b&0x0f)<<4) ; // Lay phan nguyen cua gia tri nhiet
do
temp=temp+a;
return temp;
}
Chúng ta có hàm main đo nhiệt độ:
#include <main.h>
void main()
{
float Nhiet_Do;
unsigned char Lcd_Buff[15];
lcd1602_init();

// Tra ve gia tri nhiet do



lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts(" WELLCOM TO..! ");
lcd1602_gotoxy(0,1);
lcd1602_puts(" nhom9 ");
delay_ms(2000);
lcd1602_clear();
lcd1602_gotoxy(0,0);
lcd1602_puts(" D5CNTD");
while(1)
{
Nhiet_Do = ds18b20_readtemp();
sprintf(Lcd_Buff," TEMP: %2.2f^C",Nhiet_Do);
lcd1602_gotoxy(0,1);
lcd1602_puts(Lcd_Buff);
delay_ms(300);
}
}
3.

Cảm biến độ ẩm HS1101
a. Hình ảnh

b.

HS1101 là loại cảm biến đo độ ẩm. Độ chính xác +-2%. Dãy nhiệt độ hoạt
động từ -400C à 1000C. Cảm biến HS1101 được sử dụng phổ biến trong cuộc
sống, ngoài ra nó còn dùng kết hợp với cảm biến DS18B20 dùng đo nhiệt độ.

Nguyên ly làm việc


Cảm biến HS1101 là cảm biến điện dung. Khi độ ẩm thay đổi, điện dung
của HS1101 thay đổi. Do vậy, để đo được độ ẩm người ta thiết kế mạch đo
điện dung của HS1101.
Trong thực tế, người ta thường ghép nối HS1101 và IC NE555. Khi đó giá
trị điện dung của HS1101 thay đổi thì làm thay đổi tần số đầu ra của IC555.
Như vậy chỉ cần đo tần số đầu ra là có thể đo được điện dung của HS1101.
Sơ đồ ghép nối HS1101 với NE555

c.

Cách thức đo độ ẩm
Ta có công thức tính tần số như sau :
d.

(1)

Trong đó:
oF là tần số
oC@%RH: độ ẩm
oR2 = 576K, R4 = 49.9k
Ta có công thức liên hệ giữa độ ẩm và điện dung:
(2)
Trong đó:
oC@55% = 180pF ( tài liệu của hãng )
oC(pf) chính là điện dung đo được.



Từ (1) và (2) ta có mỗi liên hệ giữa tần số và độ ẩm
Giải pháp tính toán:
Ta thấy hàm độ ẩm là hàm mũ 3, nên rất khó tính toán mối liên hệ F và RH.
Ta thấy hàm C(pf) là hàm đồng biến với RH. Do vậy ta F sẽ nghịch biến với
RH. Từ đó ta có phương pháp tính độ ẩm bằng phương pháp tra bảng
Ta dùng bảng Excel như bảng 1, tạo mối quan hệ RH và F, ta thu được bảng.
F[100] = {7410;7392;….;6019}. Mảng này có 100 phần tử tương đương với độ
ẩm từ 0-100%
Như vậy, khi ta đo được tần số F, ta chọn F>=F và sát nhất với F.
Khi đó Độ ẩm RH =i%.
Bảng 1: Bảng tính giá trị độ ẩm qua tần số.

4. Hiển thị LCD
a. Hình ảnh


b. Cấu tạo và các chức năng

- Chân vcc, Vss,VEE: Cấp dương nguồn - 5v và đất tương ứng thì V EE được dùng để

điều khiển độ tương phản của LCD.


- Chân chọn thanh ghi RS: Có hai thanh ghi rất quan trọng bên trong LCD, chân RS

được dùng để chọn các thanh ghi này như sau: Nếu RS = 0 thì thanh ghi mà lệnh được
chọn để cho phép người dùng gửi một lệnh chẳng hạn như xoá màn hình, đưa con trỏ về
đầu dòng v.v... Nếu RS = 1 thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ
liệu cần hiển thị trên LCD.
- Chân W/R: Đầu vào đọc/ ghi cho phép người dùng ghi thông tin lên LCD khi R/W =


0 hoặc đọc thông tin từ nó khi R/W = 1.
- Chân cho phép E: Chân cho phép E được sử dụng bởi LCD để chốt thông tin hiện
hữu trên chân dữ liệu của nó. Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức
cao xuống thấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liêu.
Xung này phải rộng tối thiểu là 450ns.
- Chân D0-D7: Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc
đọc nội dung của các thanh ghi trong LCD.
Để hiển thị các chữ cái và các con số, chúng ta gửi các mã ASCII của các chữ cái
từ A đến z, a đến f và các con số từ 0 - 9 đến các chân này khi bật RS = 1.
Cũng có các mã lệnh mà có thể được gửi đến LCD để xoá màn hình hoặc đưa con
trỏ về đầu dòng hoặc nhấp nháy con trỏ. Bảng h1sau liệt kê các mã lênh.
Chúng ta cũng sử dụng RS = 0 để kiểm tra bít cờ bận để xem LCD có sẵn sàne
nhân thông tin. Cờ bận là D7 và có thể được đọc khi R/W = 1 và RS = 0 như sau:
Nếu R/W = 1, RS = 0 khi D7 = 1 (cờ bận 1) thì LCD bận bởi các công việc bên
trong và sẽ không nhận bất kỳ thông tin mới nào. Khi D7 = 0 thì LCD sẵn sàng nhận
thông tin mới. Lưu y chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ liệu nào lên
LCD.
5. Role

III- phần mềm
1. Code lập trình cho mạch

* Ten Tep

:

Code.c



* Tac Gia

:

* Phien Ban :
* Ngay

:

tran van nam
V1.0.0
10-10-2013

*/
#include <REGX52.H>
#include <stdio.h>
//Dinh nghia LCD
#define LINE_1 0x80
#define LINE_2 0xC0
#define CLEAR_LCD 0x01

//Dinh nghia chan su dung giao tiep LCD
sbit LCD_D4 = P2^4;
sbit LCD_D5 = P2^5;
sbit LCD_D6 = P2^6;


sbit LCD_D7 = P2^7;
sbit LCD_E = P2^2;
sbit LCD_RW = P2^1;

sbit LCD_RS = P2^0;

//Dinh nghia chan du lieu ds18b20
sbit DQ = P1^0 ;
//Dinh nghia chan su dung
sbit relay = P3^7;
sbit sw1 = P0^0;
sbit sw2 = P0^1;

//Ham tre thoi gian
void delay_ms(unsigned int Time)
{


unsigned int i,j,t;
t=Time;
for(i=0;i{
for(j=0;j<125;j++);
}
}

void delay_us(unsigned int Time)
{
unsigned int i,j;
for(i=0;i{
for(j=0;j<2;j++);
}



}
// Ham tao xung ENABLE
void lcd1602_enable(void)
{
LCD_E=1;
delay_us(3);
LCD_E=0;
delay_us(5);
}
// -------------------------------------------------// Ham Gui 4 Bit Du Lieu Ra LCD
void lcd1602_send_4bit_data ( unsigned char cX )
{
LCD_D4 = cX & 0x01;
LCD_D5 = (cX>>1)&1;


LCD_D6 = (cX>>2)&1;
LCD_D7 = (cX>>3)&1;
}

// -------------------------------------------------// Ham Gui 1 Lenh Cho LCD
void lcd1602_send_command (unsigned char cX )
{
lcd1602_send_4bit_data ( cX >>4 );

// gui 4 bit cao

lcd1602_enable() ;
lcd1602_send_4bit_data ( cX );

lcd1602_enable() ;
}

// --------------------------------------------------

// gui 4 bit thap


// Ham Khoi Tao LCD
void lcd1602_init ( void )
{
lcd1602_send_4bit_data ( 0x00 );
delay_ms(200);

LCD_RS=0;
LCD_RW=0;
LCD_E=0;
// che do gui lenh

lcd1602_send_4bit_data ( 0x03 );

// ket noi 8 bit

lcd1602_enable() ;
lcd1602_enable () ;
lcd1602_enable () ;
lcd1602_send_4bit_data ( 0x02 );

// ket noi 4 bit



×