打印
[AVR单片机]

用mega32写一个DHT11的数据采集程序,但是调试了几天依然是毫无现象,特来论坛求救~

[复制链接]
2646|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liboybo|  楼主 | 2012-12-23 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现附上程序,往各位大神帮助解决~
注“用的是AVR-GCC的库延时函数”

#include<avr/io.h>
#include<util/delay.h>
#define uchar unsigned char
int  main(void)
{

          uchar p=0;
          for(p=0;p<100;p++)
               _delay_ms(15);
                  
   
    while(1)

             {
                         /* uchar i=0,j=0,k=0,Temp=0,temp=0,Humid=0,Temper=0,Data=0;
                      uchar DHTData[5]={};     //存储采集到的温湿度数
                      uchar Display[4]={};     //提取在数码管上显示的数值
                           DHTOUT;                  //设置PB4为输出状
                           CLR_DHT;                 //设置PB4为低电平
                      _delay_ms(12);            //MCU发送启动信号;拉低至少18ms
                                                 _delay_ms(12);
                          DHTIN;
                          _delay_us(30);               //主机拉高20-40us
                               temp=PINB;               //主机拉高20-40us
                                                 Temp=temp&0X10;
                       if(Temp==0X00)                  //如果接收到DHT11发送的80?s低电平
                              {
                                        while(!Temp);       //等待响应信号结束
                                                Temp=temp&0X10;
                                        while(Temp);        //等待准备信号结束
                                         for(i=0;i<5;i++)  //读取五个字节数据
                                                {
                                                   for(j=0;j<8;j++)
                                                {

                                                                      Data=0;
                                                                          temp=PINB;
                                                                      Temp=temp&0X10;  //防止其他位的干扰
                                                                      while(!Temp);       //等待50us低电平过去,等高电平到来
                                                                      _delay_us(35);       //延时35us ,延时必须(26-28us)
                                                                      Data<<=1;
                                                                          Temp=temp&0X10;  
                                                                      if(Temp)            //如果35us以后采集到数据还是高电平,则输出为高电平
                                                                        {
                                                                          Data|=0x01;
                                                                        }
                                                                      else
                                                                            {
                                                                          Data|=0x00;
                                                                                 }
                                            Temp=temp&0X10;
                                                                         while(Temp);    //等50us低电平到来 ,然后去读下一位数据
                                 
                              
                                                                     }

                                                                         DHTData[i]=Data;
          
                                                 }

                           

                                    }
                                               Humid=DHTData[0];             //提取湿度值 humidity
                                                   Temper=DHTData[2];            //提取温度值 temperature
                                           Display[0]=Temper/10;         //提取温度的十位数
                                                   Display[1]=Temper%10;         //提取温度的个位数
                                                   Display[2]=Humid/10;          //提取湿度的十位数
                                           Display[3]=Humid%10;          //提取湿度的十位数

                                       
                                                  
                                */

相关帖子

沙发
liboybo|  楼主 | 2012-12-23 18:15 | 只看该作者
补充一下宏定义:
/****************************分配DHT11控制引脚************************/
//#define DHTOUT  (DDRB|=(1<<PB4))    //定义PB4的方向
//#define DHTIN   (DDRB&=~(1<<PB4))  
//#define SET_DHT (PORTB|=(1<<PB4))   //定义PB4电平
//#define CLR_DHT (PORTB&=~(1<<PB4))   //定义PB4电平
用的是PB4引脚采集数据

使用特权

评论回复
板凳
dqyubsh| | 2012-12-23 19:58 | 只看该作者
没见你给F_CPU赋值,用的是内部1M晶振?这个用示波器观察啊,应该没什么难度。

使用特权

评论回复
地板
wlc824136| | 2014-10-11 13:05 | 只看该作者
while(!temp)后面的分号不要吧,不然temp就只取了一次值

使用特权

评论回复
5
ningling_21| | 2014-10-12 22:55 | 只看该作者
用示波器看看波形,和芯片手册里的对比一下...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

1

粉丝