OpenEdv-开源电子网

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

关于msp430的DHT11程序,DHT11一直读数失败

[复制链接]

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2019-7-17
在线时间
12 小时
发表于 2019-11-7 22:35:36 | 显示全部楼层 |阅读模式
1金钱
移植原子32的程序读取数据一直失败

//IO方向设置
#define DHT11_IO_IN   P1DIR  &=~ BIT6//输入模式   DIR0时输入模式
#define DHT11_IO_OUT  P1DIR|=BIT6  //输出模式
////IO操作函数                                                                                          
#define        DHT11_DQ_OUT0   P1OUT  &=~  BIT6//输出0
#define        DHT11_DQ_OUT1   P1OUT  |=  BIT6 //输出1            
#define        DHT11_DQ_IN     P1IN   &  BIT6 //读输入的电平




void DHT11_Rst(void)        //复位DHT11  
{                 
        DHT11_IO_OUT;         //设置IO口为输出模式
    DHT11_DQ_OUT0;         //拉低DQ
    delay_us(9000);  //拉低至少18ms
    DHT11_DQ_OUT1;         //DQ=1
        delay_us(15);             //主机拉高20~40us

}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
unsigned char  DHT11_Check(void)           
{   
        unsigned char retry=0;
        DHT11_IO_IN;//SET INPUT         
    while (DHT11_DQ_IN&&retry<50)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=50)
          return 1;
        else
          retry=0;
    while (!DHT11_DQ_IN&&retry<50)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=50)
          return 1;            
        return 0;
}

//从DHT11读取一个位
//返回值:1/0
unsigned char  DHT11_Read_Bit(void)                          
{
        unsigned char retry=0;
        while(DHT11_DQ_IN&&retry<50)//等待变为低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<50)//等待变高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(20);//大概等待40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}
//从DHT11读取一个字节
//返回值:读到的数据
unsigned char  DHT11_Read_Byte(void)   
{        
    unsigned char 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,读取失败
unsigned char  DHT11_Read_Data(unsigned char *temp,unsigned char *humi)   
{        
        unsigned char buf[5];
        unsigned char i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf[i]=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:存在   
unsigned char DHT11_Init(void)//初始化DHT11
    {
        DHT11_IO_OUT;//P1.6设置为输出模式
        DHT11_DQ_OUT1;//p1.6输出高电平
        DHT11_Rst();  //复位DHT11
        return DHT11_Check();//等待DHT11的回应
    }


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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-29 04:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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