OpenEdv-开源电子网

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

基于STM32F103进行4路DHT温度湿度测量

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-11-6
在线时间
3 小时
发表于 2016-11-6 19:17:28 | 显示全部楼层 |阅读模式
5金钱
使用STM32F103进行4路DHT温度湿度测量,已经有了1路DHT温度湿度测量程序,怎样在此基础之上进行4路温度湿度测量。
主函数:

int main(void)
{         
        u8 t=0;                            
        u8 temperature;              
        u8 humidity;              

        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200
        LED_Init();                                  //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
        LCD_Init();                                   //3õê¼»ˉLCD  
        POINT_COLOR=RED;                //éèÖÃ×ÖìåÎaoìé«
        LCD_ShowString(30,50,200,16,16,"WarShip STM32");       
        LCD_ShowString(30,70,200,16,16,"DHT11 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/1/16");                  
        while(DHT11_Init())        //DHT113õê¼»ˉ       
        {
                LCD_ShowString(30,130,200,16,16,"DHT11 Error");
                delay_ms(200);
                LCD_Fill(30,130,239,130+16,WHITE);
                delay_ms(200);
        }                                                                  
        LCD_ShowString(30,130,200,16,16,"DHT11 OK");
        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«
        LCD_ShowString(30,150,200,16,16,"Temp:  C");         
        LCD_ShowString(30,170,200,16,16,"Humi:  %");         
        while(1)
        {                        
                if(t%10==0)                        //ÿ100ms¶áè¡ò»′Î
                {                                                                          
                        DHT11_Read_Data(&temperature,&humidity);        //¶áè¡ÎÂêa¶èÖμ                                            
                        LCD_ShowNum(30+40,150,temperature,2,16);        //ÏÔê¾ÎÂ¶è                             
                        LCD_ShowNum(30+40,170,humidity,2,16);                //ÏÔê¾êa¶è                   
                }                                  
                 delay_ms(10);
                t++;
                if(t==20)
                {
                        t=0;
                        LED0=!LED0;
                }
        }
}

DHT函数:
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
}
//μè′yDHT11μÄ»Øó|
//·μ»Ø1:Î′¼ì2aμ½DHT11μÄ′æÔú
//·μ»Ø0:′æÔú
u8 DHT11_Check(void)           
{   
        u8 retry=0;
        DHT11_IO_IN();//SET INPUT         
    while (DHT11_DQ_IN&&retry<100)//DHT11&#187;áà-μí40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11à-μíoó&#187;á&#212;ù′&#206;à-&#184;&#223;40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}
//′óDHT11&#182;áè&#161;ò&#187;&#184;&#246;&#206;&#187;
//·μ&#187;&#216;&#214;μ£o1/0
u8 DHT11_Read_Bit(void)                          
{
        u8 retry=0;
        while(DHT11_DQ_IN&&retry<100)//μè′y±&#228;&#206;aμíμ&#231;&#198;&#189;
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_DQ_IN&&retry<100)//μè′y±&#228;&#184;&#223;μ&#231;&#198;&#189;
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//μè′y40us
        if(DHT11_DQ_IN)return 1;
        else return 0;                  
}
//′óDHT11&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
//·μ&#187;&#216;&#214;μ£o&#182;áμ&#189;μ&#196;êy&#190;Y
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&#182;áè&#161;ò&#187;′&#206;êy&#190;Y
//temp:&#206;&#194;&#182;è&#214;μ(·&#182;&#206;§:0~50&#161;&#227;)
//humi:êa&#182;è&#214;μ(·&#182;&#206;§:20%~90%)
//·μ&#187;&#216;&#214;μ£o0,&#213;y3£;1,&#182;áè&#161;ê§°ü
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++)//&#182;áè&#161;40&#206;&#187;êy&#190;Y
                {
                        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;            
}
//3&#245;ê&#188;&#187;ˉDHT11μ&#196;IO&#191;ú DQ í&#172;ê±&#188;ì2aDHT11μ&#196;′&#230;&#212;ú
//·μ&#187;&#216;1:2&#187;′&#230;&#212;ú
//·μ&#187;&#216;0:′&#230;&#212;ú             
u8 DHT11_Init(void)
{         
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);         //ê1&#196;üPG&#182;&#203;&#191;úê±&#214;ó
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                                 //PG11&#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);                                 //3&#245;ê&#188;&#187;ˉIO&#191;ú
        GPIO_SetBits(GPIOG,GPIO_Pin_11);                                                 //PG11 ê&#228;3&#246;&#184;&#223;
                            
        DHT11_Rst();  //&#184;′&#206;&#187;DHT11
        return DHT11_Check();//μè′yDHT11μ&#196;&#187;&#216;ó|
}

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

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-11-6
在线时间
3 小时
 楼主| 发表于 2016-11-6 19:17:58 | 显示全部楼层
回复

使用道具 举报

34

主题

388

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4090
金钱
4090
注册时间
2012-10-21
在线时间
642 小时
发表于 2016-11-7 09:26:17 | 显示全部楼层

最简单粗暴的方法就是DHT11的函数写四个,逐个读取
或者加上硬件电子模拟开关选择
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 00:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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