STM32F103RCT6与DHT11通信,DHT不响应

2019-07-21 06:13发布

#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "led.h"


u8 temperoture = 0,humiture = 0;
u8 USART_tx_shidu[8]={0x5A,0xA5,0x05,0x82,0x00,0x1B,0x00,0x00} ;


//--------------------------------------------------------
//éèÖÃòy½Åêäèë
void setpin_input(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;      //¸¡¿Õêäèë
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
}


//--------------------------------------------------------
//éèÖÃòy½Åêä3ö
void setpin_output(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
}
void DHT11_rst(void)
{
setpin_output();   //êä3öμíμçƽ
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);
       
        delay_ms(20);      //Öáéù18msμíμçƽ
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
  delay_us(20);
        //GPIO_ResetBits(GPIOA,GPIO_Pin_5);


        //GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//--------------------------------------------------------
//¿aÆôó|′eDÅoÅ
int check_DHT11(void)
{
        u8 count = 0,count1=0;
        setpin_input();    //êäèëÄ£ê½,DHT11¿aê¼ó|′e
        while(( GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==0 ))     //80usμíμçƽ
        {
//    count1++;               
//                delay_us(1);
        }
       
        while( (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)==1 )&& count < 100)     //80us&#184;&#223;μ&#231;&#198;&#189;
        {
                count++;
                delay_us(1);
        }
       
        if(count == 100 )           //3&#172;ê±£&#172;&#207;àó|꧰ü
        {
                return 0;
        }
        else
        {
                return 1;
        }
}

//--------------------------------------------------------
//&#191;a&#198;&#244;ó|′eD&#197;o&#197;
int reset_DHT11(void)
{       
        DHT11_rst();

if(check_DHT11()) return 1;
else return 0;
}

//--------------------------------------------------
//&#182;áè&#161;ò&#187;&#206;&#187;êy&#190;Y
uint8_t read_bit(void)
{
        uint8_t onebit = 0;
       
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 0);        //50usμíμ&#231;&#198;&#189;
       
        delay_us(6);
                 
        if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 1)           //50usoó&#187;1ê&#199;&#184;&#223;μ&#231;&#198;&#189;μ&#196;ê&#199;êy&#190;Y1
        {
                onebit = 1;
        }
       
        return onebit;
}


//--------------------------------------------------
//&#182;áè&#161;êy&#190;Y
void read_data(void)
{
        uint8_t data[5] = {0,0,0,0,0};
        u8 i,j,flag;
       
        do
        {
                flag = reset_DHT11();
        }
        while(flag != 1);             //&#214;±μ&#189;&#207;àó33é1|
       

        for(i=0;i<5;i++)
        {
                for(j=0;j<8;j++)
                {
                        data[i] <<= 1;           //×óò&#198;ò&#187;&#206;&#187;
                        data[i] |= read_bit();         //&#187;ò
                }               
        }                   
       
        while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) == 0);  //D&#197;o&#197;&#189;áê&#248;μ&#231;&#198;&#189;

        setpin_output();             //éè&#214;&#195;ê&#228;3&#246;&#196;£ê&#189;£&#172;1ò&#198;eD&#197;o&#197;&#207;&#223;
                       
        if(data[4] == data[0]+data[1]+data[2]+data[3])
        {
                humiture = data[0];
                temperoture = data[1];
        }

        delay_us(2);
}
void shidu_change(u8 x,u8 y)
{
       
        USART_tx_shidu[7]=x;
        USART_tx_shidu[6]=y;
}


在check_DHT11()这个函数前,主机信号都是正确的,在说明书范围内,但是经过这个函数,到判断语句的时候,判断语句内容也被纳入到主机发送的高电平中了,所以高电平从原来的的20多us直接变到200多us,不知道是不是这个问题,所以不响应。因为我想前面主机信号对,DHT11就直接响应了,后面判断的就不会被算到高电平时间段了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
peng1554
1楼-- · 2019-07-21 07:25
http://www.openedv.com/forum.php ... hlight=MINI%2BDHT11这个程序可以在原子的MINI板子(103RCT6)上使用
S·Run
2楼-- · 2019-07-21 09:19
同遇到这个问题,拿例程改引脚也不行,Debug下去发现DHT11在响应拉低电平时就已经玩完了,把协议改过(count++;                         delay_us(1);             if(count> 100) return ;)就可以用了,F103板

一周热门 更多>