DHT11温湿度传感器在51单片机的应用
DHT11数据接口据传输方式
- DHT11使用单数据线传输同步半双工,将记录的温湿度以二进制记录记录误差不超过2度,在接收到主机信号后将发送5组8bit数据:湿度整数位数据+湿度小数位数据+温度整数位+温度小数位+校验位数据。校验位数据=湿度整数位数据+湿度小数位数据+温度整数位+温度小数位用来校验数据准确性。
- 具体长这样
- 挂载方法
- 因为只有一根数据线传输所以一旦主机发送信号DHT11就要严格按照时间来向主机发送数据(因为这个破规定我调试半天程序才知道时因为延迟函数写错了导致程序卡住)。
传输流程
- 上电等待一秒DHT11采集数据
- 主机发送开始信号(告诉DHT11可以传输数据了):主机拉低电平至少18ms,后拉高电平20—40us。
- 接收到开始信号发送应答后开始传输信号:DHT11接管数据线,先拉底电平80us再拉高电平80us开始传输数据
- DHT11结束传输数据:在最后一位数据传输完成后拉低电平50us,后释放数据线在上拉电阻影响下回归高电平状态。
- 流程图:
在51单片机中的应用
- 将电源接在+5v电压和ged上将数据接口接在51单片机P37接口上。
#include <REGX52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P3^7;
uchar rec_dat[4];
void delay_us(uchar n)
{
while(--n);
}
void delay_ms(uint n)
{
uint i,j=110;
for(i=n;i>0;i--){while(j--);}
}
void DHT11_start()//主机发送开始信号
{
Data=1;
delay_us(2);
Data=0;
delay_ms(20);
Data=1;
delay_us(30);
}
uchar DHT11_rec_byte() //接送一组8bit数据
{
uchar i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); //等待50us低电平过去
delay_us(10); //延时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)//DHT11拉低电平响应
{
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]=RH%256;
rec_dat[1]=RH/256;
rec_dat[2]=TH%256;
rec_dat[3]=TH/256;
}
}
以上为个人学习笔记记录欢迎大家一起交流