大神求指教,DS18B20读取数据总显示在05,帮我看看我的程.....

2019-07-15 20:12发布

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp,shi,ge;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
// 显示段码值0123456789
void DelayUs2x(uchar t);
void DelayMs(uchar t);
bit Init_DS18B20(void);
sbit DQ=P3^2;
sbit dula=P2^0;
sbit wela=P2^1;
uchar ReadOneChar(void);
void WriteOneChar(uchar dat);
void display(uchar a,b,c);
uint ReadTemperature(void);
void main()
{  
while(1)

{
  temp=ReadTemperature();
  temp=temp>>4;

  shi=temp/10;
  ge=temp%10;
  display(shi,ge,0);
}  
}

bit Init_DS18B20(void)
{
  bit dat;
  DQ=1;
  DelayUs2x(5);
  DQ=0;         //单片机将DQ拉低
  DelayUs2x(200); //精确延时 大于 480us 小于960us
  DelayUs2x(200);
  DQ = 1;        //拉高总线
  DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
  dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
  DelayUs2x(25); //稍作延时返回
  return dat;
}
/*------------------------------------------------
                    读取一个字节
------------------------------------------------*/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  DelayUs2x(33);
}
return(dat);
}
/*------------------------------------------------
                    写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  DelayUs2x(33);
  DQ = 1;
  dat>>=1;
}
DelayUs2x(25);
}
/*------------------------------------------------
                    读取温度
------------------------------------------------*/
uint ReadTemperature(void)
{
uchar a=0;
uint b=0;
uint t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
DelayMs(50);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
b<<=8;
t=a+b;
return(t);
}
void display(uchar a,b,c)
{
  while(1)
  {
   wela=1;
   P0=0xfd;
   wela=0;
   dula=1;
   P0=table[a];
   dula=0;
   DelayMs(10);

      wela=1;
   P0=0xfb;
   wela=0;
   dula=1;
   P0=table[b]|0x80;
   dula=0;
   DelayMs(10);

   wela=1;
   P0=0xf7;
   wela=0;
   dula=1;
   P0=table[c];
   dula=0;
   DelayMs(10);
  }
}   
void DelayUs2x(uchar t)
{   
while(--t);
}
void DelayMs(uchar t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
}
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。