DHT11读出结果不对,求指教,谢谢1

2019-08-16 22:07发布

STM32驱动DHT11,读出的结果不对,看了好久,还是找不出问题在哪里相关的代码,我是修改51的程序所得

代码如下:
/********************
温湿度传感器DHT11
单总线SPI
DATA--PG11
外接电压5V
**********************/
#include"sys.h"
#include"delay.h"
#include"LCD.h"

#include"DHT11.h"

#define dataout PGout(11)
#define datain PGin(11)

u8 humidity, temperature;

void DataIN()
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);         //使能PG端口时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        ////PC8端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  //浮空输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOG, &GPIO_InitStructure);
}

void DataOUT()
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);         //使能PG端口时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        ////PC8端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_SetBits(GPIOG, GPIO_Pin_11);         //输出高电平
}

//*******初始化DHT11*******/
void initial_DHT11()
{       
        DataOUT();
        delay_ms(1000); //传感器上电后,等待1s越过不稳定状态,在此期间无需发送任何指令
        dataout=1;         //将数据总线拉高,数据总线默认为高电平,初始化可以不要
        delay_us(8);
        dataout=0;
    delay_us(20);
        dataout=1;
        delay_us(24);
}

//从DHT11读一个字节的数据
u8 readbyte_DHT11(void)
{
        u8 i,k;
        u8 readbyte= 0;
        for(i=0;i<8;i++)
        {
                while(!datain);
                delay_us(50);
                k= datain;
                if(k==1) readbyte|= 0x01;
                else readbyte&= 0xfe;
                while(datain);
                readbyte<<= 1;  
        }
        return (readbyte);       
}

void Process_DHT11(u8 *p, u8 *q)
{
        u8 humi_h, humi_l, tem_h, tem_l, checkdata;

        DataOUT();
        delay_ms(1000); //传感器上电后,等待1s越过不稳定状态,在此期间无需发送任何指令
        dataout=1;         //将数据总线拉高,数据总线默认为高电平,初始化可以不要


        //首先主机给一个起始信号

        delay_ms(20); //最初的高电平持续一段时间,
        dataout=0;       
        delay_ms(20);//总线至少拉低18ms,此处设置为20ms       
        dataout=1;
        delay_us(30); //再将总线拉高20-40us,此处设置为30us

        //接着,读取DHT11的响应信号
        DataIN();
        if(!datain)         //判断从机是否低电平应答
        {
                while(!datain);  //判断是否为低电平
                while(datain);          //判断总线是否拉高
                  
                humi_h= readbyte_DHT11(); //湿度高八位
                humi_l= readbyte_DHT11(); //湿度低八位
                tem_h= readbyte_DHT11();  //温度高八位
                tem_l= readbyte_DHT11();  //温度低八位
                checkdata= readbyte_DHT11(); //校验和数据

                DataOUT();
                dataout=0;
                delay_us(50);
                dataout=1;    //释放总线

        if(checkdata==(humi_h+humi_l+tem_h+tem_l)) //检验校验是否正确
                {
                        *p= humi_h;
                        *q= tem_h;
                }
        }
}


void display_DHT11(void)
{
        u8 t=0;
        LCD_ShowString(30,150,200,16,16,"Humi:   %");
        LCD_ShowString(30,170,200,16,16,"Temp:   oC");
        while(1)
        {
                if(t%100==0)   //仿原子的写法
                {
                        Process_DHT11(&humidity, &temperature);
                        LCD_ShowNum(30+40,150,humidity,2,16);
                        LCD_ShowNum(30+40,170,temperature,2,16);
                }
                 delay_ms(20);
                t++;
        }
       
}







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
ljmf5
1楼-- · 2019-08-17 01:25
木有人??
lanmanck
2楼-- · 2019-08-17 06:11

一周热门 更多>