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条回答
qq729101414
1楼-- · 2019-07-16 18:01
 精彩回答 2  元偷偷看……
850421172
2楼-- · 2019-07-16 23:29
qq729101414 发表于 2014-11-23 18:08
楼主的意思是已经得到温度了没显示还是你18B20根本就没有被驱起来。
你都发现程序没有问题那就是硬件的问题 ...

你看我附带的那张图在1602上温度显示的是0.0℃,但是硬件电路什么的应该怎么处理?
zqdl8
3楼-- · 2019-07-16 23:56
楼主用示波器看看,
zqdl8
4楼-- · 2019-07-17 04:02
另外,楼主研究过你的延迟函数没有,准确吗?这玩意对时序要求也满高的
wu0668
5楼-- · 2019-07-17 08:39
awt 发表于 2014-11-23 09:02
时序错误,你可以试一下这个程序

晶振22.1184M,,,如果你的晶振是11M的话就把延时都除以2

受益了,一直调试不出来,还以为是硬件问题.
刘三跟
6楼-- · 2019-07-17 11:19
 精彩回答 2  元偷偷看……

一周热门 更多>