一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
楼主: DIY

有没有懂 DS18b20 使用的朋友

[复制链接]
发表于 2016-7-20 23:36 | 显示全部楼层
原来时序可能太紧张,查一下建立保持时间的裕量吧
回复

使用道具 举报

发表于 2016-7-21 01:35 | 显示全部楼层
上拉4.7k,单片机电源要好,

也有可能你以前时序不太准,频率飘了,现在就读不了拉。
或者你的单片机有外部中断,干扰了时序。
回复

使用道具 举报

发表于 2016-7-21 07:53 | 显示全部楼层
现在是猜猜看节目时间。
回复

使用道具 举报

 楼主| 发表于 2016-7-21 14:23 | 显示全部楼层
void delay(uint ran_shi)        //                延时
{
    while (ran_shi--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
       
        }
}


void DS18B20_Reset_1T()               
{
    CY = 1;
    while (CY)
    {
        ds18b20 = 0;            
        delay(240);        
        delay(240);
        ds18b20 = 1;               
        delay(60);         
        CY = ds18b20;               
        delay(200);
                delay(180);   
    }
}


uchar DS18B20_ReadByte_1T()                                  
{
    uchar dat = 0;
    for (i=0; i<8; i++)         
    {
        dat >>= 1;
        ds18b20 = 0;               
        delay(1);              
        ds18b20 = 1;                  
        delay(1);               
        if (ds18b20) dat |= 0x80;      
        delay(45);              
    }
    return dat;
}


void DS18B20_WriteByte_1T(uchar dat)         
{
    for (i=0; i<8; i++)        
    {
        ds18b20 = 0;                    
        delay(1);               
        dat >>= 1;               
        ds18b20 = CY;
        delay(50);         
        ds18b20 = 1;               
        delay(1);            
    }
}



void read_ds18b20_1T()         
{
        while (!ds18b20);
    DS18B20_Reset_1T();               
    DS18B20_WriteByte_1T(0xCC);        
    DS18B20_WriteByte_1T(0xBE);      
    TPL = DS18B20_ReadByte_1T();      
    TPH = DS18B20_ReadByte_1T();
        sb=TPH*256+TPL;
        if(TPH>200) sb=~sb+1;
        wen=(sb*6/10)+(sb*2/100)+(sb*5/1000);                       
    DS18B20_Reset_1T();               
    DS18B20_WriteByte_1T(0xCC);      
    DS18B20_WriteByte_1T(0x44);  
}

回复

使用道具 举报

 楼主| 发表于 2016-7-21 14:25 | 显示全部楼层
本帖最后由 DIY 于 2016-7-21 14:27 编辑

高手请指教下  这个什么地方不对的需要修改  电源正常没问题的  问题是换以前很正常  换了2个多正常    怀疑DS18B20山上的货   准备去另外一家买了  回来再看看
回复

使用道具 举报

发表于 2016-7-21 23:06 | 显示全部楼层
这东西对时序要求很严格,试一下把延时加长一点看看
回复

使用道具 举报

发表于 2016-7-22 00:16 | 显示全部楼层
18b20用过几次,以后就换sht系列的了,那个太慢,不好弄。
回复

使用道具 举报

发表于 2016-7-22 09:53 | 显示全部楼层
void delay(uint ran_shi)        //                延时
{
     while (ran_shi--)
     {
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         
         }
}

delay(1);   

你这个是c51的单片机,你这种延时函数会有问题的, 不同编译器,不同编译设置,实际延时的时间不确定的。

回复

使用道具 举报

发表于 2016-7-22 10:13 | 显示全部楼层
/******************************************************************************/
/*                           delay_12Mhz.h                                    */
/*                                                                            */
/*                           8比特的延时函数                                  */
/******************************************************************************/

#define delay_12Mhz_1us {_nop_();}
#define delay_12Mhz_2us {_nop_();_nop_();}
#define delay_12Mhz_3us {_nop_();_nop_();_nop_();}
#define delay_12Mhz_4us {_nop_();_nop_();_nop_();_nop_();}
#define delay_12Mhz_5us {_nop_();_nop_();_nop_();_nop_();_nop_();}

连续使用_nop_();_nop_();会造成不可预料的情况,我实际只使用一个_nop_();



//该独立函数过程占用5字节
//12Mhz晶振下,8或9级优化,调用一次占用3字节代码
//无参数调用;
//(n*2+5)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_n (  ) {
     unsigned char n=1;
     while ( --n ) {};
}


//**********
//Set_12Mhz_10us(n)函数库开始 ;一共占用12字节
//void Set_12Mhz_10us_ ( unsigned char n );
//用法 Set_12Mhz_10us (n);n=[1--256],延时范围(10--2560ms);调用一次5字节;
//当n=1时,误差+1us,n=[2--256],误差=0;
#define Set_12Mhz_10us(n)  {Set_12Mhz_10us_(n-1);}
//该独立函数过程占用12字节
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*(8+2)+10)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_10us_ ( unsigned char n ) {
     for (; n > 0; n--) {
          delay_12Mhz_2us;
     }
}
//Set_12Mhz_10us(n)函数库结束
/***********/

因为c51不能方便的精确延时,我以前弄的延时库,理论上,在12mhz晶振下,能从1us,精确延时到1s。
用的方式是:添加强制编译参数【#pragma ot(9,speed)//强制指定9级优化】。
然后在编译器的运行仿真,看函数实际运行了几个时钟周期然后通过补时,凑时间到1s之内。
思路就是这样,自己封装好常用的延时时间。
弄完之后,我再也不用c51单片机了....

/*
//该独立函数过程占用3字节
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*2+5)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_2us ( unsigned char n ) {
   while ( --n ) {};
}
//该独立函数过程占用10字节!!!
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*8+10)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_8us ( unsigned char n ) {
   for (; n > 0; n--) {};
}
*/


回复

使用道具 举报

 楼主| 发表于 2016-7-23 11:58 | 显示全部楼层
谢谢....百里游兄弟 的解答    学习
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-13 03:04 , Processed in 0.034275 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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