OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 187|回复: 4

用STM32F407采集AM2302数据,如何正确的编写主机起始信号程序,和传感器响应信号的程序。

[复制链接]

  离线 

22

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-30
在线时间
33 小时
发表于 2018-6-14 16:03:57 | 显示全部楼层 |阅读模式
10金钱

这是需要的IO设置,程序后面有我的疑问
//IO方向设置
#define DHT22_IO_IN()  {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;}        //PG9输入模式
#define DHT22_IO_OUT() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;}         //PG9输出模式
////IO操作函数                                                                                          
#define        DHT22_DQ_OUT PGout(9) //数据端口        PG9
#define        DHT22_DQ_IN  PGin(9)  //数据端口        PG9

//复位DHT22,2S的启动延时
void DHT22_Rst(void)          
{
        DHT22_IO_IN() ;//设置为输入模式,这样上拉电阻拉高一直保持高电平,在2秒期间,不进行任何操作。
        delay_ms(2000);       
}

void Read_DHT22(void)//这一部分仅写出主机起始信号和传感器响应信号部分
{
        u8 t = 0;
        DHT22_IO_OUT();         //设置为输出模式
        DHT22_DQ_OUT=0;         //输出低电平
         delay_ms(1);                //拉低至少1ms(典型值)
       
        DHT22_IO_IN();//设置为输入状态,此时,由于上拉电阻的作用,会自动把电平拉高,这么说不是说的对不对????       
        delay_us(30);             //延时20~40us,等待从机发送响应信号
                while (DHT22_DQ_IN == 0)//轮询为80us的低电平后跳出循环,时序图上说明会输出80us的低电平作为应答信号。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的低电平
                t = 0;
                while (DHT22_DQ_IN == 1)//轮询80us后跳出来,输出80us的高电平通知外设准备接受数据。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的高电平,,,这段程序遇到的主要问题是,我的程序直接死在了while (DHT22_DQ_IN == 1);这个循环里面。
       
        //响应结束,开始读取数据。


       在拉低1MS后,“微处理器的I/O 设置为输入状态,释放总线,由于上拉电阻,微处理器的I/O 即AM2302的SDA 数据线也随之变高,等主机释放总线后,AM2302 发送响应信号”,在AM2302发送响应信号之前,
前面的表述是不是用一个程序代码可以实现,即:DHT22_IO_IN();//设置为输入状态,这样就实现了总线的释放和上拉电阻的拉高吗???而不需要人为的去设定为高电平,我见在学习板上DHT11程序中,是人为拉高的。
这是我的一个疑问。
       另外一个疑问是,在附着的两张图中,图6 和图7中,粗线都是表示的主机信号,细线都是表示的传感器信号。这种细节需要我们在写程序的时候注意吗???
       请大家提出自己的见解和帮助。谢谢了!!!


222222.png
111111111.png
回复

使用道具 举报

  离线 

22

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-30
在线时间
33 小时
 楼主| 发表于 2018-6-14 16:14:38 | 显示全部楼层
补充一下,这是另外的程序,这样就完整了。

u8 DHT22_Read_Bit(void) //读一位                         
{     
       while(DHT22_DQ_IN == 0);//   直到电平拉高后跳出
        delay_us(40);
        if(DHT22_DQ_IN == 1)//保证度过了70us的高电平。
                return 1;
        else
                return 0;
}

u8 DHT22_Read_Byte(void) //读一个字节   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                  
            dat|=DHT22_Read_Bit();
                        dat<<=1;
  }                                                    
    return dat;
}
         //开始读取数据
           Humi_H=DHT22_Read_Byte();          //湿度的高8位数据
           Humi_L=DHT22_Read_Byte();          //湿度的低8位数据
           Temp_H=DHT22_Read_Byte();          //温度的高8位数据
           Temp_L=DHT22_Read_Byte();          //温度的低8位数据
           Check_data=DHT22_Read_Byte();                //校验字节数据

这个图片是我程序运行的效果,指示灯一直在闪烁,说明程序一直在运行,但是我的温湿度数据一直是0.不知怎么回事。


333333.jpg
回复

使用道具 举报

  离线 

505

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
131558
金钱
131558
注册时间
2010-12-1
在线时间
1207 小时
发表于 2018-6-15 01:38:47 | 显示全部楼层
没驱动过这个DHT22,有时间试试吧
回复

使用道具 举报

  离线 

22

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-30
在线时间
33 小时
 楼主| 发表于 2018-6-15 08:49:29 | 显示全部楼层
正点原子 发表于 2018-6-15 01:38
没驱动过这个DHT22,有时间试试吧

原子哥,有时间你也调试一下,和课件上的DHT11挺类似的,但是我却调试不好。
回复

使用道具 举报

  离线 

22

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2017-10-30
在线时间
33 小时
 楼主| 发表于 2018-6-15 08:50:25 | 显示全部楼层
正点原子公众号
帮自己顶一下,欢迎大家的讨论。
回复

使用道具 举报

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

本版积分规则




关闭

必看:"原子哥”力荐上一条 /1 下一条

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

GMT+8, 2018-8-18 05:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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