欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 求助!stm32F4驅動DS18B20溫度傳感器溫度變化緩慢的問題 [打印本頁]

作者: lzjino    時間: 2019-8-1 10:56
標題: 求助!stm32F4驅動DS18B20溫度傳感器溫度變化緩慢的問題
我用的是stm32F407VET6板子,接傳感器ds18b20和dht11測溫濕度,在lcd12864顯示數據,lcd上濕度數據可以正常刷新,但溫度數據隔很久才刷新一次,而且溫度數據延遲很久,給ds18b20加熱過四十多秒溫度才變化一次,請問有大神幫幫我看一下代碼嗎?謝謝!
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "dht11.h"
  7. #include "ds18b20.h"

  8. __align(4) u8 dtbuf[50];                                                                   //字符串緩存數組  

  9. int main(void)
  10. {
  11.        
  12.         u8 tmp,humi;                                //dht11溫濕度
  13.         short temp;                                //ds18b20溫度
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
  15.         delay_init(168);  /
  16.         uart_init(38400);                /
  17.         InitDis();                                //LCD初始化
  18.        
  19.         DS18B20_Init();

  20.         while(DHT11_Init())
  21.         {
  22.                 lcd_DisStr(1,0,"DHT11 Error    ");
  23.                 delay_ms(200);
  24.                 lcd_clear();
  25.                 delay_ms(200);
  26.         }
  27.        
  28.         while(1)
  29.         {       
  30.                 temp = DS18B20_Get_Temp();        //讀取ds18b20溫度
  31.                 DHT11_Read_Data(&tmp,&humi);        //讀取dht11濕度
  32.        
  33.                 //printf("溫度: %3.1f C  濕度: %2d %%\r\n",temp,humi);  //串口調試用

  34.                         lcd_DisStr(1,0," Temp Humi is OK");
  35.                         lcd_DisStr(2,0,"                     ");
  36.                         sprintf((char *)dtbuf,"溫度: %3.1f C     ",(double)temp/10);        //格式化字符串緩存
  37.                         lcd_DisStr(3,0,dtbuf);    //LCD顯示
  38.                         sprintf((char *)dtbuf,"濕度: %2d %%      ",humi);        //格式化字符串緩存
  39.                         lcd_DisStr(4,0,dtbuf);    //LCD顯示
  40.         }        
  41. }
復制代碼
ds18b20.h

  1. #ifndef __DS18B20_H
  2. #define __DS18B20_H
  3. #include "sys.h"
復制代碼
ds18b20.c
#include "ds18b20.h"
#include "delay.h"       

void DS18B20_Rst(void)          
{                 
        DS18B20_IO_OUT(); //SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; //à-μíDQ
  delay_us(750);    //à-μí750us
  DS18B20_DQ_OUT=1; //DQ=1
        delay_us(15);     //15US
}


u8 DS18B20_Check(void)           
{   
        u8 retry=0;
        DS18B20_IO_IN();//SET PG11 INPUT         
    while (DS18B20_DQ_IN&&retry<200)
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=200)return 1;
        else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
        {
                retry++;
                delay_us(1);
        };
        if(retry>=240)return 1;            
        return 0;
}


u8 DS18B20_Read_Bit(void)                          // read one bit
{
  u8 data;
        DS18B20_IO_OUT();//SET PG11 OUTPUT
  DS18B20_DQ_OUT=0;
        delay_us(2);
  DS18B20_DQ_OUT=1;
        DS18B20_IO_IN();//SET PG11 INPUT
        delay_us(12);
        if(DS18B20_DQ_IN)data=1;
  else data=0;         
  delay_us(50);           
  return data;
}


u8 DS18B20_Read_Byte(void)    // read one byte
{        
    u8 i,j,dat;
    dat=0;
        for (i=1;i<=8;i++)
        {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }                                                    
    return dat;
}


void DS18B20_Write_Byte(u8 dat)     
{            
    u8 j;
    u8 testb;
          DS18B20_IO_OUT();//SET PG11 OUTPUT;
    for (j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;// Write 1
            delay_us(2);                           
            DS18B20_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_DQ_OUT=0;// Write 0
            delay_us(60);            
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}


void DS18B20_Start(void)// ds1820 start convert
{                                                                 
    DS18B20_Rst();          
          DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}
u8 DS18B20_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE)

  //GPIOC3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP
  GPIO_Init(GPIOC, &GPIO_InitStructure)

        DS18B20_Rst();
        return DS18B20_Check();
}

short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
          short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert            
    TL=DS18B20_Read_Byte(); // LSB   
    TH=DS18B20_Read_Byte(); // MSB   
    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;/ 溫度為負
    }else temp=1;//溫度為正
    tem=TH; //獲取高八位
    tem<<=8;   
    tem+=TL;//低八位
    tem=(double)tem*0.625;//轉換
        if(temp)return tem; //返回溫度值
        else return -tem;   
}








作者: 沒有你    時間: 2019-8-1 13:39
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你看看是否多次出現超時情況
作者: lzjino    時間: 2019-8-1 17:35
沒有你 發表于 2019-8-1 13:39
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你 ...

謝謝大佬的提示,發現問題了,是我用sprintf函數存字符串緩存太耗時間了,主程序執行時間明顯變長,不知道為什么相同刷新頻率下ds18b20的溫度變化時間比dht11濕度變化時間久,難道是ds18b20讀取很多次失敗了?
作者: lzjino    時間: 2019-8-1 22:47
沒有你 發表于 2019-8-1 13:39
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你 ...

謝謝提示!查了一下發現加入 lcd_DisStr()輸出字符串會使串口調試時溫度的刷新時間明顯變長,濕度刷新三四次就可以讓它變化,不知道為什么溫度刷新十幾次才變化一次數據?
作者: 這一生只為你    時間: 2019-8-2 09:39
我前陣子用OLED做顯示也用到過類似的情況,刷新太慢,后來仔細查找問題,發現就是顯示函數拖時間了,但是怎么修改OLED驅動程序也不行。后來解決問題了,就是固定不變的顯示內容提前輸出,并且在while循壞外,不參與刷新顯示,只有變量在while內參與實時刷新,速度一下子就提上來了。
作者: 沒有你    時間: 2019-8-2 11:04
lzjino 發表于 2019-8-1 22:47
謝謝提示!查了一下發現加入 lcd_DisStr()輸出字符串會使串口調試時溫度的刷新時間明顯變長,濕度刷新 ...

能解決問題就好
作者: aaaaaa。    時間: 2019-8-2 14:06
一般程序遇到問題,你最先做的事就是仿真,看看哪里出問題了




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1