Stm32程序控制DHT11.pdf
- 文档编号:14657533
- 上传时间:2023-06-25
- 格式:PDF
- 页数:6
- 大小:363.37KB
Stm32程序控制DHT11.pdf
《Stm32程序控制DHT11.pdf》由会员分享,可在线阅读,更多相关《Stm32程序控制DHT11.pdf(6页珍藏版)》请在冰点文库上搜索。
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低电平响应的信号。
主机发送开始信号结束后,延时等待2040us后,读取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;/总线拉高2040us,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=DeviceNotAvailablen;charerror_data=ErrorDatan;uintData_Buff5;DHT11_Rst();if(DHT11_Check()=0)/当检测到DHT11给STM32主控芯片的输入电压为低电压时,说明DHT11开始响应while(!
PAin
(1);/等待80us的低电平响应信号结束while(PAin
(1);/等待80us的高电平结束,开始接收数据for(i=0;i5;i+)Data_Buffi=DHT11_Read_Byte();while(!
PAin
(1);/等待40位数据输出完后的50us低电平输出结束DHT11_OUT_Init();PAout
(1)=1;if(Data_Buff0+Data_Buff1+Data_Buff2+Data_Buff3)=Data_Buff4)/加入湿度的整数和小数Printf(“%s”,”湿度为:
”);printf(“%c”,Data_Buff0/10+48);printf(“%c”,Data_Buff0%10+48);printf(“%c”,.);printf(“%c”,Data_Buff1/10+48);printf(“%c”,Data_Buff1%10+48);printf(“n”);/加入温度的整数和小数Printf(“%s”,”温度为:
”);printf(“%c”,Data_Buff2/10+48);printf(“%c”,Data_Buff2%10+48);printf(“%c”,.);printf(“%c”,Data_Buff3/10+48);printf(“%c”,Data_Buff3%10+48);printf(“n”);else/校验出错Printf(“%s”,check);elsePrintf(“%s”,error);作者:
温杰太原联航科技有限公司
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Stm32 程序控制 DHT11