OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4070|回复: 6

DS18B20没有应答信号 是坏了吗 板子是自己画的

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-5-22
在线时间
28 小时
发表于 2016-7-22 19:27:35 | 显示全部楼层 |阅读模式
1金钱
程序是原子哥的那个  
没有应答信号    是器件坏了吗   上拉电阻接的是10K的
#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
////IO2ù×÷oˉêy                                                                                          
#define        DS18B20_DQ_OUT PGout(11) //êy&#190;Y&#182;&#203;&#191;ú        PG11
#define        DS18B20_DQ_IN  PGin(11)  //êy&#190;Y&#182;&#203;&#191;ú        PG11
          
u8 DS18B20_Init(void);                        //3&#245;ê&#188;&#187;ˉDS18B20
short DS18B20_Get_Temp(void);        //&#187;&#241;è&#161;&#206;&#194;&#182;è
void DS18B20_Start(void);                //&#191;aê&#188;&#206;&#194;&#182;è×a&#187;&#187;
void DS18B20_Write_Byte(u8 dat);//D′è&#235;ò&#187;&#184;&#246;×&#214;&#189;ú
u8 DS18B20_Read_Byte(void);                //&#182;á3&#246;ò&#187;&#184;&#246;×&#214;&#189;ú
u8 DS18B20_Read_Bit(void);                //&#182;á3&#246;ò&#187;&#184;&#246;&#206;&#187;
u8 DS18B20_Check(void);                        //&#188;ì2aê&#199;·&#241;′&#230;&#212;úDS18B20
void DS18B20_Rst(void);                        //&#184;′&#206;&#187;DS18B20   
#endif


#include "ds18b20.h"
#include "delay.h"       
//////////////////////////////////////////////////////////////////////////////////         
//±&#190;3ìDò&#214;&#187;1&#169;&#209;§&#207;°ê1ó&#195;£&#172;&#206;′&#190;-×÷&#213;&#223;Dí&#191;é£&#172;2&#187;μ&#195;ó&#195;óú&#198;&#228;&#203;üè&#206;o&#206;ó&#195;í&#190;
//ALIENTEK&#213;&#189;&#189;¢STM32&#191;a·¢°&#229;
//DS18B20&#199;y&#182;ˉ′ú&#194;&#235;          
//&#213;yμ&#227;&#212;-×ó@ALIENTEK
//&#188;&#188;ê&#245;&#194;&#219;ì3:www.openedv.com
//DT&#184;&#196;è&#213;&#198;ú:2012/9/12
//°&#230;±&#190;£oV1.0
//°&#230;è¨&#203;ùóD£&#172;μá°&#230;±&#216;&#190;&#191;&#161;£
//Copyright(C) 1&#227;&#214;YêDD&#199;òíμ&#231;×ó&#191;&#198;&#188;&#188;óD&#207;T1&#171;&#203;&#190; 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////


//&#184;′&#206;&#187;DS18B20
void DS18B20_Rst(void)          
{                 
        DS18B20_IO_OUT(); //SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; //à-μíDQ
    delay_us(480);    //à-μí750us
    DS18B20_DQ_OUT=1; //DQ=1
        delay_us(15);     //15US
}
//μè′yDS18B20μ&#196;&#187;&#216;ó|
//·μ&#187;&#216;1:&#206;′&#188;ì2aμ&#189;DS18B20μ&#196;′&#230;&#212;ú
//·μ&#187;&#216;0:′&#230;&#212;ú
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;
}
//′óDS18B20&#182;áè&#161;ò&#187;&#184;&#246;&#206;&#187;
//·μ&#187;&#216;&#214;μ£o1/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;
}
//′óDS18B20&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
//·μ&#187;&#216;&#214;μ£o&#182;áμ&#189;μ&#196;êy&#190;Y
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;
}
//D′ò&#187;&#184;&#246;×&#214;&#189;úμ&#189;DS18B20
//dat£oòaD′è&#235;μ&#196;×&#214;&#189;ú
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);                          
        }
    }
}
//&#191;aê&#188;&#206;&#194;&#182;è×a&#187;&#187;
void DS18B20_Start(void)// ds1820 start convert
{                                                                 
    DS18B20_Rst();          
        DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}
//3&#245;ê&#188;&#187;ˉDS18B20μ&#196;IO&#191;ú DQ í&#172;ê±&#188;ì2aDSμ&#196;′&#230;&#212;ú
//·μ&#187;&#216;1:2&#187;′&#230;&#212;ú
//·μ&#187;&#216;0:′&#230;&#212;ú             
u8 DS18B20_Init(void)
{
        RCC->APB2ENR|=1<<8;    //ê1&#196;üPORTG&#191;úê±&#214;ó
        GPIOG->CRH&=0XFFFF0FFF;//PORTG.11 í&#198;íìê&#228;3&#246;
        GPIOG->CRH|=0X00003000;
        GPIOG->ODR|=1<<11;      //ê&#228;3&#246;1
        DS18B20_Rst();
        return DS18B20_Check();
}  
//′óds18b20μ&#195;μ&#189;&#206;&#194;&#182;è&#214;μ
//&#190;&#171;&#182;è£o0.1C
//·μ&#187;&#216;&#214;μ£o&#206;&#194;&#182;è&#214;μ £¨-550~1250£&#169;
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;//&#206;&#194;&#182;è&#206;a&#184;o  
    }else temp=1;//&#206;&#194;&#182;è&#206;a&#213;y                    
    tem=TH; //&#187;&#241;μ&#195;&#184;&#223;°&#203;&#206;&#187;
    tem<<=8;   
    tem+=TL;//&#187;&#241;μ&#195;μ×°&#203;&#206;&#187;
    tem=(float)tem*0.625;//×a&#187;&#187;     
        if(temp)return tem; //·μ&#187;&#216;&#206;&#194;&#182;è&#214;μ
        else return -tem;   
}

















最佳答案

查看完整内容[请看2#楼]

这个器件一般不会坏的,看你的延时正确不,有可能是你的时序问题。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-7-24
在线时间
1 小时
发表于 2016-7-22 19:27:36 | 显示全部楼层
wangkun123 发表于 2016-7-24 10:04
之前用的是4.7K  然后没用  又换成10k了   结果还是一样

这个器件一般不会坏的,看你的延时正确不,有可能是你的时序问题。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-22 20:51:40 | 显示全部楼层
改为4.7K上啦试试
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-5-22
在线时间
28 小时
 楼主| 发表于 2016-7-24 10:04:30 | 显示全部楼层

   之前用的是4.7K  然后没用  又换成10k了   结果还是一样
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-5-22
在线时间
28 小时
 楼主| 发表于 2016-7-25 22:59:24 | 显示全部楼层
taonsh 发表于 2016-7-24 10:52
这个器件一般不会坏的,看你的延时正确不,有可能是你的时序问题。

  时序是有点问题  C:\Documents and Settings\Administrator\桌面   在主机拉高电平后DS18B20会在2秒后拉低总线, 而在7秒后会被上拉为高电平,   所以在复位这个程序中大横线部分如果是delay15us等到达check程序后总线就一直是高电平,从而导致一直是检测不到器件  ,这和数据手册上的时序相差有点大啊 ,真不知道原因在哪     
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-5-22
在线时间
28 小时
 楼主| 发表于 2016-7-25 23:01:16 | 显示全部楼层
这是例程的复位程序   
_JQ22)`TPHDRK[(S7)]0GJI.png
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2016-7-26 11:47:46 | 显示全部楼层
我用用是好的么,很多人是因为输入输出设置错误,不知道你问题出在哪里
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 04:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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