ds18b20在液晶上不能显示温度,求高手看看程序有问题没。

2019-07-15 18:07发布

/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒  
{
   while(i--);
}
void ds1820rst()          //ds1820复位
{
   unsigned char x=0;
   DQ = 1;              //DQ复位
   delay_18B20(4);     //延时   
   DQ = 0;            //DQ拉低   
   delay_18B20(100); //精确延时大于480us
   DQ = 1;          //拉高     
   delay_18B20(40);
}
uchar ds1820rd()  //读数据   
{
   unsigned char i=0;
   unsigned char dat = 0;
     for (i=8;i>0;i--)
     {
         DQ = 0;      //给脉冲信号   
         dat>>=1;
         DQ = 1;     //给脉冲信号   
         if(DQ)
         dat|=0x80;
         delay_18B20(10);
     }
    return(dat);
}
void ds1820wr(uchar wdata)  //写数据  
{
   unsigned char i=0;
   for (i=8; i>0; i--)
    {
       DQ = 0;
       DQ = wdata&0x01;
       delay_18B20(10);
       DQ = 1;
       wdata>>=1;
    }
}
read_temp()            //读取温度值并转换
{
   uchar a,b;
   ds1820rst();
   ds1820wr(0xcc);   //跳过读序列号     
   ds1820wr(0x44);  //启动温度转换
   ds1820rst();
   ds1820wr(0xcc); //跳过读序列号      
   ds1820wr(0xbe);//读取温度      
   a=ds1820rd();
   b=ds1820rd();
   tvalue=b;
   tvalue<<=8;
   tvalue=tvalue|a;
   if(tvalue<0x0fff)
    tflag=0;
     else
      {
       tvalue=~tvalue+1;
       tflag=1;
      }
      tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数   
      return(tvalue);
}
/*******************************************************************/
void ds1820 disp()                         //温度值显示
{
  uchar flagdat;
  disdata[0]=tvalue/1000+0x30;          //百位数
  disdata[1]=tvalue%1000/100+0x30;     //十位数
  disdata[2]=tvalue%100/10+0x30;      //个位数
  disdata[3]=tvalue%10+0x30;         //小数位
   if(tflag==0)
    flagdat=0x20;                   //正温度不显示符号
     else
      flagdat=0x2d;               //负温度显示负号:-
       if(disdata[0]==0x30)
        {
          disdata[0]=0x20;      //如果百位为0,不显示
           if(disdata[1]==0x30)
           {
            disdata[1]=0x20;  //如果百位为0,十位为0也不显示
           }
         }
  write_add(0x80+0x40+8);
  write_date(flagdat);            //显示符号位
  write_add(0x80+0x40+9);
  write_date(disdata[0]);        //显示百位
  write_add(0x80+0x40+10);
  write_date(disdata[1]);       //显示十位
  write_add(0x80+0x40+11);
  write_date(disdata[2]);      //显示个位
  write_add(0x80+0x40+12);
  write_date(0x2e);           //显示小数点
  write_add(0x80+0x40+13);
  write_date(disdata[3]);    //显示小数位
  write_add(0x80+0x40+14);
  write_date(0xdf);   //显示"。"
  write_add(0x80+0x40+15);
  write_date(0x63);    //显示"c"
}
void init_info(void)
{
  write_add(0x80+0x00+0);
   for(i=0;i<14;i++)
    {
      write_date(stuinfo1[i]);
      delay(5);
    }
  write_add(0x80+0x40+0);
    for(i=0;i<14;i++)
     {
      write_date(stuinfo2[i]);
      delay(5);
     }
}

wifi0s0-1480511601IMG_20141122_230623.jpg
显示情况 显示情况
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
awt
2019-07-16 09:28
时序错误,你可以试一下这个程序

晶振22.1184M,,,如果你的晶振是11M的话就把延时都除以2
/************************************************/
//延时函数
/************************************************/
void delay(unsigned int k)
{
     while(k--);
   
}
/************************************************/
//复位
/************************************************/
void DS18B20_res(void)
{
DQ=1;
delay(1);
DQ=0;
delay(660);
DQ=1;
while(DQ);
delay(660);
DQ=1;
}
/************************************************/
//读一个字节
/************************************************/
ReadOneChar(void)
{
unsigned char i,dat;

  DQ=1;
  delay(1);
   
for(i=8;i>0;i--)
  {
    DQ=0;
    delay(1);
    DQ=1;
    dat>>=1;

    delay(11);
    if(DQ)
   
    dat|=0x80;
    delay(68);
    DQ=1;
    delay(1);
  }
return(dat);

}
/************************************************/
//写一个字节
/************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned int a=0;
for(a=8;a>0;a--)
  {
   DQ=0;
   DQ=dat&0x01;
   delay(74);
   DQ=1;
   dat>>=1;
   delay(1);
  }
delay(65);
}

评分

参与人数 1积分 +5 收起 理由 wu0668 + 5 资源分享达人,加分鼓励!

查看全部评分

一周热门 更多>