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);
}
{
while(--t);
}
void delay_ms(unsigned char t)
{
while(t--)
{
delay_us(245);
delay_us(245);
}
}
{
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);
}
}
{
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;
#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;
}
{
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);
}
{
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);
}
{
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++;
}
}
{
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"
#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++);
}
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++);}
}
{
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;
}
{
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);
}
{
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);
}
}
{
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);
}
}