找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4511|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

為什么DS18B20顯示的溫度與LCD1602顯示的溫度不同??

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:305703 發(fā)表于 2018-4-19 11:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
20黑幣
本帖最后由 不想做畢設(shè) 于 2018-4-19 12:02 編輯

LCD溫度顯示為8度 DS18B20溫度顯示為64度 為什么會不一樣呢?會不會是延時出了問題?求大神們幫忙解答一下謝謝!!程序附上
#include <reg51.h>#include <intrins.h>
#define uchar unsigned char
#define uint unsigned intsbit RS=P2^2;                                                                        
sbit RW=P2^1;
sbit EN=P2^0;
sbit DQ=P3^2;        
uchar code str1[]={0x28,0x2a,0x83,0xba,0x03,0x00,0x00,0x8c};        //ROM 1
uchar code str2[]={0x28,0x05,0x76,0xba,0x03,0x00,0x00,0x6a};        //ROM2
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};        // 攝氏溫度符號
uchar data disdata[5];
uint tvalue;//溫度值
uchar tflag;//溫度正負標志
/*************************lcd1602程序**************************/
void delay1ms(uint ms)//延時1毫秒(不夠精確的)
{  uint i,j;     for(i=0;i<ms;i++)   
    for(j=0;j<100;j++);}
void wr_com(uchar com)//寫指令//
{ delay1ms(1);   
     RS=0;   
     RW=0;   
     EN=0;   
     P0=com;   
     delay1ms(1);   
     EN=1;   
     delay1ms(1);   
     EN=0;}
void wr_dat(uchar dat)//寫數(shù)據(jù)//
  { delay1ms(1);   
     RS=1;   
     RW=0;   
     EN=0;   
     P0=dat;   
     delay1ms(1);   
     EN=1;   
     delay1ms(1);   
     EN=0;}
void wr_new()                  //寫新字符
{    uchar i;        
       wr_com(0x40);        
       for(i=0;i<8;i++)        
         {    wr_dat(table);        }}
void lcd_init()//初始化設(shè)置//
{   delay1ms(15);        
     wr_com(0x38);delay1ms(5);        
    wr_com(0x08);delay1ms(5);        
    wr_com(0x01);delay1ms(5);         
   wr_com(0x06);delay1ms(5);      
  wr_com(0x0c);delay1ms(5);      
   wr_new();     
   wr_com(0x80);   
   wr_dat('A');     
   wr_com(0x81);   
   wr_dat(':');        
  wr_com(0x89);   
wr_dat(0x00);   
    wr_com(0x8a);  
    wr_dat('C');     
   wr_com(0xc9);  
  wr_dat(0x00);                                //攝氏溫度字符      
  wr_com(0xca);  
    wr_dat('C');     
  wr_com(0xc0);  
    wr_dat('B');  
      wr_com(0xc1);  
    wr_dat(':');}/******************************ds1820程序***************************************/
void delay_18B20(uint i)//延時1微秒
{   while(i--);}
void ds1820rst()/*ds1820復(fù)位*/
{   uchar x=0;        
     DQ = 1;          //DQ復(fù)位     
   delay_18B20(4); //延時     
   DQ = 0;          //DQ拉低      
  delay_18B20(100); //精確延時大于480us     
   DQ = 1;          //拉高      
  delay_18B20(40); }
uchar ds1820rd()/*讀數(shù)據(jù)*/
{ uchar i=0;
uchar dat = 0;  
for (i=0;i<8;i++)        
{   DQ = 0; //給脈沖信號  
  dat>>=1;   
DQ = 1; //給脈沖信號  
  if(DQ)    dat|=0x80;  
  delay_18B20(10);        }
  return(dat);}
void ds1820wr(uchar dat)/*寫數(shù)據(jù)*/
{    uchar i=0;  
     for (i=0; i<8; i++)           
        { DQ = 0;      
          DQ = dat&0x01;     
         delay_18B20(10);   
           DQ = 1;   
           dat>>=1;    }}
void b20_Matchrom(uchar a)         //匹配ROM
{   char j;
       ds1820wr(0x55);           //發(fā)送匹配ROM命令
        if(a==1)        
{        for(j=0;j<8;j++)      
          ds1820wr(str1[j]);                //發(fā)送18B20的序列號,先發(fā)送低字節(jié)         }  
      if(a==2)      
{        for(j=0;j<8;j++)   
            ds1820wr(str2[j]);                //發(fā)送18B20的序列號,先發(fā)送低字節(jié)   
      }}
read_temp(uchar z)/*讀取溫度值并轉(zhuǎn)換*/
{   uchar a,b;   
     float tt;   
     ds1820rst();   
    ds1820wr(0xcc);                                 //讀序列號  
   ds1820rst();   
      if(z==1)        
{    b20_Matchrom(1);                 //匹配ROM 1        }  
      if(z==2)      
{      b20_Matchrom(2);                 //匹配ROM         2        }   
    ds1820wr(0x44);//*啟動溫度轉(zhuǎn)換*/
    delay1ms(5);  
    ds1820rst();  
    ds1820wr(0xcc);                                //讀序列號   
    ds1820rst();         
  if(z==1)        
{      b20_Matchrom(1);                            //匹配ROM 1        }
    if(z==2)        
{    b20_Matchrom(2);                                //匹配ROM         2        }  
   ds1820wr(0xbe);//*讀取溫度*/         
  a=ds1820rd();        
  b=ds1820rd();        
  tvalue=b;      
   tvalue<<=8;        
  tvalue=tvalue|a;   
  f(tvalue<0x0fff)   
  tflag=0;   
  else                  
{        tvalue=~tvalue+1;                tflag=1;                 }        
tt=tvalue*0.0625;        
tvalue=tt*10;        
return(tvalue);}
/*****************顯示函數(shù)******************************/
void ds1820disp(uchar z)//溫度值顯示
{    uchar flagdat;
    disdata[0]=tvalue/1000+0x30;//百位數(shù)
     disdata[1]=tvalue%1000/100+0x30;//十位數(shù)
     disdata[2]=tvalue%100/10+0x30;//個位數(shù)
     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也不顯示    }   }
if(z==1)   
{    wr_com(0x82);
    wr_dat(flagdat);//顯示符號位
   wr_com(0x83);
   wr_dat(disdata[0]);//顯示百位
    wr_com(0x84);
    wr_dat(disdata[1]);//顯示十位
    wr_com(0x85);
   wr_dat(disdata[2]);//顯示個位
    wr_com(0x86);
}
  if(z==2)   
{    wr_com(0xc2);
    wr_dat(flagdat);//顯示符號位
    wr_com(0xc3);
    wr_dat(disdata[0]);//顯示百位
    wr_com(0xc4);
    wr_dat(disdata[1]);//顯示十位
     wr_com(0xc5);
    wr_dat(disdata[2]);//顯示個位
     wr_com(0xc6);
   }}
/********************主程序***********************************/
void main()
{    lcd_init();//初始化顯示   
      while(1)   
{          read_temp(1);//讀取溫度   
            ds1820disp(1);//顯示   
            read_temp(2);//讀取溫度   
             ds1820disp(2);//顯示//   
             delay1ms(10000);  }}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:249060 發(fā)表于 2018-4-22 17:03 | 只看該作者
顯示的時候是否加上了‘0’,這個很關(guān)鍵
回復(fù)

使用道具 舉報

板凳
ID:111634 發(fā)表于 2018-4-22 19:53 | 只看該作者
本帖最后由 zl2168 于 2018-4-22 19:54 編輯

正確有效的案例不會不一樣,你不一樣的原因多數(shù)是讀數(shù)轉(zhuǎn)換程序出了問題。給你介紹個正確有效的案例。
實例97  一線式DS18B20測溫

Proteus仿真一下,確認有效。
實例97 DS18B20測溫.rar (51.78 KB, 下載次數(shù): 35)
以上摘自張志良編著《80C51單片機仿真設(shè)計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機應(yīng)用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表