OpenEdv-开源电子网

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

终于把STM32读取DHT11的程序写出来了,现附上图和源码

[复制链接]

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-11
在线时间
1 小时
发表于 2012-4-29 21:55:44 | 显示全部楼层 |阅读模式
 


这是在线仿真读到的数据,

再附上源码,里面还NRF905的程序

node programe RX.rar

1.69 MB, 下载次数: 38690

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

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-4-21
在线时间
0 小时
发表于 2014-4-21 21:33:30 | 显示全部楼层
DHT11_Check 这里总是检查不到DHT11的存在,一直循环
回复 支持 3 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-7 19:30:14 | 显示全部楼层
#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])==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;    //使能PORTG口时钟 
GPIOG->CRH&=0XFFFF0FFF;//PORTG.11 推挽输出
GPIOG->CRH|=0X00003000;
GPIOG->ODR|=1<<11;      //输出1     
DHT11_Rst();
return DHT11_Check();








我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-11
在线时间
1 小时
 楼主| 发表于 2012-4-29 21:59:58 | 显示全部楼层
放了半个多小时也没有出现问题。数据读出来的很正常,绝对全球首发。沙发自己坐。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-4-29 23:09:47 | 显示全部楼层
多谢分享.要是能结合经验说说注意事项就更好了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2011-8-11
在线时间
1 小时
 楼主| 发表于 2012-4-30 22:56:27 | 显示全部楼层
主要是时间的要求非常的严格。注意时间就行了,用SYSTICK绝对是可以调出来的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-8
在线时间
0 小时
发表于 2012-6-8 18:52:41 | 显示全部楼层
好东西啊。。。。。纠结好长时间找到这个。。。什么都不存在了。。。。
回复 支持 反对

使用道具 举报

8

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2011-11-20
在线时间
0 小时
发表于 2012-6-8 22:48:54 | 显示全部楼层
好东西
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-6-19
在线时间
0 小时
发表于 2012-6-19 15:16:46 | 显示全部楼层
 我用的代码试了一下,似乎不能产生小数,得到的温度与湿度的小数总是0,不知道是怎么回事
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-8-7 17:40:01 | 显示全部楼层
测试的时候问题同楼上,发现小数部分全部为0,温度值好像也几乎不会变动,倒是湿度值变动很大,两个值都是50以上,读取顺序应该没错,不知道是怎么回事
回复 支持 反对

使用道具 举报

23

主题

143

帖子

1

精华

高级会员

Rank: 4

积分
933
金钱
933
注册时间
2012-4-23
在线时间
68 小时
发表于 2012-8-7 17:51:58 | 显示全部楼层
详细看了一下资料,是这么说————————————————
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-7 19:30:31 | 显示全部楼层
#ifndef __DHT11_H
#define __DHT11_H 
#include "sys.h"   
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//DHT11 驱动代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/7/24 
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////  
 
//IO方向设置
#define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
////IO操作函数    
#define DHT11_DQ_OUT Gout(11) //数据端口 PA0 
#define DHT11_DQ_IN  Gin(11)  //数据端口 PA0 


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















我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

216

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2011-4-7
在线时间
3 小时
发表于 2012-8-7 21:29:37 | 显示全部楼层
学习!
回复 支持 反对

使用道具 举报

9

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
205
金钱
205
注册时间
2011-1-20
在线时间
7 小时
发表于 2012-8-21 14:52:38 | 显示全部楼层
DHT11测的湿度准吗?我测的湿度读数和指针式的湿度计差快一半了。温度读数倒是差不多。不知是怎么回事?
回复 支持 反对

使用道具 举报

43

主题

152

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-8-11
在线时间
57 小时
发表于 2014-3-10 10:20:02 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,这个程序你两次定义了IO。在h文件里一次,在c文件里一次,这不是重复了么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2014-3-11 23:45:36 | 显示全部楼层
回复【14楼】miss_lion:
---------------------------------
可否具体点,贴代码给我看下?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-3-19 13:12:46 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
原子哥,我用你的DHT11的程序,只不过是测得的数据用串口发给电脑,为什么电脑接到的永远是70,温度湿度都是70,到底是哪错了,纠结一天了。。。
努力吧,小伙伴们。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2014-3-19 17:05:05 | 显示全部楼层
回复【16楼】什么都不懂:
---------------------------------
一步步排查。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-3-19 21:52:13 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
我看了,dht11初始化正确,串口正确,但是temperature humidity 变量里的数据不会更新,70是变量里的初始值,给他赋值0的话,他就一直是零
努力吧,小伙伴们。。
回复 支持 反对

使用道具 举报

5

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2012-10-12
在线时间
71 小时
发表于 2014-4-22 07:50:38 | 显示全部楼层
建议用SHT11或者SHT21,下面我附上最近写的SHT21程序,测试可用!
#include "stm32f10x.h"
#include<math.h>
#include<math.h>
#include  <stdlib.h>
#define uint unsigned int
#define ulong unsigned long int
#define uchar unsigned char

uchar flagt;
extern uchar lowd;
/******************************************************************************
*时钟线:PA.4
*数据线:PA.3
*采用温度14位,湿度12位
*******************************************************************************/
#define SHTSCK_SET GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define SHTSCK_CLR GPIO_ResetBits(GPIOA, GPIO_Pin_4)

#define SHTDA_SET  GPIO_SetBits(GPIOA, GPIO_Pin_3)
#define SHTDA_CLR  GPIO_ResetBits(GPIOA, GPIO_Pin_3)

//返回0,和1
#define SHTDA_IN  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)

#define SHTWRITE       0x80   //地址1000 000   0表示写
#define SHTREAD        0x81   //               1表示读
#define RH_Master  0xe5  //主机模式湿度测量
#define T_Master   0xe3  //主机模式温度测量
#define SHT_RST    0xfe  //软件复位
//#define   _MOP()   _NOP()
//针对不同的频率使用不同的延时。本次调试匹配频率为 1M
//使用非主机模式更省电
void SHT21_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  /* Configure I2C1 pins: SCL and SDA */
  RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOA, ENABLE);   
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出,可以在不用改变成输入的情况下读取IO的电平
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  SHTSCK_SET;
  SHTDA_SET;
}
void sht_delay(unsigned char us)
{
unsigned char tmp;
while(us--)
{
for(tmp=0;tmp<100;tmp++)
{
__nop();
}
}
}
//******************************StateI2C**************************************
//**************************单片机启动信号************************************
void StateI2C(void)
{
  sht_delay(80);
  SHTDA_SET;
  SHTSCK_SET;
  sht_delay(30);
  SHTDA_CLR;
  SHTSCK_CLR;
  sht_delay(30);
}
//******************************STOPI2C**************************************
//**************************单片机结束信号***********************************
void STOPI2C(void)
{
  SHTDA_CLR;
  SHTSCK_SET;
  sht_delay(30);
  SHTDA_SET;
  sht_delay(30);
}
//******************************STOPI2C**************************************
//***************************单片机回应从机**********************************
void Response(uchar a)
{
  if(a==0) SHTDA_CLR;   //主机“应答”继续传输
  else  SHTDA_SET;      //“非应答”表示数据传输结束  
  SHTSCK_SET;
  SHTSCK_CLR;
 }
//********************单片机输出 1byte 数据******************************
void SHT_Master_byte2(uchar byte)
{
  uchar i;
  SHTSCK_CLR;  
  SHTDA_CLR;
  for(i=0;i<8;i++)
  {
    if(byte&0X80) SHTDA_SET;
    else SHTDA_CLR;
    SHTSCK_SET;
    sht_delay(80);
    SHTSCK_CLR;   
    sht_delay(80);
    byte*=2;     //左移一位
  }
  SHTSCK_SET; 
  sht_delay(10);
  SHTSCK_CLR;
  sht_delay(10);  
}
//********************单片机输出 1byte 数据******************************
uchar SHT_Master_byte(uchar byte)
{
  uchar i;
  uchar ack=0;
  SHTSCK_CLR;  
  SHTDA_CLR;
  for(i=0;i<8;i++)
  {
    if(byte&0x80) SHTDA_SET;
    else SHTDA_CLR;
    SHTSCK_SET;
    sht_delay(80);
    SHTSCK_CLR;   
    sht_delay(80);
    byte*=2;     //左移一位
  }
  SHTSCK_SET;  
  if(SHTDA_IN) ack=1;     //回应
  SHTSCK_CLR;  
  return(ack);
}


//********************从机输出1byte 数据******************************
uchar SHT_Receiver_byte(void)
{
  uchar aaa=0,i;
  for(i=0;i<8;i++)
  {
    aaa*=2; 
    SHTSCK_SET;   
    if(SHTDA_IN) aaa+=1;
    SHTSCK_CLR;    
  }
  return(aaa);
}
//**************************非主机模式温度测试*****************************
float temp()
{
  float wendu,tt;
  uint  aaa=0;
  uchar ack;
  uchar tem1,tem2;
  StateI2C();                            
   SHT_Master_byte2(0x80);   //地址+写
   SHT_Master_byte2(0xf3);   //命令:非主机温度测试
  
    
   do
   {
     sht_delay(20);               
     StateI2C();
     ack = SHT_Master_byte(0x81);   //命令:读取数据。。等待回应
   }
   while(ack==1);
    sht_delay(20);
    sht_delay(20);
   tem1=SHT_Receiver_byte();   //读取数据高八位
   sht_delay(20);
   Response(0);               //单片机回应
   tem2 = SHT_Receiver_byte();    //读取数据低八位
   STOPI2C();
   aaa = (aaa|tem1)*256+tem2;
   aaa = aaa & 0xfffc;
   tt=(float)( aaa * 0.02681);
   wendu =( tt -468.5)/10;
 /*  if(wendu>0)
   {
      lowd=0x01;
      aaa=(int)(wendu);
      return(aaa);
   }
    else
    {
     lowd=0x02;
     aaa=abs(wendu);
     return(aaa);
    }  */
return(wendu);   
}
//**************************非主机模式湿度测试*****************************
float humi()
{
  float sdd,sd;
  uint  aaa=0;
  uchar ack;
  uchar tem1,tem2;
  StateI2C();                               
   SHT_Master_byte2(0x80);  //地址+写
   SHT_Master_byte2(0xf5);   //命令:非主机湿度测试
   do
   {
    sht_delay(20);
     StateI2C();
     ack = SHT_Master_byte(0x81);    //命令:读取数据。。等待回应
   }
   while(ack==1);
   tem1=SHT_Receiver_byte();  //读取数据高八位
   Response(0);        //单片机回应
   tem2 = SHT_Receiver_byte();  //读取数据低八位
   STOPI2C();
   aaa = (aaa|tem1)*256+tem2;
   aaa = aaa & 0xfffc;
   sd=(float)(aaa * 0.00190735);
   sdd=(sd-6);
   //aaa =(int)((aaa * 0.00190735 -6)*10);  
   //if(aaa>998)aaa=999;///防止湿度超过100%
   return(sdd);
}
//****************************读用户寄存器***********************************
unsigned char read_Register()    
{
  uchar aaa=0 ,ack=0;
  StateI2C();                 
  ack = SHT_Master_byte(0x80);
  ack = SHT_Master_byte(0xE7);  //命令:读寄存 
  StateI2C(); 
  ack = SHT_Master_byte(0x81);
  if(ack) return(ack);   //返回 1 读操作失败了
  aaa = SHT_Receiver_byte();
  STOPI2C();
  return(aaa); 
}

//****************************写用户寄存器***********************************
uchar write_Register(uchar aaa)   //不能随便写,默认位不能改   ,先读出来默认位
{
  uchar ack=0;
  StateI2C();             //写寄存器
  ack = SHT_Master_byte(0x80);
  ack = SHT_Master_byte(0xE6);
  ack = SHT_Master_byte(aaa);    //不能随便写,默认位不能改
  STOPI2C();  
  return(ack);   //返回 1 写操作失败
}
/****************************************************************************** 
函数名称:SH11返回温度函数
修改日期: 
入口参数:无
返回值: 无 
******************************************************************************/
float tep(void)
{  
       float TEMP=0; 
       TEMP= temp();
        return TEMP;
}
/****************************************************************************** 
函数名称:SH11返回湿度函数
修改日期: 
入口参数:无
返回值: 无 
******************************************************************************/
float hui(void)
{
        float HUMI=0; 
        HUMI=  humi();
        return HUMI;
}
我就是我,我就是想飞的毛驴!O(∩_∩)O~~~~~
回复 支持 反对

使用道具 举报

43

主题

152

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-8-11
在线时间
57 小时
发表于 2014-5-5 17:22:06 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
#include "dht11.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////  
//±????ò?????§?°??????????×÷???í???????????????ü????????
//ALIENTEK????STM32??·?°?
//DHT11??×????????????÷?????ú??    
//??????×?@ALIENTEK
//????????:www.openedv.com
//????????:2012/9/12
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ?????????í??×????????????? 2009-2019
//All rights reserved   
//////////////////////////////////////////////////////////////////////////////////
    
//????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])==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;    //????PORTG???±?? 
GPIOG->CRH&=0XFFFF0FFF;//PORTG.11 ???ì????
GPIOG->CRH|=0X00003000;
GPIOG->ODR|=1<<11;      //????1     
DHT11_Rst();
return DHT11_Check();
}
你看dth11_init函数里先是对GPIOG->CR H定义,然后到DHT->Rst函数里,后面这个函数里还有一个DHT11_IO_IN();这个是头文件里给定义的,这个也是对此IO相同的定义,当然这样没错,只是效率低了。重复无用功
回复 支持 反对

使用道具 举报

43

主题

152

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-8-11
在线时间
57 小时
发表于 2014-5-5 17:22:39 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
这是头文件
#define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
////IO??×÷????    
#define DHT11_DQ_OUT Gout(11) //???????? PG11 
#define DHT11_DQ_IN  Gin(11)  //???????? PG11
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-9-28
在线时间
0 小时
发表于 2014-6-10 16:50:23 | 显示全部楼层
回复【19楼】981108685@qq.com:
---------------------------------
我的跟你一样,DHT11_Check 总是检查不到DHT11的存在,你的解决了没?
求分享!!!在逻辑分析仪可以看到时序。但就是卡在CHECK。
回复 支持 反对

使用道具 举报

0

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-21
在线时间
4 小时
发表于 2014-9-17 13:03:49 | 显示全部楼层
回复【20楼】飞思卡驴:
---------------------------------
你好 能否把工程文件共享一下  遇到问题 调不成
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-5-11
在线时间
0 小时
发表于 2015-5-11 15:08:32 | 显示全部楼层
回复【20楼】飞思卡驴:
-------------------------------
我移植了程序不能用啊,程序执行到这个模块就停止了。我想用串口在电脑显示温度和湿度,求高手指点。
交流技术,认识朋友。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-5-11
在线时间
0 小时
发表于 2015-5-11 15:10:11 | 显示全部楼层
回复【25楼】lmc123ms:
---------------------------------
那个匹配频率1M,是什么意思,不懂。我晶振用的是8M.
交流技术,认识朋友。
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-7-2 09:27:05 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
请问下,我用的是你的DHT11的代码,只是我设计的板子,接在了PA15上,
#define DHT11_IO_IN()  {GPIOA->CRH&=0x0FFFFFFF;GPIOA->CRH|=8<<28;} //PA15
#define DHT11_IO_OUT() {GPIOA->CRH&=0x0FFFFFFF;GPIOA->CRH|=3<<28;} //PA15
这样修改之后,编译出现2个警告
..\HARDWARE\DHT11\dht11.c(32): warning:  #61-D: integer operation result is out of range
..\HARDWARE\DHT11\dht11.c(32): warning:  #68-D: integer conversion resulted in a change of sign
然后我把它改为
#define DHT11_IO_IN()  {GPIOA->CRH&=0x0FFFFFFF;GPIOA->CRH|=0x80000000;}没有出现警告,
但是程序一直检测不到DHT11,改与不改都是检测不到,您接的是PG11,我换成PA11是可以的,换到PA15上就不行了,这是什么原因啊??
编译的警告,我知道是什么意思,但是如图,PG11您右移的是12位,那么我PA15就应该右移的是28位,可为什么会出现警告?

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-7-2 21:42:48 | 显示全部楼层
回复【27楼】精神不死6530:
---------------------------------
 不理会,或者加(u32)强制转换试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2013-3-19
在线时间
20 小时
发表于 2015-7-3 09:32:25 | 显示全部楼层
回复【28楼】正点原子:
---------------------------------
2个警告变为一个警告,还是这样写得了。#define DHT11_IO_IN()  {GPIOA->CRH&=0x0FFFFFFF;GPIOA->CRH|=0x80000000;}
回复 支持 反对

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2015-7-29
在线时间
0 小时
发表于 2015-11-8 19:01:22 | 显示全部楼层
用ucosii写的 之前单任务调试时候的DHT11程序可以也有数值显示! 现在加了个任务就悲剧了! 在定时器中调用SHT11程序! 这是什么问题导致的?
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2015-11-8 19:39:37 | 显示全部楼层
回复【28楼】正点原子:
---------------------------------
 原子哥,用你的程序当IO口为输入配置成上下拉不行,配置为浮空输入就可以,这是怎么回事
最近爱上了stm32
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-11-8 22:08:29 | 显示全部楼层
回复【31楼】带我足够强大:
---------------------------------
没遇到过啊.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-4-20
在线时间
2 小时
发表于 2016-4-20 09:39:48 | 显示全部楼层
您好,请问您这是完整的代码吗
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-4-10
在线时间
3 小时
发表于 2016-5-4 21:02:40 | 显示全部楼层
我今天也参照上面的思想把DHT22的程序的写出来了,我之前DHT22是用TIM2的CH3的输入捕获功能做的,我想用捕获模式来取得DHT22返回数据信号的高电平脉宽,然后通过对脉宽进行判断,若在80us左右就为1,若在26~28us左右就是0,但是为啥在运行的时候感觉一直进不了捕获中断呢?用Jlink仿真也进不来TIM2的中断(我使能了CC3IE捕获使能的,但是我没有使能更新中断,因为我觉得此处只用到了捕获),为啥进不了中断呢?
用输入捕获模式的代码都是我自己写的,调了2,3天用输入捕获模式还是没调出来,泪崩,有人能给解释下么
是因为我DHT22外部SDA引脚直接连到GPIO上,没接上拉电阻的原因么
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-8-12
在线时间
6 小时
发表于 2016-8-14 15:47:41 | 显示全部楼层

你好,请问这些注释有什么用呢?

你好,请问这些注释有什么用呢?
你好,请问这些注释在提示什么?貌似没什么关系跟这个函数。。。小白不懂,大神别介,还望赐教
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-9-12
在线时间
8 小时
发表于 2016-11-28 15:02:44 | 显示全部楼层
谢谢楼主分享!好东西!
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-6-7
在线时间
1 小时
发表于 2018-6-8 10:27:46 | 显示全部楼层
该代码可以应用于STM32F103C8T6吗?连线怎么连呢?
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-6-8 11:55:56 | 显示全部楼层
fdf888 发表于 2018-6-8 10:27
该代码可以应用于STM32F103C8T6吗?连线怎么连呢?

这个你看代码中用的IO引脚是什么 然后你这边新建基于C8T6的工程,并复制DHT11部分的代码到你的工程。接线的时候你就按照代码定义的数据引脚来接。比如代码定义PA11接的数据引脚那么你 PA11接DHT11的数据引脚
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2018-6-7
在线时间
1 小时
发表于 2018-6-11 16:59:58 | 显示全部楼层
peng1554 发表于 2018-6-8 11:55
这个你看代码中用的IO引脚是什么 然后你这边新建基于C8T6的工程,并复制DHT11部分的代码到你的工程。接线 ...

全部代码都移植到新的工程里吗?还是只移植定义DHT11的部分,其他的得自己写?
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10561
金钱
10561
注册时间
2017-2-18
在线时间
1912 小时
发表于 2018-6-11 18:42:23 | 显示全部楼层
fdf888 发表于 2018-6-11 16:59
全部代码都移植到新的工程里吗?还是只移植定义DHT11的部分,其他的得自己写?

移植DHT11部分
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-11-9
在线时间
1 小时
发表于 2019-11-9 14:50:26 | 显示全部楼层
为什么我用原子哥的程序一直卡在检测那里了,一直检测不到dht11的存在
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-4-25
在线时间
4 小时
发表于 2020-4-25 11:57:55 | 显示全部楼层
多谢大佬
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-3-10
在线时间
3 小时
发表于 2022-3-10 16:21:52 来自手机 | 显示全部楼层
981108685@qq.co 发表于 2014-4-21 21:33
**** 作者被禁止或删除 内容自动屏蔽 ****

我也是,怎么解决啊
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-3-10
在线时间
3 小时
发表于 2022-3-10 16:22:28 来自手机 | 显示全部楼层
981108685@qq.co 发表于 2014-4-21 21:33
**** 作者被禁止或删除 内容自动屏蔽 ****

!!!!!
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2022-3-10
在线时间
3 小时
发表于 2022-3-10 16:22:54 来自手机 | 显示全部楼层
电子小 发表于 2019-11-9 14:50
为什么我用原子哥的程序一直卡在检测那里了,一直检测不到dht11的存在

我也是,怎么解决啊
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-3-30
在线时间
4 小时
发表于 2022-3-31 22:15:04 | 显示全部楼层
我用的OLED屏,读取出DHT11数据时温度一直是127,湿度一直是0是咋回事啊?用的提供的dht11.c、dht11.h例程
  1. while(1) {
  2.                 if(t%10==0)                       
  3.                 {
  4.                         if(!DHT11_Read_Data(&temperature,&humidity))               
  5.                         {
  6.                                 OLED_ShowNum(70,36,temperature,4,12);
  7.                                 OLED_ShowNum(70,48,humidity,4,12);
  8.                         }        else {
  9.                                 OLED_ShowString(0,36,"READ DATE ERROR",12);
  10.                         }
  11.                         OLED_Refresh_Gram();
  12.                 }
  13.                 delay_ms(10);
  14.                 t++;
  15.                 if(t==20)
  16.                 {
  17.                         t=0;
  18.                         LED0=!LED0;
  19.                 }
  20.         }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 17:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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