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

2019-07-21 01:19发布

用的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;
}

猜测可能是时序问题,但时序不是模块自带的?我也不会改。
模块没有问题,代码是示例,引脚什么都改了,所以可能是板子的问题?
希望有大佬能看看。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
warship
2019-07-21 06:27
我前几天刚用过的,
给你分享一下:
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;
}

一周热门 更多>