写一个stm32驱动DHT11的代码
时间: 2023-12-07 08:05:28 浏览: 70
好的,以下是一个简单的stm32驱动DHT11的代码:
```c
#include "stm32f10x.h"
#define DHT11_PIN GPIO_Pin_0
#define DHT11_PORT GPIOA
void DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = DHT11_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
delay_us(1000);
}
int DHT11_ReadData(float *tmp, float *hum)
{
uint8_t data[5] = {0};
uint8_t i, j;
DHT11_Init();
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
delay_us(18000);
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
delay_us(1);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(DHT11_PORT, &GPIO_InitStruct);
delay_us(40);
if(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
{
while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN));
for(i=0; i<5; i++)
{
data[i] = 0;
for(j=0; j<8; j++)
{
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN));
delay_us(30);
if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
data[i] |= (1<<(7-j));
while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN));
}
}
if(data[4] == (data[0]+data[1]+data[2]+data[3]))
{
*hum = (float)data[0];
*tmp = (float)data[2];
return 0;
}
}
return -1;
}
```
这是一个简单的DHT11驱动代码,具体调用方法请参考stm32的官方文档。
阅读全文