OpenEdv-开源电子网

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

基于STM32F1的DHT11模块问题,无法充值积分,那支付宝/微信转10元?

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
发表于 2019-5-14 10:13:51 | 显示全部楼层 |阅读模式
1金钱
用的KEIL5。用的芯片是STM32F103VET6。PCB是自己画的。模块没有问题,在别人板子上测试过。
跑的是例程。我不存在引脚没改对的问题。可能有问题的就是寄存器有没有写对。我用的是C1。如下所示,应该没写错?
#define DHT11_IO_IN()  {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=8<<4;}
#define DHT11_IO_OUT() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=3<<4;}程序死在下面。也就是无法检测到模块。
u8 DHT11_Check(void)           
{   

        u8 retry=0;
        DHT11_IO_IN();//SET INPUT         
  while (DHT11_DQ_IN&&retry<100)//DHT11&#187;áà-μí40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
  while (!DHT11_DQ_IN&&retry<100)//DHT11à-μíoó&#187;á&#212;ù′&#206;à-&#184;&#223;40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}

猜测可能是时序问题,但时序不是模块自带的?我也不会改。
模块没有问题,代码是示例,引脚什么都改了,所以可能是板子的问题?
希望有大佬能看看。
2019-05-14_100422.png
2019-05-14_100339.png
2019-05-14_100253.png
2019-05-14_095219.png

PCB图.rar

9.84 MB, 下载次数: 1

最佳答案

查看完整内容[请看2#楼]

你好,我试了下您的代码,然后还是不好用。然后我用示波器看波形,原本延迟10ms的,在示波器上延迟100ms。然后我跑了一遍历程,测试了delay,发现还是翻了10倍。最后换了个晶振,好用了。,硬件问题。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-14 10:13:52 | 显示全部楼层
warship 发表于 2019-5-15 19:44
http://www.openedv.com/forum.php?mod=viewthread&tid=275994可以试用一下此帖4楼的代码

你好,我试了下您的代码,然后还是不好用。然后我用示波器看波形,原本延迟10ms的,在示波器上延迟100ms。然后我跑了一遍历程,测试了delay,发现还是翻了10倍。最后换了个晶振,好用了。,硬件问题。
回复

使用道具 举报

98

主题

3626

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
6396
金钱
6396
注册时间
2017-2-18
在线时间
1139 小时
发表于 2019-5-14 10:27:53 | 显示全部楼层
帮顶~~
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-14 11:42:31 来自手机 | 显示全部楼层
自顶。。。。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-14 13:53:16 | 显示全部楼层
能不能来大佬帮我看一眼呀
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-14 15:16:12 | 显示全部楼层
我前几天刚用过的,
给你分享一下:
C文件:
/**
  ******************************************************************************
  * 文件名程: bsp_DHT11.c
  * 作    者: Warship
  * 版    本: V1.0
  * 编写日期: 2019-05-04
  * 功    能: DHT11温湿度传感器底层驱动程序
  ******************************************************************************
   */
/* 包含头文件 ----------------------------------------------------------------*/
#include "bsp_DHT11.h"
#include "delay.h"

/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define SAMPLE_TIMES                 10
/* 私有变量 ------------------------------------------------------------------*/

uint8_t humidity0,temperature0;
uint8_t humid[SAMPLE_TIMES];
uint8_t tempe[SAMPLE_TIMES];
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void DHT11_Mode_IPU(void);
static void DHT11_Mode_Out_PP(void);
static uint8_t DHT11_ReadByte(void);


/* 函数体 --------------------------------------------------------------------*/
/**
  * 函数功能: DHT11 初始化函数
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void DHT11_Init ( void )
{
  DHT11_RCC_PORT=1;
  
        DHT11_Mode_Out_PP();
       
        DHT11_Dout_HIGH();  // 拉高GPIO
}

/**
  * 函数功能: 使DHT11-DATA引脚变为上拉输入模式
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
static void DHT11_Mode_IPU(void)
{
  My_GPIO_Init(DHT11_PORT, DHT11_PIN, Mode_IPU);

}

/**
  * 函数功能: 使DHT11-DATA引脚变为推挽输出模式
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
static void DHT11_Mode_Out_PP(void)
{
My_GPIO_Init(DHT11_PORT, DHT11_PIN, Mode_Out_PP+Speed_50MHz);
}

/**
  * 函数功能: 从DHT11读取一个字节,MSB先行
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
static uint8_t DHT11_ReadByte ( void )
{
        uint8_t i, temp=0;
       

        for(i=0;i<8;i++)   
        {         
                /*每bit以50us低电平标置开始,轮询直到从机发出 的50us 低电平 结束*/  
                while(DHT11_DQ_IN == 0);//等待电平变高

                /*DHT11 以26~28us的高电平表示“0”,以70us高电平表示“1”,
                 *通过检测 x us后的电平即可区别这两个状 ,x 即下面的延时
                 */
                delay_us(40); //延时x us 这个延时需要大于数据0持续的时间即可                     

                if(DHT11_DQ_IN == 1)/* x us后仍为高电平表示数据“1” */
                  {
                       
                        while( DHT11_DQ_IN ==1);/* 等待数据1的高电平结束 */

                        temp|=(uint8_t)(0x01<<(7-i));  //把第7-i位置1,MSB先行
                  }
                else         // x us后为低电平表示数据“0”
                 {                          
                        temp&=(uint8_t)~(0x01<<(7-i)); //把第7-i位置0,MSB先行
                 }
        }
        return temp;
}

//复位DHT11
void DHT11_Rst(void)
{
                /*引脚置为输出模式*/
        DHT11_Mode_Out_PP();        //DQ线由MCU控制
        /*主机拉低*/
        DHT11_Dout_LOW();//MCU向DHT11发出一个至少18ms的低电平作为复位信号
        /*延时18ms*/
        delay_ms(20);

        /*之后将总线拉高,主机延时30us等待响应*/
        DHT11_Dout_HIGH(); //DQ=1

        delay_us(30);  //延时30us

}



/**
  * 函数功能: 一次完整的数据传输为40bit,高位先出
  * 输入参数: DHT11_DataHT11数据类型
  * 返 回 值: ERROR:  读取出错
  *           SUCCESS:读取成功
  * 说    明:8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
  */
uint8_t DHT11_Get_TempAndHumidity(void)
{  
  uint8_t temp;
  uint16_t humi_temp;
        DHT11_Data_TypeDef DHT11_Data;
  
  DHT11_Rst();/*复位DHT11*/
       
        /*主机设为输入 读取DHT11的响应信号*/
        DHT11_Mode_IPU();

        /*判断从机是否有低电平响应信号 如不响应则返回错误,响应则向下运行*/   
        if(DHT11_DQ_IN==0)  //有低电平响应信号   
        {
    /*轮询直到从机发出 的80us 低电平 响应信号结束*/  
    while(DHT11_DQ_IN==0);//等待响应信号结束

    /*轮询直到从机发出的 80us 高电平 标置信号结束*/
    while(DHT11_DQ_IN==1);//等待标置信号结束

    /*以上部分,相当于原子的DHT11_Check()函数 */
               
                /*开始接收数据*/   
    DHT11_Data.humi_high8bit= DHT11_ReadByte();
    DHT11_Data.humi_low8bit = DHT11_ReadByte();
    DHT11_Data.temp_high8bit= DHT11_ReadByte();
    DHT11_Data.temp_low8bit = DHT11_ReadByte();
    DHT11_Data.check_sum    = DHT11_ReadByte();

    /*读取结束,引脚改为输出模式*/
    DHT11_Mode_Out_PP();
    /*主机拉高*/
    DHT11_Dout_HIGH();
   
    /* 对数据进行处理 */
    humi_temp=DHT11_Data.humi_high8bit*100+DHT11_Data.humi_low8bit;
    humidity0 =(float)humi_temp/100;
   
    humi_temp=DHT11_Data.temp_high8bit*100+DHT11_Data.temp_low8bit;
    temperature0=(float)humi_temp/100;   
   
    /*检查读取的数据是否正确*/
    temp = DHT11_Data.humi_high8bit + DHT11_Data.humi_low8bit +
           DHT11_Data.temp_high8bit+ DHT11_Data.temp_low8bit;
    if(DHT11_Data.check_sum==temp)
    {
      return SUCCESS;
    }
    else
      return ERROR;
        }       
        else
                return ERROR;
}


uint8_t DHT11_Read_TempAndHumidity(void)
{
static u8 i=0;
u32 temp_val;
u8 t;
if(DHT11_Get_TempAndHumidity() == SUCCESS)
{
         humid[i]=humidity0;
         tempe[i]=temperature0;
         if(++i>=SAMPLE_TIMES) i=0;
}
temp_val=0;
for(t=0;t<SAMPLE_TIMES;t++) temp_val+=humid[t];
humidity = temp_val/SAMPLE_TIMES;
temp_val=0;
for(t=0;t<SAMPLE_TIMES;t++) temp_val+=tempe[t];
temperature = temp_val/SAMPLE_TIMES;  
return SUCCESS;
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-14 15:16:47 | 显示全部楼层
更正,不是硬件问题,我用我同学的代码跑一边发现好用。我之前也试过他的.c\.h,main里也加了初始化显示什么的。但之前就是不行,正在找原因。可能工程的问题吧,大概。
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-14 15:17:26 | 显示全部楼层
头文件:
#ifndef __ONEWIRE_DHT11_H__
#define        __ONEWIRE_DHT11_H__
//DHT11是一款由内置单片机控制的单一总线温湿度器件
//必须以一个复位信号(18ms)通知它后等待响应,之后就会输出40bit的传感数据

/* 包含头文件 ----------------------------------------------------------------*/
#include "sys.h"

/* 类型定义 ------------------------------------------------------------------*/
/************************ DHT11 数据类型定义******************************/
typedef struct
{
        uint8_t  humi_high8bit;                //原始数据:湿度高8位
        uint8_t  humi_low8bit;                 //原始数据:湿度低8位
        uint8_t  temp_high8bit;                 //原始数据:温度高8位
        uint8_t  temp_low8bit;                 //原始数据:温度高8位
        uint8_t  check_sum;                     //校验和,以上为5个字节共计40bit
} DHT11_Data_TypeDef;

/* 宏定义 -------------------------------------------------------------------*/
/***********************   DHT11 连接引脚定义  **************************/

#define DHT11_RCC_PORT                                              bRCC_ENABLE_GPIOB
#define DHT11_PORT                           GPIOB
#define DHT11_PIN                            Pin_9

/***********************   DHT11 函数宏定义  ****************************/
#define DHT11_Dout_LOW()                          PBout(9)=0
#define DHT11_Dout_HIGH()                         PBout(9)=1

#define        DHT11_DQ_OUT                                                                                                                         PBout(9)
#define        DHT11_DQ_IN                                                                                                                          PBin(9)  

/* 扩展变量 ------------------------------------------------------------------*/
extern uint8_t humidity,temperature;

/* 函数声明 ------------------------------------------------------------------*/
void DHT11_Init( void );
void DHT11_Rst(void);                //复位DHT11
uint8_t DHT11_Read_TempAndHumidity(void);


#endif /* __ONEWIRE_DHT11_H__ */

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-14 15:20:26 | 显示全部楼层
DHT11的温湿度不太稳定,
我这里采用每10次平均(本次与前9次平均),
这样既可以很快采样,又可以提高稳定性。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-14 17:26:57 | 显示全部楼层
warship 发表于 2019-5-14 15:20
DHT11的温湿度不太稳定,
我这里采用每10次平均(本次与前9次平均),
这样既可以很快采样,又可以提高稳 ...

谢谢
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-4-26
在线时间
20 小时
发表于 2019-5-14 18:04:53 | 显示全部楼层
可以看一下时钟的配置,有可能是时钟不一样导致时序出问题了,有示波器可以用示波器看看
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-14 18:45:04 | 显示全部楼层
huangjun 发表于 2019-5-14 18:04
可以看一下时钟的配置,有可能是时钟不一样导致时序出问题了,有示波器可以用示波器看看

提醒得对,
时钟不对的话,延时就不准了,
DHT11对时序要求偏高。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-15 14:07:11 | 显示全部楼层
warship 发表于 2019-5-14 18:45
提醒得对,
时钟不对的话,延时就不准了,
DHT11对时序要求偏高。

请问时钟的配置是怎么做的呢?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-5-14
在线时间
3 小时
 楼主| 发表于 2019-5-15 14:07:54 | 显示全部楼层
D:\application\截屏\图片\2019-05-15_140603.png
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-15 14:38:52 来自手机 | 显示全部楼层
起个昵称真难 发表于 2019-5-15 14:07
请问时钟的配置是怎么做的呢?

以我上面的程序来说,那些延时多少微秒延时多少毫秒必须是准的,这个是建立在系统时钟基础上的,具体你可以搜索一下我的有关延时的帖子。
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-15 19:44:48 | 显示全部楼层
本帖最后由 warship 于 2019-5-15 19:46 编辑
起个昵称真难 发表于 2019-5-15 14:07
请问时钟的配置是怎么做的呢?

http://www.openedv.com/forum.php?mod=viewthread&tid=275994可以试用一下此帖4楼的代码
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

25

主题

1614

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
3160
金钱
3160
注册时间
2018-5-11
在线时间
563 小时
发表于 2019-5-16 21:47:18 | 显示全部楼层
起个昵称真难 发表于 2019-5-16 12:15
你好,我试了下您的代码,然后还是不好用。然后我用示波器看波形,原本延迟10ms的,在示波器上延迟100ms ...

好了就行了,
用我的代码后还是不行的,
十有八九就是硬件问题,
我在帖子里已经说了。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

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

本版积分规则



关闭

正点原子T100智能焊台强势面市上一条 /1 下一条

正点原子公众号

QQ|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2019-7-18 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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