|
注册好几天了,都没有审核通过,难道要先发个帖子才行?
最近在做温湿度采集系统方面的东西,别的不说,就说说温湿度传感器这块,测温度想必不用多说了,坛子里的人_大部分都用过18B20,可以精确到0.1度,而要测湿度就没那么容易了,18B20之所以好用,是因为它是数字器件,不需要配合测量电路就可以完成测量任务,而现在市场上的大部分湿度传感器要么是湿敏电阻、半导体湿敏传感器,要么就是电容式的湿度传感器,这些都要和外围电路配合使用。
国产的DHT11温湿度传感器是数字式器件,测量范围:湿度20-90%RH,温度0-50℃,精度:湿度±5%RH,温度±2℃,分辨率:1,可见,对于一般性的应用领域还是可以满足要求的,最主要的是价格才7元左右。
下面是我调通的DHT11代码,用的是Mega8,供大家参考
DHT11.h
#ifndef __DHT11_h__
#define __DHT11_h__
unsigned char get_DHT11_value(void);
//get_DHT11_value()的返回值为0表示出错(DHT11未连接或损坏)
//temperature存储温度,高8位为温度整数部分,低8位保留为0
//humidity存储湿度,高8位为湿度整数部分,低8位保留为0
#endif
DHT11.c
#include "DHT11.h"
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define DATA_DIR_OUTPUT DDRC|=BIT(PC0)
#define DATA_DIR_INPUT DDRC&=~BIT(PC0)
#define DATA_H PORTC|=BIT(PC0)
#define DATA_L PORTC&=~BIT(PC0)
#define DATA_IN ((PINC & BIT(PC0)) >> PC0)
#define delay_30_ms() delay_ms(30)
#define delay_30_us() delay_10us(3)
#define delay_10_us() delay_10us(1)
unsigned int temperature;
unsigned int humidity;
unsigned char get_DHT11_value(void)
{
unsigned int bit;
unsigned char p=0,time_count;
temperature=0x0000;
humidity=0x0000;
bit=0x8000;
DATA_L;
DATA_DIR_OUTPUT;
delay_30_ms();
DATA_H;
DATA_DIR_INPUT;
delay_30_us();
delay_30_us();
//无应答信号,退出
if(DATA_IN!=0) return 0;
//等待电平变高,设置200us超时控制
time_count=0;
while(DATA_IN==0)
{
delay_10_us();
if(++time_count==20) return 0;
}
//等待电平变低,设置150us超时控制
time_count=0;
while(DATA_IN==1)
{
delay_10_us();
if(++time_count==15) return 0;
}
//数据开始
while(p!=2)
{
//低电平宽度50us
//等待电平变高,设置100us超时控制
time_count=0;
while(DATA_IN==0)
{
delay_10_us();
if(++time_count==10) return 0;
}
time_count=0;
do
{
delay_10_us();
time_count++;
if(time_count==10) return 0;
}while(DATA_IN==1);
//若高电平超过50us,说明数据位为1,否则为0
if(time_count>=5)
{
if(p==0) humidity|=bit;
if(p==1) temperature|=bit;
}
bit>>=1;
//1字节结束
if(bit==0x0000)
{
p++;
bit=0x8000;
}
}
return 1;
}
使用的时候只要修改DHT11.c里面的有关接口DATA的宏定义,以及3个delay函数就可以了。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|