OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2110|回复: 2

STM32F103RCT6与DHT11通信,DHT不响应

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2018-11-13
在线时间
1 小时
发表于 2018-12-27 21:30:11 | 显示全部楼层 |阅读模式
5金钱
#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#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=16738&highlight=MINI%2BDHT11这个程序可以在原子的MINI板子(103RCT6)上使用
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-12-27 21:30:12 | 显示全部楼层
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-12-27
在线时间
6 小时
发表于 2019-1-2 21:55:55 | 显示全部楼层
同遇到这个问题,拿例程改引脚也不行,Debug下去发现DHT11在响应拉低电平时就已经玩完了,把协议改过(count++;                         delay_us(1);             if(count> 100) return ;)就可以用了,F103板
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 23:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表