DS18B20温度值读不出来

2019-07-16 04:47发布

那位高手能帮我看下。我这个程序为什么不能显示出温度值。
#include<reg52.h>
#include<intrins.h>       
#include"math.h"

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^0;

int t;
uchar  led_7seg[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};
uchar  led[4]={0xf7,0xfb,0xfd,0xfe};
uchar  a[4];

void delay(uint k)
{
while(k--);
}

//初始化DS18B20
init_ds18b20(void)
{
uchar x=0;
DQ=1;
delay(10);
DQ=0;
delay(80);
DQ=1;
delay(20);
x=DQ;
delay(30);
return x;
}

//读一个字节
bit rdbit_ds18b20(void)
{
uchar i;                                                    //定义延时变量
uchar dat=0;                                           //返回变量暂存
for(i=0;i<8;i++)
  {
   DQ=0;                                                   //启动总线
   dat>>=1;
   DQ=1;                                                   //释放总线
   if(DQ)                                                   //延时9us后采样
   dat|=0x80;                                           //则自位最高位
   delay(8);
  }                                  
return(dat);                                           //返回接收值
}

uchar rdbyte_ds18b20()
{
  uint i;
  uchar j, dat;
  dat = 0;
  for(i=0; i<8; i++)
   {
     j = rdbit_ds18b20();
     dat = (j << 7) | (dat >> 1);
   }
  return dat;
}


//写一个字节
void wtbyte_ds18b20(uchar wdat)
{
  uint i;
  uchar j;
  bit b;
    for(j = 0; j < 8; j++)
   {
     b = wdat & 0x01;
     wdat >>= 1;
    //写"1", 让低电平持续2个小延时, 高电平持续8个小延时
      if(b)   
       {
          DQ = 0;
          i++; i++;
          DQ = 1;
           i = 8; while(i>0) i--;
       }
       else  //写"0", 让低电平持续8个小延时, 高电平持续2个小延时
        {
          DQ = 0;
           i = 8; while(i>0) i--;
            DQ = 1;
          i++; i++;
        }
    }
}

uchar readbyte_ds18b20()                  //读取温度
{
uchar a=0;
uchar b=0;
float tt=0;
init_ds18b20();
wtbyte_ds18b20(0xCC); // 跳过读序号列号的操作
wtbyte_ds18b20(0x44); // 启动温度转换
init_ds18b20();
wtbyte_ds18b20(0xCC); //跳过读序号列号的操作
wtbyte_ds18b20(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=rdbyte_ds18b20();//低位
b=rdbyte_ds18b20();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}

void display()
{
uchar count;
a[0]=led_7seg[t%10];
a[1]=led_7seg[11];
a[2]=led_7seg[t%100];
a[3]=led_7seg[t/100];
for(count=0;count<4;count++)
{
   P0=a[count];
   P2=led[count];
   delay(2);
   P2=0xFF;
   P0=0X00;
}
}

void main()
{
   init_ds18b20();
   readbyte_ds18b20();
   while(1)
   {
     display();
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
lstcspring
1楼-- · 2019-07-16 10:47
我之前也遇以过,这种问题多半是时序问题,用示波器看一下时序是否正常
yqldt
2楼-- · 2019-07-16 13:36
lovezjf234
3楼-- · 2019-07-16 15:18
参考一下别人的程序,找这样的bug应该不难

一周热门 更多>