找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 537|回复: 11
打印 上一主题 下一主题
收起左侧

DS18B20一直显示0,实物仿真都不行,各位能不能帮我看看

[复制链接]
跳转到指定楼层
楼主
ID:1109789 发表于 2024-1-21 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个STM32驱动DS18B20在LCD1602上显示温度,时序我检查了没问题,但是仿真和实物都不行,一直显示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调用
temperature=ReadTemperature();
LCD_Write_Char(5,0,temperature/100+0x30);
LCD_Write_Char(6,0,temperature%100/10+0x30);

附件太大了上传不了
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:275826 发表于 2024-1-21 20:20 | 只看该作者
delay_us(2);延时函数时间不对吧
回复

使用道具 举报

板凳
ID:1109789 发表于 2024-1-22 11:18 | 只看该作者
tyrl800 发表于 2024-1-21 20:20
delay_us(2);延时函数时间不对吧

你说的是读的还是写的
回复

使用道具 举报

地板
ID:140489 发表于 2024-1-22 12:00 | 只看该作者
多半是时序不对,用逻辑分析仪测下delay_us();延时函数的延时对不对
回复

使用道具 举报

5#
ID:275826 发表于 2024-1-22 14:05 | 只看该作者
sanzi 发表于 2024-1-22 11:18
你说的是读的还是写的

延时函数看不到,时间太快了不行
回复

使用道具 举报

6#
ID:69038 发表于 2024-1-22 15:00 | 只看该作者
弱弱地问一句:在单总线读状态时,你的IO配置有改为输入了吗?
DS18B20_IO_OUT();//这个原型是什么样的?
DS18B20_IO_IN(); //这个原型又是什么样的?
回复

使用道具 举报

7#
ID:226055 发表于 2024-1-23 09:39 | 只看该作者
    1、一定确保硬件没问题==单总线上有且只有一个上拉电阻,各元件是好的,DS18B20方向是对的。
    2、接下来考虑软件的事情。那么重点就是DS18B20时序:


   3、STM32移植起来很方便,下面给下手头艾克姆STM32F103ZET6的DS18B20的例子,可以先使用这个例子测试下硬件是不是好的。程序见附件




DS18B20.rar

1 MB, 下载次数: 4

回复

使用道具 举报

8#
ID:1109789 发表于 2024-1-24 11:36 | 只看该作者
zhuls 发表于 2024-1-22 15:00
弱弱地问一句:在单总线读状态时,你的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;}
回复

使用道具 举报

9#
ID:1109789 发表于 2024-1-24 16:35 | 只看该作者
tyrl800 发表于 2024-1-22 14:05
延时函数看不到,时间太快了不行
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;      
}

回复

使用道具 举报

10#
ID:1109789 发表于 2024-1-25 15:37 | 只看该作者
这是仿真

仿真.zip

34.25 KB, 下载次数: 2

回复

使用道具 举报

11#
ID:1109789 发表于 2024-2-4 12:21 | 只看该作者
实物可以了但是仿真不行
回复

使用道具 举报

12#
ID:1100218 发表于 2024-4-23 21:09 | 只看该作者
请问解决了吗 我也是这样
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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