打印
[51单片机]

ds18b20采集到的温度不变

[复制链接]
3811|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
枫流天下|  楼主 | 2015-6-1 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采集到的温度一直不变,显示也不对,改变延时和显示函数,结果也不会变,求大神指导,小弟拜谢了

////////////////////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define        uchar unsigned char
#define uint unsigned int
sbit duan=P2^6;
sbit wei=P2^7;
sbit DQ=P2^2;
uchar code num[10]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f};
uchar code table[7]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay_ms(uint t)
{
        uint a,b;
        for(a=0;a<t;a++)
                for(b=0;b<113;b++);
          
}

void delay_us(uint t) //11us
{
        for(;t>0;t--);
}

void display(uint j,uint k)
{
                P0=num[j];      
                duan=1;                 
                duan=0;                         

                P0=table[k];                         
                wei=1;                         
                wei=0;                                
}

/*DS18B20初始化*/
void init()
{
        DQ=1;
        delay_us(5);
        DQ=0;
        delay_us(45);
        DQ=1;
        delay_us(10);
        while(DQ==1);
        while(~DQ==1)
        delay_us(23);
}
/*DS18B20写数据*/
write_data(uchar dat)
{
        uint i;
        bit b;
        for(i=8;i>0;i--)
        {
                b=dat&0x01;
                dat=dat>>1;
                if(DQ==0)//写0
                {
                        DQ=0;
                        delay_us(6);
                        DQ=1;
                        _nop_();
                }
                else   //写1
                {
                        DQ=0;
                        delay_us(1);
                        DQ=1;
                        delay_us(6);
                }
        }
}
/*DS18B20读数据*/
uchar read_data()
{
        uchar i;
        uchar dat=0;
        for(i=8;i>0;i--)
        {         
             DQ=0;
                 dat>>=1;
                 _nop_();
                 DQ=1;
                 if(DQ==1)
                 dat=0|0x80;
                 delay_us(6);
        }
        return dat;
}

int gettemp(uint tempdata16) /*读取温度*/
{
        uchar data1,data2;
        float tt;
        init();
        write_data(0xcc);
        write_data(0x44);
         
        init();
        write_data(0xcc);
        write_data(0xbe);
        data1=read_data();
        data2=read_data();

        tempdata16=tempdata16|data2;
        tempdata16=(tempdata16<<8)|data1;
        tt=tempdata16*0.0625;
        tempdata16=tt*10+0.5;
        return tempdata16;
}
void main()
{
        int temp;
        uint a,b,c,d;
        while(1)
        {       
                temp=gettemp();
                a=temp/1000;
                display(a,4);
                delay_ms(5);

                b=temp/100%10;
                display(b,3);
                delay_ms(5);

                c=temp/10%10;
                display(c,2);
                delay_ms(5);

                d=temp%10;       
                display(d,1);
                delay_ms(5);
        }
}

还有一个问题就是int gettemp(uint tempdata16) /*读取温度*/的uint tempdata16放到函数的参数里面和函数里面结果也不一样,求解释啊

相关帖子

沙发
枫流天下|  楼主 | 2015-6-1 19:19 | 只看该作者
帮帮忙啊,各位司机大神们

使用特权

评论回复
板凳
yuanquan12345| | 2015-6-1 20:50 | 只看该作者
/*DS18B20初始化*/
void init()
{
        DQ=1;
        delay_us(5);
        DQ=0;
        delay_us(45);
        DQ=1;
        delay_us(10);
        while(DQ==1);
        while(~DQ==1)
        delay_us(23);
}
把delay_us(),时间延长,试试。

使用特权

评论回复
地板
yuanquan12345| | 2015-6-1 20:52 | 只看该作者
原来用过,也出现这个问题,后来延长了初始化的时间,问题解决了。时间长了记不很清了。你试试吧。

使用特权

评论回复
5
枫流天下|  楼主 | 2015-6-1 22:09 | 只看该作者
yuanquan12345 发表于 2015-6-1 20:52
原来用过,也出现这个问题,后来延长了初始化的时间,问题解决了。时间长了记不很清了。你试试吧。 ...

还是不可以啊:'(

使用特权

评论回复
6
枫流天下|  楼主 | 2015-6-1 22:10 | 只看该作者
yuanquan12345 发表于 2015-6-1 20:50
/*DS18B20初始化*/
void init()
{

延长最后一个吗?我都改过了,还是不行

使用特权

评论回复
7
yuanquan12345| | 2015-6-2 07:35 | 只看该作者
看看 18b20手册。

使用特权

评论回复
8
yuanquan12345| | 2015-6-2 07:49 | 只看该作者
你参考一下吧。
void init()
{
uint n;
dq=1;
delay1(28);
dq=0;
delay1(80);
dq=1;
delay1(28);
n=dq;
delay1(14);
}

void delay1(uint t)
{
while(t--);
}

void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
  dq=0;
  dq=dat&0x01;
  delay1(4);
  dq=1;
  dat>>=1;
}
delay1(4);
}

uchar read_byte(void)
{
uchar i=0,wen=0;
for(i=0;i<8;i++)
{
  dq=0;
  wen>>=1;
  dq=1;
  if(dq)
   wen|=0x80;
  delay1(4);
}
return wen;
}

uchar zhuanhuan(void)
{
uchar a,b;
uint t;
init();
write_byte(0xcc);
write_byte(0x44);
delay1(300);
init();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
t=b&0xf8;;
if(t)
{
     temp_value=b<<4;
   temp_value+=(a&0xf0)>>4;
   temp_value=~temp_value+1;
   temp1_value=~a&0x0f;
}
else
{
        temp_value=b<<4;
        temp_value+=(a&0xf0)>>4;
  temp1_value=a&0x0f;
    // wendu[1]=temp_value/100+'0';  //百位
      if(wendu[1]=='1')
       {
            wendu[1]='1';
       }
       else
       {
           wendu[1]=' ';
       }
     
}

}

void display1(uint t)
{
wendu[2]=temp_value0/10+'0';  //十位
wendu[3]=temp_value+'0';  //个位
wendu[5]=temp1_value*625/1000+'0';//小数
E_disp_1(6,16,xs[wendu[2]]);    //在LCD的正确位置显示改变后新的秒数
delay1(60);
E_disp_1(6,24,xs[wendu[3]]);    //在LCD的正确位置显示改变后新的秒数
delay1(60);
E_disp_1(6,40,xs[wendu[5]]);
delay1(60);
}  


使用特权

评论回复
9
yuanquan12345| | 2015-6-2 07:51 | 只看该作者
最近看了宋老师的视频,最好不用delay().而用中断延时。

使用特权

评论回复
10
xygyszb| | 2015-6-2 08:26 | 只看该作者

使用特权

评论回复
11
枫流天下|  楼主 | 2015-6-2 15:24 | 只看该作者
今天看了配套程序,我改的都快和它一模一样了,只是名字换了而已,还是不可以,到底是怎么回事

使用特权

评论回复
12
xygyszb| | 2015-6-2 16:53 | 只看该作者
ds18b20的刷新速度在1s左右。是不是你的频率太快了、

使用特权

评论回复
13
ningling_21| | 2015-6-2 17:11 | 只看该作者
枫流天下 发表于 2015-6-2 15:24
今天看了配套程序,我改的都快和它一模一样了,只是名字换了而已,还是不可以,到底是怎么回事[em:6 ...

刚上电时读到85度了没?

使用特权

评论回复
14
aaron96031| | 2015-6-2 17:15 | 只看该作者
注意时序吧 , DS18B20没那么难搞

使用特权

评论回复
15
枫流天下|  楼主 | 2015-6-2 21:35 | 只看该作者
ningling_21 发表于 2015-6-2 17:11
刚上电时读到85度了没?

没有,显示固定值,而且还错误的老离谱了:'(

使用特权

评论回复
16
枫流天下|  楼主 | 2015-6-2 21:37 | 只看该作者
aaron96031 发表于 2015-6-2 17:15
注意时序吧 , DS18B20没那么难搞

严格按照时序的,我还将配套程序都拷贝了,还是不行...都快和配套程序一样了...

使用特权

评论回复
17
aaron96031| | 2015-6-2 23:15 | 只看该作者
https://bbs.21ic.com/forum.php?mo ... p;page=1#pid5528710, 你可以看到我们做的效果

使用特权

评论回复
18
aaron96031| | 2015-6-2 23:15 | 只看该作者
自己到5楼下载最新的资料

使用特权

评论回复
19
ningling_21| | 2015-6-3 07:55 | 只看该作者
枫流天下 发表于 2015-6-2 21:37
严格按照时序的,我还将配套程序都拷贝了,还是不行...都快和配套程序一样了... ...

有没有示波器的波形的图片? 把波形和芯片资料里的波形对比就发现问题了

使用特权

评论回复
20
xiaoliping1945| | 2015-6-6 12:00 | 只看该作者
不知道你DS18B20采样怎么的接线方式,是否有4.7K的上拉电阻啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

0

粉丝