前言:本代码在STM32F407ZET6开发板平台测试通过,STM32结合DTH11温湿度传感器进行测量温度和湿度,并通过串口把测试结果发送到串口终端上显示。
现呈上代码再说
int main(void)
{
u8 Temp, Hum;
char Info_Buf[50];
Led_Init();
Key_Init();
Systick_Init();
Uart1_Init();
while(1)
{
if(!KEY0) //等待按键按下
{
while(!KEY0); //等待按键释放
Temp = 0; //清零
Hum = 0; //清零
DHT11_Read(&Temp, &Hum); //读取温湿度
snprintf(Info_Buf, 50,"Temperature:%d Humidity:%d\r\n", Temp, Hum);
printf("%s", Info_Buf); //发送数据到串口助手显示
delay_ms(100);
}
}
}
void Dht11_OutputMode(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_DeInit(GPIOG);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOG, &GPIO_InitStruct);
}
void Dht11_InputMode(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_DeInit(GPIOG);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOG, &GPIO_InitStruct);
}
u8 DHT11_ReadByte(void)
{
u8 bit_value;
u8 value=0;
u8 count;
for(count=0;count<8;count++)
{
if(!PGin(9))
{
while(!PGin(9)); //等待低半周期过去
//判断是0还是1
delay_us(50);
if(PGin(9))
bit_value = 1;
else
bit_value = 0;
}
value <<= 1;
value |= bit_value;
while(PGin(9));
}
return value;
}
void DHT11_Read(u8 *pTemp, u8 *pHum)
{
//设置为输出模式
Dht11_OutputMode();
//主机启动读写信号
PGout(9) = 0; //拉低
delay_ms(19); //保持19ms
PGout(9) = 1; //拉高
//设置为输入模式
Dht11_InputMode();
//等待DHT11应答
while(PGin(9));
//DHT11响应
if(!PGin(9))
{
//DHT11 响应信号
while(!PGin(9)); //等待低周期结束
while(PGin(9)); //等待低周期结束
//读取40bit数据
//读取湿度的整数值
*pHum = DHT11_ReadByte();
//读取湿度的小数值,暂不支持
DHT11_ReadByte();
//读取温度的整数值
*pTemp = DHT11_ReadByte();
//读取温度的小数值 ,暂不支持
DHT11_ReadByte();
//读取校验值,忽略
DHT11_ReadByte();
PGout(9) = 1;
}
}
根据DHT11用户手册,可知DHT11的工作时序过程:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉
高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定
了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有
响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线
50us,随后总线由上拉电阻拉高进入空闲状态。
效果图:(用湿纸巾包住DHT11时温湿度变化过程,每按下一次按键读取一次温湿度值)
具体完整工程代码下载可以点击一下链接:
http://download.csdn.net/download/xiebaocheng12138/10001857