OpenEdv-开源电子网

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

关于读取DHT11温湿度传感器的问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-5-19
在线时间
1 小时
发表于 2019-5-20 16:56:57 | 显示全部楼层 |阅读模式
本帖最后由 shengbeer 于 2019-5-20 17:01 编辑

   各位前辈大家好,我目前正在做一个读取DHT11的程序;但是读出来的引脚的数据始终是为1(高电平),启动时序这边我已经通过示波器测过了没有问题;而且DHT11也有响应,但是就是获取不到发送的数据。请问又碰到过这个情况的嘛。麻烦解下惑
下面放上我的main程序和DHT11程序
main.c
int main(void)
{
        u8 kk,num,i,m;
        u16 retry=0;//定义临时变量
        num = 0;
        i = 0;
        kk = 0;
        m = 1;
             USART1_Int(9600);
                SysTick_Delay_Ms(1000);  //等待上电延时一秒
        //使用DHT11初始化函数初始化
        //检测DHT11是否响应
                //第一步 将DHT11的PA5引脚设置为输出状态
                DHT11_PortOUT();
                DHT11_LOW;//将PA5引脚输出至少18ms的低电平
                SysTick_Delay_Ms(20); //拉低至少18ms
                DHT11_HIGH;  //拉高主机引脚
                SysTick_Delay_Us(20); //等待30us
                DHT11_PortIN(); //设置PA5为输入状态,准备接收DHT11响应信号
                m = DHT11_Check();
                printf(" test: %d \r\n",m);
                for(i = 0; i<40;i++)
                {
                        kk = DHT11_Read_Bit();
                        printf(" test: %d \r\n",kk);
                }


下面是DHT11的程序
void DHT11_PortIN(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

        //Configure pin as input
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;         //上拉输入
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void DHT11_PortOUT(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        //Configure pin as input
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_5);
}
//void Test(void)
//{
//        GPIO_InitTypeDef  GPIO_InitStructure;
//        //Configure pin as input
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
//        GPIO_Init(GPIOA,&GPIO_InitStructure);
//        GPIO_SetBits(GPIOA,GPIO_Pin_4);
//}

//检测DHT11是否存在
void DHT11_Rst(void)   
{                 
                DHT11_PortOUT(); //SET OUTPUT
    DHT11_LOW; //DQ=0
    SysTick_Delay_Ms(20);    //拉低至少18ms
    DHT11_HIGH; //DQ=1
                SysTick_Delay_Us(20);     //主机拉高20~40us
}
//读一位数据
u8 DHT11_Read_Bit(void)
{
u8 retry=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100)        //等待变为低电平
{
retry++;
SysTick_Delay_Us(1);
}
retry=0;
while(!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100)        //等待变为高电平
{
retry++;
SysTick_Delay_Us(1);
}
SysTick_Delay_Us(40);//等待40s
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))
return 1;
else
return 0;
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)   
{   
                u16 retry=0;//定义临时变量
                DHT11_PortIN();//SET INPUT
    while ((!GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                SysTick_Delay_Us(1);
        };
        if(retry>=100)return 1;
        else retry=0;
    while (GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                SysTick_Delay_Us(1);
        };
        if(retry>=100)return 1;   
                return 0;
}


另外我这边没有给DATA引脚加上一个上拉电阻,想请问下这样会不会有影响其中u8 DHT11_Check(void)   返回的是0  检测到DHT11是存在的;但就是获取数据那里出了问题。想问下我程序哪里有问题吗

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-5-20 17:28:38 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 01:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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