dht11模块的学习

    dht11传感器是用来测温湿度的传感器。dht模块价格相对便宜(一般在4、5元左右),所以测温湿精度性不高,温度精度大概在+-4之间,湿度精度大概在+-1之间,如果这是学习之用还是可以的。

    我看过dth11的中文资料,它工作在3-5.5v,传输数据采用的是单总线,一次完整的数据传输有40bit,分别为温度整数部分+温度小数部分+湿度整数部分+湿度小数部分+8bit校验位;但在调试程序的过程中,我发现温度与湿度的小数部分一直显示00,我于是用逻辑分析仪进行了检测,发现的确是00。我以为程序错误,就找了度娘,结果看到dth11分辨率只到个位。也就是说硬件不支持(可能是太便宜了,那设计小数部分有什么意义???不理解)

下面附上dth11加1602显示的程序

delay库函数

void delay_us(unsigned char t)
{
    while(--t);
}

void delay_ms(unsigned char t)
{
    while(t--)
   {
      delay_us(245);
      delay_us(245);
   }
}

void delay_s(unsigned char t)
{
   while(t--)
  {
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
   delay_ms(200);
  }
}

lcd1602库函数

#include <reg52.h>
#include "./delay/delay.h"
#include "./lcd/lcd.h"
#define LCDPORT P0
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;

void lcd_write(unsigned char byte, unsigned char flag)
{
 if(flag)
 {
  RS = 1;
 }
 else
 {
  RS = 0;
 }
 RW = 0;
 E = 1;
 LCDPORT = byte;
 delay_us(5);
 E = 0;
}

void lcd_init()
{
 delay_ms(15);
 lcd_write(0x38, LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x38, LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x38, LCD_WRITE_COM);
 lcd_write(0x08, LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x01, LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x06, LCD_WRITE_COM);
 delay_ms(5);
 lcd_write(0x0c, LCD_WRITE_COM);
 delay_ms(5);
}

void lcd_dis_char(unsigned char x, unsigned char y, unsigned char byte)
{
 unsigned char m;
 if(y==1)
 {
  m = 0x00+0x80+x;
 }
 if(y==2)
 {
  m = 0x40+0x80+x;
 }
 lcd_write(m,LCD_WRITE_COM);
 lcd_write(byte,LCD_WRITE_DATA);
}

void lcd_dis_string(unsigned x, unsigned char y, unsigned char * s)
{
 unsigned char m;
 unsigned char i = 0;
 unsigned char *temp = s;
 if(y==1)
 {
  m=0x00+0x80+x;
 }
 if(y==2)
 {
  m=0x40+0x80+x;
 }
 while(*temp != '\0')
 {
  lcd_write(m+i,LCD_WRITE_COM);
  lcd_write(*temp,LCD_WRITE_DATA);
  temp++;
  i++;
 }
}

主程序

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "./lcd/lcd.h"

sbit  dht_dat  = P2^0;
unsigned char dht_t1=0,dht_t2=0;
unsigned char dht_d1=0,dht_d2=0;
unsigned char dht_chk=0;
unsigned char dht_num=0;
unsigned char temp[7];
unsigned char humitiy[7];
void dht_delay_10us()
{
 unsigned char i=0;
 for(i=0;i<1;i++);
}

void dht_delay_10ms(unsigned char t)
{
 unsigned char i=0,j=0,k=0;
 for(i=0;i<t;i++)
 {
  for(j=0;j<40;j++)
  for(k=0;k<75;k++);}
}

void dht_init()
{
 dht_delay_10ms(100);
}
unsigned char dht_readat()
{
 unsigned char i=0,dat=0;
 for(i=0;i<8;i++)
 {
  dht_num=2;
  while((dht_dat==0)&&(dht_num++));
  dht_delay_10us();
  dht_delay_10us();
  dht_delay_10us();
  dht_delay_10us();
  dat=dat<<1;
  if(dht_dat==1)
  {
   dht_num=2;
   dat=dat|0x01;
   while((dht_dat==1)&&(dht_num++));
  }
 }
 return dat;
}

void dht_getdat()

 dht_dat=0;
 dht_delay_10ms(4);
 dht_dat=1;
 dht_delay_10us();
 dht_delay_10us();
 dht_delay_10us();
 dht_delay_10us();
 dht_dat=1;
 if(dht_dat==0)
 {
  dht_num=2;
  while((dht_dat==0)&&(dht_num++));
  dht_num=2;while((dht_dat==1)&&(dht_num++));
  dht_d1=dht_readat();
  dht_d2=dht_readat();
  dht_t1=dht_readat();
  dht_t2=dht_readat();
  dht_chk=dht_readat();
 }
 dht_dat=1;
 dht_delay_10ms(10);
}

void main()
{
 lcd_init();
 dht_init();
 while(1)
 {
  dht_getdat();
  humitiy[0] = dht_d1/10+0x30;
  humitiy[1] = dht_d1%10+0x30;
  temp[0] = dht_t1/10+0x30;
  temp[1] = dht_t1%10+0x30;
  lcd_dis_string(8,2,humitiy);
  lcd_dis_string(8,1,temp);
 }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_26654257

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值