单片机 | 您所在的位置:网站首页 › utc3845e电路原理图 › 单片机 |
DHT11温湿度传感器在51单片机中的应用
1 可以检测周围环境的湿度和温度 2 传感器采用 DHT11 3 湿度测量范围: 20%-95%( 0 度-50 度范围)湿度测量误差: ±5% 4 温度测量范围: 0 度-50 度 温度测量误差: ±2 度 4 工作电压 3.3V-5V 5 输出形式 数字输出 6 设有固定螺栓孔,方便安装 7 小板 PCB 尺寸: 3.2cm * 1.4cm 8 电源指示灯(红色) 二、模块电路图
1 VCC 外接 3.3V-5V 2 GND 外接 GND 3 DATA 小板开关数字量输出接口 接单片机 IO 口 四、 DHT11 测试说明编译环境: keil4 测试单片机 STC89C52 DHT11 模块与单片机连接: VCC-VCC 、GND-GND、 DATA-P2.0 从DHT11的DATA引脚总共接收 40位数据,具体如下: 温度高 8 位 串口发送的第一个数据 温度低 8 位 串口发送的第二个数据(默认为 00) 湿度高 8 位 串口发送的第三个数据 湿度低 8 位 串口发送的第四个数据(默认为 00) 校验 8 位 串口发送的第五个数据 五、 DHT11 功能函数 DHT11.C文件 sbit thd11=P2^0; //定义DHT11温湿度数据引脚DATA /*------------------------------------------------ DHT11延时函数 ------------------------------------------------*/ 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--); } /*-------------------------------------------- DHT11开始信号 ------------------------------------------------*/ void DHT11_start() { thd11=1; DHT11_delay_us(2); thd11=0; DHT11_delay_ms(20); //延时18ms以上 thd11=1; DHT11_delay_us(30); } /*------------------------------------------------ 接收八位二进制 ------------------------------------------------*/ uchar DHT11_rec_byte() //接收一个字节 { unsigned char i,dat=0; for(i=0;i uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start(); if(thd11==0) { while(thd11==0); //等待拉高 DHT11_delay_us(80); //拉高后延时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]='0'+(TH/10); rec_dat[3]='0'+(TH%10); } }是不是很多人和我最开始接触单片机一样,不会用模块手册/芯片手册,我在这里还是附上如何看手册编写源程序的方法吧! 单片机时序是指单片机执行指令时发出的控制信号的时间序列。这些信号在时间上的相互关系就是CPU的时序。 CPU发出的时序有两类: 1. 用于片内各功能部件的控制,它们是芯片设计师关注的问题,对用户没有什么意义 2. 用于片外存储器或I/O端口的控制,需要通过器件的控制引脚送到片外,这部分时序 对分析硬件电路的原理至关重要,也是软件编程遵循的原则,需要认真掌握。
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。主机发送开始信号结束后,延时等待20-40us后, 开始读取DHT11的响应信号。 /*-------------------------------------------- DHT11开始信号 ------------------------------------------------*/ void DHT11_start() { thd11=1;//总线先拉高 DHT11_delay_us(2); thd11=0;//总线拉低 DHT11_delay_ms(20); //延时18ms以上 thd11=1;//总线拉高 DHT11_delay_us(30);//延时等待20-40us后 } 2、下面是接收数据的编写方法
作用:所以我们通过上面时序图就可以判断DHT11从什么时候开始响应主机的?而主机也就可以在根据总线的情况,在正确的时间去接收DHT11发送的数据了。 注意:DHT11会一次性发送40位数据,所以主机也要一次性接收40位数据哦。 这个比较简单,就是简单的判断总线电平变化。我这里就不贴代码,最上面有代码,按照时序图一步一步分析就行! 3、接收的数据是0/1的判断方法
|
CopyRight 2018-2019 实验室设备网 版权所有 |