久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3793|回復: 6
收起左側

求助!stm32F4驅動DS18B20溫度傳感器溫度變化緩慢的問題

[復制鏈接]
ID:578205 發表于 2019-8-1 10:56 | 顯示全部樓層 |閱讀模式
我用的是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;   
}







回復

使用道具 舉報

ID:351097 發表于 2019-8-1 13:39 | 顯示全部樓層
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你看看是否多次出現超時情況
回復

使用道具 舉報

ID:578205 發表于 2019-8-1 17:35 | 顯示全部樓層
沒有你 發表于 2019-8-1 13:39
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你 ...

謝謝大佬的提示,發現問題了,是我用sprintf函數存字符串緩存太耗時間了,主程序執行時間明顯變長,不知道為什么相同刷新頻率下ds18b20的溫度變化時間比dht11濕度變化時間久,難道是ds18b20讀取很多次失敗了?
回復

使用道具 舉報

ID:578205 發表于 2019-8-1 22:47 | 顯示全部樓層
沒有你 發表于 2019-8-1 13:39
對while(1)里面程序單步仿真一下,看看哪一條語句執行費時間。DS18B20_Check(void)  里面有超時退出,你 ...

謝謝提示!查了一下發現加入 lcd_DisStr()輸出字符串會使串口調試時溫度的刷新時間明顯變長,濕度刷新三四次就可以讓它變化,不知道為什么溫度刷新十幾次才變化一次數據?
回復

使用道具 舉報

ID:403593 發表于 2019-8-2 09:39 | 顯示全部樓層
我前陣子用OLED做顯示也用到過類似的情況,刷新太慢,后來仔細查找問題,發現就是顯示函數拖時間了,但是怎么修改OLED驅動程序也不行。后來解決問題了,就是固定不變的顯示內容提前輸出,并且在while循壞外,不參與刷新顯示,只有變量在while內參與實時刷新,速度一下子就提上來了。
回復

使用道具 舉報

ID:351097 發表于 2019-8-2 11:04 | 顯示全部樓層
lzjino 發表于 2019-8-1 22:47
謝謝提示!查了一下發現加入 lcd_DisStr()輸出字符串會使串口調試時溫度的刷新時間明顯變長,濕度刷新 ...

能解決問題就好
回復

使用道具 舉報

ID:511461 發表于 2019-8-2 14:06 | 顯示全部樓層
一般程序遇到問題,你最先做的事就是仿真,看看哪里出問題了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91网站在线看 | 欧美日韩一区二区在线播放 | 欧美久久久久久久久 | 欧美日韩在线不卡 | 一区二区三区视频在线 | 91免费在线视频 | 欧美日日 | 亚洲精品一区二区 | 超碰av人人| 久久久久久99 | 中文字幕福利 | 91在线看 | 日韩欧美中文字幕在线视频 | 日日夜夜天天 | 久久久久久精 | 久久69精品久久久久久久电影好 | 天天干天天玩天天操 | 午夜影院视频在线观看 | 成人一区二区三区在线观看 | 狠狠操狠狠 | 婷婷国产一区二区三区 | 亚洲视频免费在线看 | 中文字幕一区二区三区四区五区 | av在线播放网址 | 97精品超碰一区二区三区 | 超碰最新在线 | 国产精品免费在线 | aa级毛片毛片免费观看久 | 国产精品美女一区二区 | 91久久久久 | 日本精品一区二区在线观看 | 午夜av电影| 亚洲精品一区国产精品 | 欧美11一13sex性hd | 亚洲a在线视频 | a级片播放| 91精品一区二区三区久久久久 | 粉嫩av在线 | 精品99久久 | 日韩一区二区三区四区五区六区 | 亚洲区一区二 |