您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > Stm32程序控制DHT11
Stm32程序控制DHT11一、接口说明二、电源引脚DHT11的供电电压为3---5.5V。传感器上电后,要等待1s以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nf的电容,用以去藕滤波。三、串行接口(单线方向)DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。操作流程如下:一次完整的数据传输为40位,高位先出。数据格式为:8位湿度整数数据+8位湿度小数数据+8位温度整数数据+8位温度小数数据+8位校验和。数据传送正确时校验和数据等于“8位湿度整数数据+8位湿度小数数据+8位温度整数数据+8位温度小数数据”所得结果的末8位。用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,发出40位的数据,并触发一次信号采集,用户可选择读取部分数据,从模式下,DHT11接受到开始信号触发一次温湿度采集,如果没有接受到主机发送开始信号,DHT11不会主动进行温湿度采集,采集数据后转换到低速模式。通讯过程如下图:总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18ms,保证DHT11能检测到起始信号。DHT11接受到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应的信号。主机发送开始信号结束后,延时等待20~40us后,读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一位数据都以50us电平时隙开始,高电平的长短决定数据位为0或1.格式见下面图示。如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常。当最后一位数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。数据0表示方法如下:数据1表示方法如下:四、程序控制:硬件连接:Pin1------------VCCPin2------------PA1Pin3------------NC浮空Pin4-------------GND程序代码如下:/***@brief设置端口为输入模式*/staticvoidDHT11_IN_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*温湿度传感器控制线浮空输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1);}/***@brief设置端口为输出模式*/staticvoidDHT11_OUT_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);/*温湿度传感器控制线模拟输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1);}/***@brief初始化DHT11,并检测,检测成功返回0,否则返回1*/staticvoidDHT11_Rst(void){DHT11_OUT_Init();//设置引脚为输出模式PAout(1)=0;Delay_ms(19);//拉低至少18msPAout(1)=1;//总线拉高20~40us,DHT11会返回一个低电平Delay_us(30);DHT11_IN_Init();//设置管脚为输入模式,用于读取DHT11的值,此时PAin(1)为高电平}/***@brief检测DHT11,检测成功返回0,否则返回1*/staticuintDHT11_Check(void){returnPAin(1);//检测输入电平高低}staticuintDHT11_Read_Bit(void){while(!PAin(1));//等待变高电平,每次发送数据前都会有一个50us的电平信号Delay_us(40);//等待40usif(PAin(1)==1){while(PAin(1));//当数据为1时,还得等到1信号结束,这里有不少人会出错return1;}elsereturn0;}/***@brief从DHT11读取一个字节*/staticuintDHT11_Read_Byte(void){uinti;uintData=0;for(i=0;i8;i++){Data=1;Data|=DHT11_Read_Bit();}returnData;}/***@brief从DHT11读取8位数据包*/voidDHT11_Read_Data(){uinti=0;charcheck[]=DeviceNotAvailable\n;charerror_data[]=ErrorData\n;uintData_Buff[5];DHT11_Rst();if(DHT11_Check()==0)//当检测到DHT11给STM32主控芯片的输入电压为低电压时,说明DHT11开始响应{while(!PAin(1));//等待80us的低电平响应信号结束while(PAin(1));//等待80us的高电平结束,开始接收数据for(i=0;i5;i++){Data_Buff[i]=DHT11_Read_Byte();}while(!PAin(1));//等待40位数据输出完后的50us低电平输出结束DHT11_OUT_Init();PAout(1)=1;if((Data_Buff[0]+Data_Buff[1]+Data_Buff[2]+Data_Buff[3])==Data_Buff[4]){//加入湿度的整数和小数Printf(“%s”,”湿度为:”);printf(“%c”,Data_Buff[0]/10+48);printf(“%c”,Data_Buff[0]%10+48);printf(“%c”,’.’);printf(“%c”,Data_Buff[1]/10+48);printf(“%c”,Data_Buff[1]%10+48);printf(“\n”);//加入温度的整数和小数Printf(“%s”,”温度为:”);printf(“%c”,Data_Buff[2]/10+48);printf(“%c”,Data_Buff[2]%10+48);printf(“%c”,’.’);printf(“%c”,Data_Buff[3]/10+48);printf(“%c”,Data_Buff[3]%10+48);printf(“\n”);}else//校验出错{Printf(“%s”,check);}}else{Printf(“%s”,error);}}作者:温杰太原联航科技有限公司
本文标题:Stm32程序控制DHT11
链接地址:https://www.777doc.com/doc-4358361 .html