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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App