DHT11温湿度传感器驱动

DHT11:带有已校验数字信号输出的温湿度传感器,温度范围-20-60°,湿度5-95%,串行数据单总线

一、DHT11:通信时序

首先MCU产生起始信号,然后传感器产生一个应答信号,接着传感器产生40bit,即5个字节的数据,

用户可以接收这部分数据,采集结束MCU再拉高总线。

1、起始信号

 空闲时总线是高电平,主机将总线拉低至少18ms以上,再将总线拉高40us,然后主机转入接收状态等待应答信号

2、应答信号

从机接收到主机的开始信号后,等待40us后,拉低总线80us,再拉高总线80us表示应答信号,然后传输数据

3、数据信号

DHT11的0和1都是低电平开始,高电平结束。但是它们高电平的持续时间不同,逻辑0高电平持续26-28us,逻辑1高电平持续70us

二、读取DHT11的数据

一次完整的数据共40位,高位先行,数据由整数部分与小数部分组成

一共5个字节,前2个字节表示湿度整数与小数部分,接着2个字节表示温度的整数与小数部分,最后一个字节表示校验位。

校验位的值为前4个字节之和,用来校验数据的正确性

 

复制代码
uchar uchartemp,ucharcomdata,R_H_temp,R_L_temp,W_H_temp,W_L_temp,CHECK_temp
uchar ucharRH_data_H,ucharRH_data_L,ucharWH_data_H,ucharWH_data_L,ucharcheck_data
void COM(void)//读取一个字节的数据
{
 uchar i;
 for(i=0;i<8;i++)
{
 while(!DATA_PIN);
 Delay_10us;
 Delay_10us;
 Delay_10us;
 uchartemp=0;
 if(DATA_PIN)
 uchartemp=1;
 while(DATA_PIN);
 ucharcomdata<<1;
 ucharcomdata |=uchartemp;
}
}



void DHT11(void)
{
 P0DIR |=0x10;//将端口4设置为输出
 DATA_PIN=0;//输出低电平
 Delay_ms(19);//延时至少18ms
 DATA_PIN=1;
 Delay_10us();//延时40us,
 Delay_10us();
 Delay_10us();
 Delay_10us();
 P0DIR &= ~0x10//准备接收传感器的信号
 if(!DATA_PIN)
{
 while(!DATA_PIN);
 while(DATA_PIN);//接着传输40bit数据,也就是5个字节
 COM();
 R_H_temp=ucharcomdata;//读取第1个字节并保存
 COM();
 R_L_temp=ucharcomdata;//读取第2个字节并保存
 COM();
 W_H_temp=ucharcomdata;//读取第3个字节并保存
 COM();
 W_L_temp=ucharcomdata;//读取第4个字节并保存
 COM();
 CHECK_temp=ucharcomdata;//读取第5个字节并保存
 DATA_PIN=1;
 unchartemp=(R_H_temp+R_L_temp+W_H_temp+W_L_temp)
 if(ucharcomdata==unchartemp)
{
 ucharRH_data_H=R_H_temp;
 ucharRH_data_L=R_L_temp;
 ucharRW_data_H=W_H_temp;
 ucharRW_data_L=W_L_temp;
 ucharcheck_data=CHECK_temp;
}
复制代码

 

posted @   该说不唠  阅读(305)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示