找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2023|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

DS18B20一直顯示0,實(shí)物仿真都不行,各位能不能幫我看看

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1109789 發(fā)表于 2024-1-21 10:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我做了一個(gè)STM32驅(qū)動(dòng)DS18B20在LCD1602上顯示溫度,時(shí)序我檢查了沒(méi)問(wèn)題,但是仿真和實(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);

附件太大了上傳不了
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:275826 發(fā)表于 2024-1-21 20:20 | 只看該作者
delay_us(2);延時(shí)函數(shù)時(shí)間不對(duì)吧
回復(fù)

使用道具 舉報(bào)

板凳
ID:1109789 發(fā)表于 2024-1-22 11:18 | 只看該作者
tyrl800 發(fā)表于 2024-1-21 20:20
delay_us(2);延時(shí)函數(shù)時(shí)間不對(duì)吧

你說(shuō)的是讀的還是寫的
回復(fù)

使用道具 舉報(bào)

地板
ID:140489 發(fā)表于 2024-1-22 12:00 | 只看該作者
多半是時(shí)序不對(duì),用邏輯分析儀測(cè)下delay_us();延時(shí)函數(shù)的延時(shí)對(duì)不對(duì)
回復(fù)

使用道具 舉報(bào)

5#
ID:275826 發(fā)表于 2024-1-22 14:05 | 只看該作者
sanzi 發(fā)表于 2024-1-22 11:18
你說(shuō)的是讀的還是寫的

延時(shí)函數(shù)看不到,時(shí)間太快了不行
回復(fù)

使用道具 舉報(bào)

6#
ID:69038 發(fā)表于 2024-1-22 15:00 | 只看該作者
弱弱地問(wèn)一句:在單總線讀狀態(tài)時(shí),你的IO配置有改為輸入了嗎?
DS18B20_IO_OUT();//這個(gè)原型是什么樣的?
DS18B20_IO_IN(); //這個(gè)原型又是什么樣的?
回復(fù)

使用道具 舉報(bào)

7#
ID:226055 發(fā)表于 2024-1-23 09:39 | 只看該作者
    1、一定確保硬件沒(méi)問(wèn)題==單總線上有且只有一個(gè)上拉電阻,各元件是好的,DS18B20方向是對(duì)的。
    2、接下來(lái)考慮軟件的事情。那么重點(diǎn)就是DS18B20時(shí)序:


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




DS18B20.rar

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

回復(fù)

使用道具 舉報(bào)

8#
ID:1109789 發(fā)表于 2024-1-24 11:36 | 只看該作者
zhuls 發(fā)表于 2024-1-22 15:00
弱弱地問(wèn)一句:在單總線讀狀態(tài)時(shí),你的IO配置有改為輸入了嗎?
DS18B20_IO_OUT();//這個(gè)原型是什么樣的? ...

#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;}
回復(fù)

使用道具 舉報(bào)

9#
ID:1109789 發(fā)表于 2024-1-24 16:35 | 只看該作者
tyrl800 發(fā)表于 2024-1-22 14:05
延時(shí)函數(shù)看不到,時(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;      
}

回復(fù)

使用道具 舉報(bào)

10#
ID:1109789 發(fā)表于 2024-1-25 15:37 | 只看該作者
這是仿真

仿真.zip

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

回復(fù)

使用道具 舉報(bào)

11#
ID:1109789 發(fā)表于 2024-2-4 12:21 | 只看該作者
實(shí)物可以了但是仿真不行
回復(fù)

使用道具 舉報(bào)

12#
ID:1100218 發(fā)表于 2024-4-23 21:09 | 只看該作者
請(qǐng)問(wèn)解決了嗎 我也是這樣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表