微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用数码管显示ds18b20 为什么显示温度一直不变?

用数码管显示ds18b20 为什么显示温度一直不变?

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int dudata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};   
unsigned int wedata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

sbit we=P2^1;
sbit du=P2^0;
sbit DQ=P2^2;
uchar tempdata[6];
uchar temph,templ,temp,flag_get,num;
void ds18B20 ();
void write_B(uchar dat);
uchar  read_B();
uint duqutemp ();
void display ();

void delay (uchar i)
{
        while(i--);
}

void display ()
{
        static int i=0;
        
                P0=0;
                we=1;
                we=0;
                        
                P0=wedata;        
                we=1;
                we=0;
                        
                P0=tempdata;
                du=1;
                du=0;
                delay(200);
                i++;
                if(i==6)
                i=0;
        
        
               
}

void main (  )
{
        
               
               
        while(1)
        {
                tempdata[5]=0x39;           //最后一位显示温度符号  cC
                tempdata[0]=0;
                tempdata[1]=dudata[temph/100];
                tempdata[2]=dudata[(temph%100)/10];
                tempdata[3]=dudata[(temph%100)%10];
                tempdata[4]=dudata[templ];
                display();
               
                if(flag_get==1)
                {
               
                temp=duqutemp();
                temph=temp>>4;        
                templ=temp&0x0f;
                templ=templ*6/10;      
                flag_get=0;
                }
        
        }
               
               
               
        
        
}

void ds18B20 ()
{
        uchar n;
        DQ=1;
        delay(8);
        DQ=0;
        delay(80);//600us
        DQ=1;
        delay(8);          //等待15到60毫秒
        n=DQ;
        delay(8);
}
void write_B (uchar dat)
{
        uchar t;
        for(t=0;t<8;t++)
        {
                DQ=0;
                DQ=dat|0x01;
                delay(8);// 45us
                DQ=1;
                dat>>=1;           //从最低位写入数据
               
        }
        delay(4);        
}

uchar read_B()
{
        uchar t,value;
        for(t=0;t<8;t++)
        {
                DQ=0;
                value>>=1;
                DQ=1;
                if(DQ)
                value|=0x80;        //1000 0000 从最低位开始读取
                delay(4);
                                
        }        
        return (value);
}
uint duqutemp ()
{
        uchar a,c,t;
        ds18B20();
        write_B(0xcc);  //跳过rom
        write_B(0x44); //启动温度转换 开始检测温度  
        delay(200);  //给时间读取温度
        
        ds18B20 ();
        write_B(0xcc);//
        write_B(0xbe);        // 读取温度
        a=read_B();
        c=read_B();
        
        c<<=8;
        t=a+c;        
        return t;
        
}
  

看了半天还是不明白哪里出错了   ,求高手赐教,万分感激!

没看小编程序,不才不会编。不过敢问小编硬件上没接错吧。

没有 针脚检查很多遍了  

c<<=8;
        t=a+c;        
        return t;
最后的处理函数写错了,第二行是t=a|c; 目的是把高八位和低八位合并成一个字节

我也遇到跟你一样的情况。但是是时序设置的有问题。把时序该对就好了

我也遇到跟你一样的情况。但是是时序设置的有问题。把时序该对就好了

把write_B 中的这一DQ=dat|0x01;位改成DQ=dat&0x01;试试

我也是这个问题,但是程序放在单片机上正常工作。而在自己焊的板子上却不会读取温度,硬件焊接是按照单片机原理图焊接的,不知道为什么不工作

同问,我的一直显示15.9度

谢谢分享谢谢分享谢谢分享

flag_get没有再置高!if只运行一次

同问,我的是8.5

时序怎么改啊

对  我的也是  这个度数  后来怎么解决的啊

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top