Wednesday, 28 November 2018

Giao Tiếp Cảm Biến Nhiệt Độ - Độ Ẩm DHT11

Giới thiệu

DHT11 là một cảm biến nhiệt độ và độ ẩm kỹ thuật số dây duy nhất, cung cấp giá trị độ ẩm và nhiệt độ serially.
Nó có thể đo độ ẩm tương đối theo tỷ lệ phần trăm (20 đến 90% RH) và nhiệt độ trong độ C trong khoảng từ 0 đến 50 ° C.
Nó có 4 chân trong đó 2 chân được sử dụng để cung cấp, 1 chân không được sử dụng và cái cuối cùng được sử dụng cho dữ liệu.
Dữ liệu là pin duy nhất được sử dụng để liên lạc. Các xung của TON và TOFF khác nhau được giải mã dưới dạng logic 1 hoặc logic 0 hoặc bắt đầu xung hoặc kết thúc của khung.
Để biết thêm thông tin về cảm biến DHT11 và cách sử dụng nó, hãy tham khảo thêm trên mạng!
Cảm biến DHT11
Cảm biến DHT11

Sơ đồ mạch


Giao diện cảm biến DHT11 với 8051.

  • Sơ đồ mạch trên cho thấy interfacing của 8.051 với cảm biến DHT11.
  • Trong đó, một cảm biến DHT11 được kết nối với P2.1 (Pin No 22) của bộ vi điều khiển.
Các bước lập trình
  • Đầu tiên, khởi tạo thư viện LCD16x2_4bit.h.
  • Xác định ghim không. để giao diện cảm biến DHT11, trong chương trình của chúng tôi, chúng tôi định nghĩa P2.1 (Ghim số 22)
  • Gửi xung bắt đầu cho cảm biến DHT11 bằng cách làm cho thấp đến cao trên pin dữ liệu.
  • Nhận xung phản hồi từ cảm biến DHT11.
  • Sau khi nhận được phản hồi, nhận dữ liệu 40 bit serially từ cảm biến DHT11.
  • Hiển thị dữ liệu nhận được này trên LCD16x2 cùng với chỉ báo lỗi.

Chương trình


#include<reg51.h>
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include "LCD16x2_4bit.h"

sbit DHT11=P2^1;  /* Connect DHT11 output Pin to P2.1 Pin */
int I_RH,D_RH,I_Temp,D_Temp,CheckSum; 

void timer_delay20ms()  /* Timer0 delay function */
{
 TMOD = 0x01;
 TH0 = 0xB8;  /* Load higher 8-bit in TH0 */
 TL0 = 0x0C;  /* Load lower 8-bit in TL0 */
 TR0 = 1;  /* Start timer0 */
 while(TF0 == 0); /* Wait until timer0 flag set */
 TR0 = 0;  /* Stop timer0 */
 TF0 = 0;  /* Clear timer0 flag */
}

void timer_delay30us()  /* Timer0 delay function */
{
 TMOD = 0x01;  /* Timer0 mode1 (16-bit timer mode) */
 TH0 = 0xFF;  /* Load higher 8-bit in TH0 */
 TL0 = 0xF1;  /* Load lower 8-bit in TL0 */
 TR0 = 1;  /* Start timer0 */
 while(TF0 == 0); /* Wait until timer0 flag set */
 TR0 = 0;  /* Stop timer0 */
 TF0 = 0;  /* Clear timer0 flag */
}

void Request()   /* Microcontroller send request */
{
 DHT11 = 0;  /* set to low pin */
 timer_delay20ms(); /* wait for 20ms */
 DHT11 = 1;  /* set to high pin */
}

void Response()   /* Receive response from DHT11 */
{
 while(DHT11==1);
 while(DHT11==0);
 while(DHT11==1);
}

int Receive_data()  /* Receive data */
{
 int q,c=0; 
 for (q=0; q<8; q++)
 {
  while(DHT11==0);/* check received bit 0 or 1 */
  timer_delay30us();
  if(DHT11 == 1) /* If high pulse is greater than 30ms */
  c = (c<<1)|(0x01);/* Then its logic HIGH */
  else  /* otherwise its logic LOW */
  c = (c<<1);
  while(DHT11==1);
 }
 return c;
}

void main()
{
 unsigned char dat[20];
 LCD_Init();  /* initialize LCD */
 
 while(1)
 {  
  Request(); /* send start pulse */
  Response(); /* receive response */
  
  I_RH=Receive_data(); /* store first eight bit in I_RH */
  D_RH=Receive_data(); /* store next eight bit in D_RH */
  I_Temp=Receive_data(); /* store next eight bit in I_Temp */
  D_Temp=Receive_data(); /* store next eight bit in D_Temp */
  CheckSum=Receive_data();/* store next eight bit in CheckSum */

  if ((I_RH + D_RH + I_Temp + D_Temp) != CheckSum)
  {
   LCD_String_xy(0,0,"Error");
  }
  
  else
  {
   sprintf(dat,"Hum = %d.%d",I_RH,D_RH);
   LCD_String_xy(0,0,dat);
   sprintf(dat,"Tem = %d.%d",I_Temp,D_Temp);   
   LCD_String_xy(1,0,dat);
   LCD_Char(0xDF);
   LCD_String("C");
   memset(dat,0,20);
   sprintf(dat,"%d   ",CheckSum);
   LCD_String_xy(1,13,dat);
  }  
  delay(100);
 } 
}


Code mô phỏng
Tệp đính kèm



2 comments:

  1. code bi lỗi nhanp vào kelc ko dc



    ReplyDelete
  2. bạn có thể viết chương trình bằng code assembly k ạ,làm ơn giúp mình vớiiiii

    ReplyDelete