OpenEdv-开源电子网

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

求帮助,DHT11文件

[复制链接]

2

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2015-7-22
在线时间
44 小时
发表于 2015-7-22 12:17:41 | 显示全部楼层 |阅读模式
5金钱
我用的是mini版的STM32,DHT11温湿度模块的应用,不知道为什么,LCD上显示的温湿度一直都是12,没有任何的 变化,求帮助
第一个文件是DHT.c文件
#include "dht11.h"
#include "delay.h"

//复位DHT11

void DHT11_Rst(void)     

{                

    DHT11_IO_OUT();      //SET OUTPUT

    DHT11_DQ_OUT=0;    //拉低DQ

    delay_ms(20);    //拉低至少18ms

    DHT11_DQ_OUT=1;    //DQ=1

    delay_us(30);            //主机拉高20~40us

}

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check(void)         

{  

       u8 retry=0;

       DHT11_IO_IN();//SET INPUT    

    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us

       {

              retry++;

              delay_us(1);

       };   

       if(retry>=100)return 1;

       else retry=0;

    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us

       {

              retry++;

              delay_us(1);

       };

       if(retry>=100)return 1;     

       return 0;

}

//从DHT11读取一个位

//返回值:1/0

u8 DHT11_Read_Bit(void)                 

{

      u8 retry=0;

       while(DHT11_DQ_IN&&retry<100)//等待变为低电平

       {

              retry++;

              delay_us(1);

       }

       retry=0;

       while(!DHT11_DQ_IN&&retry<100)//等待变高电平

       {

              retry++;

              delay_us(1);

       }

       delay_us(40);//等待40us

       if(DHT11_DQ_IN)return 1;

       else return 0;            

}

//从DHT11读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte(void)   

{       

    u8 i,dat;

    dat=0;

       for (i=0;i<8;i++)

       {

            dat<<=1;

           dat|=DHT11_Read_Bit();

    }                                           

    return dat;

}

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

u8 DHT11_Read_Data(u8 *temp,u8 *humi)   

{       

      u8 buf[5];

       u8 i;

       DHT11_Rst();

       if(DHT11_Check()==0)

       {

              for(i=0;i<5;i++)//读取40位数据

              {

                     buf=DHT11_Read_Byte();

              }

              if(((buf[0]+buf[1]+buf[2]+buf[3])&0xff)==buf[4])

              {

                     *humi=buf[0];

                     *temp=buf[2];

              }

       }else return 1;

       return 0;     

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在      

u8 DHT11_Init(void)

{

       RCC->APB2ENR|=1<<8;    //使能PORTD口时钟 
    RCC->APB2ENR|=1<<5;    //使能PORTD口时钟

       GPIOD->CRL&=0XFFFFF0FF;//PORTD.2 推挽输出

       GPIOD->CRL|=0X00000300;

       GPIOD->ODR|=1<<2;      //输出1                               

       DHT11_Rst();

       return DHT11_Check();

}
下面的文件是DHT.H文件
#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"  

//IO方向设置

#define DHT11_IO_IN()  {GPIOC->CRL&=0XFFFFF0FF;GPIOC->CRL|=8<<3;}
#define DHT11_IO_OUT() {GPIOC->CRL&=0XFFFFF0FF;GPIOC->CRL|=3<<8;}

////IO操作函数                                                                              

#define    DHT11_DQ_OUT PCout(6) //数据端口     PC6 

#define    DHT11_DQ_IN  Cin(6)  //数据端口     PC6

u8 DHT11_Init(void);           //初始化DHT11

u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度

u8 DHT11_Read_Byte(void); //读出一个字节

u8 DHT11_Read_Bit(void);   //读出一个位

u8 DHT11_Check(void);       //检测是否存在DHT11

void DHT11_Rst(void);         //复位DHT11   

#endif
最后一个文件是main.c文件的主函数
int main(void)
{                     
       u8 t=0;                     
       u8 temperature;        
       u8 humidity;         
//      Stm32_Clock_Init(9);           //系统时钟设置
       uart_init(9600);             //串口初始化为9600
       delay_init();                         //延时初始化
       LED_Init();                        //初始化与LED连接的硬件接口
       LCD_Init();
DHT11_Init(); //初始化LCD
 //      usmart_dev.init(72);             //初始化USMART        
//      KEY_Init();                         //按键初始化
      POINT_COLOR=RED;//设置字体为红色
       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   
       LCD_ShowString(60,70,200,16,16,"DHT11 TEST");  
       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
       LCD_ShowString(60,110,200,16,16,"2012/9/12");              
      while(!DHT11_Init())//HT11初始化     
       {
              LCD_ShowString(60,130,200,16,16,"DHT11 Error");
              delay_ms(200);
              LCD_Fill(60,130,239,130+16,WHITE);
             delay_ms(200);
       }                                                         
       LCD_ShowString(60,130,200,16,16,"DHT11 OK");
       OINT_COLOR=BLUE;//设置字体为蓝色
  LCD_ShowString(60,150,200,16,16,"Temp:  C");
  LCD_ShowString(60,170,200,16,16,"Humi:  %");
     while(1)
       {                    
             if(t%10==0)//每100ms读取一次
              {                                                               
                   DHT11_Read_Data(&temperature,&humidity);          //读取温湿度值                                    
                   LCD_ShowNum(60+40,150,temperature ,2,16);                  
                   LCD_ShowNum(60+40,170,humidity,2,16);                     //显示湿度            
              }                             
             delay_ms(10);
              t++;
              if(t==20)
              {
                     t=0;
                     LED0=!LED0;
              }
       }
}

最佳答案

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

程序太长,没有细看,给你建议如下: 1.对照下时序图,一般这个传感器还有DS18B20出不来数据,都是时序没对上,你可以调的精准一点,因为你用的是STM32,滴答计时器的延时是很准确的。 2.你可以线不要屏幕显示,先从串口出来,用PC的串口调试助手看看你的数据是不是对的。调通了在加LCD。 3.DHT11的程序网上到处是,基于51的,好多好多,可以对照一下,是不是少了什么,流程对不对。然后单步调试看看,为什么你的都是12. 4.dht11和 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

598

帖子

0

精华

高级会员

Rank: 4

积分
875
金钱
875
注册时间
2013-12-18
在线时间
41 小时
发表于 2015-7-22 12:17:42 | 显示全部楼层
程序太长,没有细看,给你建议如下:
1.对照下时序图,一般这个传感器还有DS18B20出不来数据,都是时序没对上,你可以调的精准一点,因为你用的是STM32,滴答计时器的延时是很准确的。
2.你可以线不要屏幕显示,先从串口出来,用PC的串口调试助手看看你的数据是不是对的。调通了在加LCD。
3.DHT11的程序网上到处是,基于51的,好多好多,可以对照一下,是不是少了什么,流程对不对。然后单步调试看看,为什么你的都是12.
4.dht11和他的升级版本dht22,我都在zigbeecc2530上都调通过,程序还在,如果需要的话,可以给你参考,但是我的延时你要注意,没有你的STM32那么精准的。
5.传感器由于价格只有5块钱左右,你看看是不是硬件问题,你接线是不是接反了?是不是他本身有问题?还有上拉电阻弄了吗?虽然这条的可能性不大,还是注意下为好。
6.dht11是公认的及其简单的单总线传感器,他不会把你难住的,你很快就会解决的,加油。
回复

使用道具 举报

2

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2015-7-22
在线时间
44 小时
 楼主| 发表于 2015-7-22 14:27:00 | 显示全部楼层
回复【2楼】w417074951:
---------------------------------
恩,非常感谢你的建议
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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