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

2019-07-16 00:44发布

#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;
        
}
  


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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
damofeisha
1楼-- · 2019-07-16 06:32
 精彩回答 2  元偷偷看……
Helpeomer
2楼-- · 2019-07-16 11:29
damofeisha 发表于 2013-5-11 13:18
没看楼主程序,不才不会编。不过敢问楼主硬件上没接错吧。

没有 针脚检查很多遍了  
看看火
3楼-- · 2019-07-16 15:28
c<<=8;
        t=a+c;        
        return t;
最后的处理函数写错了,第二行是t=a|c; 目的是把高八位和低八位合并成一个字节
沈沁
4楼-- · 2019-07-16 16:45
我也遇到跟你一样的情况。但是是时序设置的有问题。。把时序该对就好了
沈沁
5楼-- · 2019-07-16 18:19
我也遇到跟你一样的情况。但是是时序设置的有问题。。把时序该对就好了
沈沁
6楼-- · 2019-07-16 20:12
 精彩回答 2  元偷偷看……

一周热门 更多>