標(biāo)題: DS18B20一直顯示0,實(shí)物仿真都不行,各位能不能幫我看看 [打印本頁]

作者: sanzi    時間: 2024-1-21 10:39
標(biāo)題: DS18B20一直顯示0,實(shí)物仿真都不行,各位能不能幫我看看
我做了一個STM32驅(qū)動DS18B20在LCD1602上顯示溫度,時序我檢查了沒問題,但是仿真和實(shí)物都不行,一直顯示0,各位大佬能不能幫幫我,感謝
DS18B20.C
void DS18B20_GPIO_Init(void)
{
                GPIO_InitTypeDef  GPIO_InitStructure;
      
                RCC_APB2PeriphClockCmd(RCC_DS18B20_PORT, ENABLE);         
               
                GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;                              
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);

                GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);   
}
u8 DS18B20_Init(void)
{
          unsigned char wait=0;
            
                DS18B20_IO_OUT();
         DS18B20_OUT_0;     
          delay_us(750);     
          DS18B20_OUT_1;     
          delay_us(15);      
          DS18B20_IO_IN();  
          while(READ_DS18B20_IO && wait++<200)delay_us(1);
          if(wait>=200)return 1;
          else wait=0;
          while(!READ_DS18B20_IO && wait++<240)delay_us(1);
          if(wait>=240)return 1;
          else return 0;
}
unsigned char DS18B20_ReadByte(void)
{
                unsigned char i;
    unsigned char dat = 0;

    for (i=0; i<8; i++)            
    {
        dat >>= 1;                 
                          DS18B20_IO_OUT();           
        DS18B20_OUT_0;              
        delay_us(2);               
        DS18B20_OUT_1;              
                          DS18B20_IO_IN();            
        delay_us(12);               
        if(READ_DS18B20_IO) dat |= 0x80;   
        delay_us(60);               
    }

    return dat;
}
void DS18B20_WriteByte(unsigned char dat)
{
          unsigned char i;
          unsigned char temp;
      
                DS18B20_IO_OUT();
    for (i=1; i<=8; i++)
                {
                                        temp = dat & 0x01;  
                                        dat  = dat >> 1;
                                        if (temp)
                                        {
                                                        DS18B20_OUT_0;
                                                        delay_us(2);                           
                                                        DS18B20_OUT_1;
                                                        delay_us(60);            
                                        }
                                        else
                                        {
                                                        DS18B20_OUT_0;
                                                        delay_us(60);            
                                                        DS18B20_OUT_1;
                                                        delay_us(2);                          
                                        }               
                }
}
float ReadTemperature(void)
{
    unsigned char TPH;                                                        
    unsigned char TPL;                                                        
    short i16=0;
    float f32=0;

          DS18B20_Init();
    DS18B20_WriteByte(0xCC);  
    DS18B20_WriteByte(0x44);   
    DS18B20_Init();
    DS18B20_WriteByte(0xCC);        
    DS18B20_WriteByte(0xBE);        
    TPL = DS18B20_ReadByte();      
    TPH = DS18B20_ReadByte();      
    i16 = 0;
    i16 = (TPH<<8) |TPL;                                
    f32 = i16 * 0.0625;                                
    return(f32);                                       
}
main.c調(diào)用
temperature=ReadTemperature();
LCD_Write_Char(5,0,temperature/100+0x30);
LCD_Write_Char(6,0,temperature%100/10+0x30);

附件太大了上傳不了

作者: tyrl800    時間: 2024-1-21 20:20
delay_us(2);延時函數(shù)時間不對吧
作者: sanzi    時間: 2024-1-22 11:18
tyrl800 發(fā)表于 2024-1-21 20:20
delay_us(2);延時函數(shù)時間不對吧

你說的是讀的還是寫的
作者: lids    時間: 2024-1-22 12:00
多半是時序不對,用邏輯分析儀測下delay_us();延時函數(shù)的延時對不對
作者: tyrl800    時間: 2024-1-22 14:05
sanzi 發(fā)表于 2024-1-22 11:18
你說的是讀的還是寫的

延時函數(shù)看不到,時間太快了不行
作者: zhuls    時間: 2024-1-22 15:00
弱弱地問一句:在單總線讀狀態(tài)時,你的IO配置有改為輸入了嗎?
DS18B20_IO_OUT();//這個原型是什么樣的?
DS18B20_IO_IN(); //這個原型又是什么樣的?

作者: cocolala    時間: 2024-1-23 09:39
    1、一定確保硬件沒問題==單總線上有且只有一個上拉電阻,各元件是好的,DS18B20方向是對的。
    2、接下來考慮軟件的事情。那么重點(diǎn)就是DS18B20時序:


   3、STM32移植起來很方便,下面給下手頭艾克姆STM32F103ZET6的DS18B20的例子,可以先使用這個例子測試下硬件是不是好的。程序見附件




DS18B20.rar

1 MB, 下載次數(shù): 4


作者: sanzi    時間: 2024-1-24 11:36
zhuls 發(fā)表于 2024-1-22 15:00
弱弱地問一句:在單總線讀狀態(tài)時,你的IO配置有改為輸入了嗎?
DS18B20_IO_OUT();//這個原型是什么樣的? ...

#define DS18B20_IO_IN()  {DS18B20_GPIO_PORT->CRH&=0xFFFFFFF0;DS18B20_GPIO_PORT->CRH|=0x00000008;}
#define DS18B20_IO_OUT() {DS18B20_GPIO_PORT->CRH&=0xFFFFFFF0;DS18B20_GPIO_PORT->CRH|=0x00000003;}

作者: sanzi    時間: 2024-1-24 16:35
tyrl800 發(fā)表于 2024-1-22 14:05
延時函數(shù)看不到,時間太快了不行
static u8  fac_us=0;
static u16 fac_ms=0;


void delay_init()         
{
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        
        fac_us=SystemCoreClock/8000000;        
        fac_ms=(u16)fac_us*1000;
}                                                                    
                                                                                      
void delay_us(u32 nus)
{               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us;
        SysTick->VAL=0x00;        
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;      
        SysTick->VAL =0X00;      
}

void delay_ms(u16 nms)
{                                    
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;
        SysTick->VAL =0x00;           
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         
        do
        {
                temp=SysTick->CTRL;
        }
        while(temp&0x01&&!(temp&(1<<16)));
        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;      
        SysTick->VAL =0X00;      
}


作者: sanzi    時間: 2024-1-25 15:37
這是仿真

仿真.zip

34.25 KB, 下載次數(shù): 3


作者: sanzi    時間: 2024-2-4 12:21
實(shí)物可以了但是仿真不行

作者: 111wh    時間: 2024-4-23 21:09
請問解決了嗎 我也是這樣




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