dht11是一款有已校准数字信号输出的温湿度传感器。 精度湿度+-5%rh, 温度+-2℃,量程湿度20-90%rh, 温度0~50℃。
dht11与单片机电路连接分析
1.引脚图
2.dht11与单片机连接接线图
dht11 器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。单总线通常要求外接一个约 5.1kω 的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结极,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。
dht11数据采集分析
1.数据总时序
用户主机(mcu)发送一次开始信号后,dht11 从低功耗模式转换到高速模式,待主机开始信号结束后,dht11 发送响应信号,送出 40bit 的数据,幵触发一次信采集
2.主机发送起始信号
单片机连接dht11的data引脚的i/o口输出低电平,且低电平保持时间不能小于 18ms,然后等待 dht11 作出应答信号。
3.检测从机应答信号
dht11 的 data 引脚检测到外部信号有低电平时, 等待外部信号低电平结束, 延迟后 dht11 的 data引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据。
4.接收数据
(1)数据判定规则
位数据“0”的格式为: 50 微秒的低电平和 26-28 微秒的高电平,位数据“1”的格式为: 50 微秒的低电平加 70微秒的高电平。
接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。
(2)数据格式
一次传送 40 位数据,高位先出
8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据+8bit 校验位。
(3)数据校正
判断“8bit 湿度整数数据 + 8bit 湿度小数数据+8bit 温度整数数据 + 8bit 温度小数数据”的结果是否等于8bit 校验位。如果等于则数据接收正确,否则应该放弃这一次的数据,重新接收。
驱动程序
#include《reg51.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit data=p3^6; //定义数据线
uchar rec_dat[9]; //用于显示的接收数据数组
void dht11_delay_us(uchar n)
{
while(--n);
}
void dht11_delay_ms(uint z)
{
uint i,j;
for(i=z;i》0;i--)
for(j=110;j》0;j--);
}
void dht11_start()
{
data=1;
dht11_delay_us(2);
data=0;
dht11_delay_ms(20); //延时18ms以上
data=1;
dht11_delay_us(30);
}
uchar dht11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i《8;i++) //从高到低依次接收8位数据
{
while(!data); ////等待50us低电平过去
dht11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat《《=1; //移位使正确接收8位数据,数据为0时直接移位
if(data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(data); //等待数据线拉低
}
return dat;
}
void dht11_receive() //接收40位的数据
{
uchar r_h,r_l,t_h,t_l,rh,rl,th,tl,revise;
dht11_start();
if(data==0)
{
while(data==0); //等待拉高
dht11_delay_us(40); //拉高后延时80us
r_h=dht11_rec_byte(); //接收湿度高八位
r_l=dht11_rec_byte(); //接收湿度低八位
t_h=dht11_rec_byte(); //接收温度高八位
t_l=dht11_rec_byte(); //接收温度低八位
revise=dht11_rec_byte(); //接收校正位
dht11_delay_us(25); //结束
if((r_h+r_l+t_h+t_l)==revise) //校正
{
rh=r_h;
rl=r_l;
th=t_h;
tl=t_l;
}
/*数据处理,方便显示*/
rec_dat[0]=‘0’+(rh/10);
rec_dat[1]=‘0’+(rh%10);
rec_dat[2]=‘r’;
rec_dat[3]=‘h’;
rec_dat[4]=‘ ’;
rec_dat[5]=‘ ’;
rec_dat[6]=‘0’+(th/10);
rec_dat[7]=‘0’+(th%10);
rec_dat[8]=‘c’;
}
}
/*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/
void main()
{
uchar i;
lcd_init(); //lcd1602初始化
while(1)
{
dht11_delay_ms(1500); //dht11上电后要等待1s以越过不稳定状态在此期间不能发送任何指令
dht11_receive();
lcd_write_command(0x80); //从lcd1602第一行第一个位置开始显示
for(i=0;i《9;i++)
lcd_write_data(rec_dat[i]); //显示数据
}
}
用AR技术破案 荷兰警察会玩
机器视觉农业应用 有助于释放精准农业的全部潜力
澳大利亚主要媒体公司达成Google新闻付费协议
五大智能手机系统PK Android短时间内的崛起
python如何保留一位小数
dht11与单片机连接图
以爱赋能 爱普生全面助力中国家庭教育
怎么样才能使小间距LED显示屏不在黑屏
中国电信与六分科技进行战略投资将共同推动5G产业开放合作
水肥灌溉控制系统功能与优势
特斯拉model 3 产能释放好消息,瓶颈消除产量剧增
谷景揭秘绕线共模电感线圈损伤了会影响使用吗
MS4988B—16 微细分步进电机驱动器
镀层测厚仪仪器试验步骤
乐视Max2评测 强大的内容资源整合
诺基亚官微正式发布新机:Nokia 6!京东首发
作为协作机器人 优傲机器人被用于多种行业
电力采集终端判断电流骤降告警的机制
运动手环眼花缭乱不知如何选择?盘点6款好用不贵手环盘点
小米年底清仓: 这些已经降到冰点了你还不动手?