微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds18b20在液晶上不能显示温度,求高手看看程序有问题没。

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

时间:10-02 整理:3721RD 点击:
/******************************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);
     }
}


显示情况


求高手指教,感恩不尽!

复位主机拉低的时间太短了

时序错误,你可以试一下这个程序
晶振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);
}

正在学习中..

怎么改?仿真时都能出来,在测试模块上也能显示出来。但是在我们的电路板上不能显示

仿真时也能成功,在基本模块上测试也能正常显示,我们的程序应该没什么错误,用的是11M的晶振

小编的意思是已经得到温度了没显示还是你18B20根本就没有被驱起来。
你都发现程序没有问题那就是硬件的问题了?!

你看我附带的那张图在1602上温度显示的是0.0℃,但是硬件电路什么的应该怎么处理?

小编用示波器看看,

另外,小编研究过你的延迟函数没有,准确吗?这玩意对时序要求也满高的

受益了,一直调试不出来,还以为是硬件问题.

你的问题解决了吗

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top