STM32外设驱动篇——DHT11温湿度传感器
扫描二维码
随时随地手机看文章
已在STM32上进行过测试。本例使用PC0引脚连接DHT11的data引脚。
main函数中调用下面代码中的DTH11_test函数即可。
//数据定义:
//----以下变量均为全局变量--------
//----温度高8位==U8T_data_H------
//----温度低8位==U8T_data_L------
//----湿度高8位==U8RH_data_H-----
//----湿度低8位==U8RH_data_L-----
//----校验8位==U8checkdata-----
u8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
u8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
#defineBOOLunsignedchar
#ifndefTRUE
#defineTRUE1
#endif
#ifndefFALSE
#defineFALSE0
#endif
staticvoidDHT11_DataPin_Configure_Output(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PC端口时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//PC.0端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
staticvoidDHT11_DataPin_Configure_Input(void)
{
GPIO_InitTypeDefDataPin;
DataPin.GPIO_Pin=GPIO_Pin_0;
DataPin.GPIO_Mode=GPIO_Mode_IN_FLOATING;//悬空
DataPin.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&DataPin);
}
BOOLDHT11_get_databit(void)
{
uint8_tval;
val=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0);
if(val==Bit_RESET){
returnFALSE;
}else{
returnTRUE;
}
}
voidDHT11_set_databit(BOOLlevel)
{
if(level==TRUE){
GPIO_SetBits(GPIOC,GPIO_Pin_0);
}else{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
}
voidmdelay(u16ms)
{
if(ms!=0){
delay_ms(ms);
}
}
voidudelay(u16us)
{
if(us!=0){
delay_us(us);
}
}
staticuint8_tDHT11_read_byte(void)
{
uint8_ti;
uint8_tdata=0;
for(i=0;i<8;i++)
{
data<<=1;
while((!DHT11_get_databit()));
udelay(10);
udelay(10);
udelay(10);
if(DHT11_get_databit()){
data|=0x1;
while(DHT11_get_databit());
}else{
}
}
returndata;
}
staticuint8_tDHT11_start_sampling(void)
{
DHT11_DataPin_Configure_Output();
//主机拉低18ms
DHT11_set_databit(FALSE);
mdelay(18);
DHT11_set_databit(TRUE);
//总线由上拉电阻拉高主机延时20us
udelay(10);
udelay(10);
//udelay(10);
//udelay(10);
//主机设为输入判断从机响应信号
DHT11_set_databit(TRUE);
DHT11_DataPin_Configure_Input();
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!DHT11_get_databit())//T!
{
//判断从机是否发出80us的低电平响应信号是否结束
while((!DHT11_get_databit()));
//printf("DHT11answers.rn");
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((DHT11_get_databit()));
return1;
}
return0;
}
voidDHT11_get_data(void)
{
u8temp;
if(DHT11_start_sampling()){
//printf("DHT11isreadytotransmitdatarn");
//数据接收状态
U8RH_data_H_temp=DHT11_read_byte();
U8RH_data_L_temp=DHT11_read_byte();
U8T_data_H_temp=DHT11_read_byte();
U8T_data_L_temp=DHT11_read_byte();
U8checkdata_temp=DHT11_read_byte();
/*Datatransmissionfinishes,pullthebushigh*/
DHT11_DataPin_Configure_Output();
DHT11_set_databit(TRUE);