久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4500|回復: 2
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
20黑幣
本帖最后由 不想做畢設 于 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)//寫數據//
  { 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()//初始化設置//
{   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復位*/
{   uchar x=0;        
     DQ = 1;          //DQ復位     
   delay_18B20(4); //延時     
   DQ = 0;          //DQ拉低      
  delay_18B20(100); //精確延時大于480us     
   DQ = 1;          //拉高      
  delay_18B20(40); }
uchar ds1820rd()/*讀數據*/
{ 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)/*寫數據*/
{    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);           //發送匹配ROM命令
        if(a==1)        
{        for(j=0;j<8;j++)      
          ds1820wr(str1[j]);                //發送18B20的序列號,先發送低字節         }  
      if(a==2)      
{        for(j=0;j<8;j++)   
            ds1820wr(str2[j]);                //發送18B20的序列號,先發送低字節   
      }}
read_temp(uchar z)/*讀取溫度值并轉換*/
{   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);//*啟動溫度轉換*/
    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);}
/*****************顯示函數******************************/
void ds1820disp(uchar z)//溫度值顯示
{    uchar flagdat;
    disdata[0]=tvalue/1000+0x30;//百位數
     disdata[1]=tvalue%1000/100+0x30;//十位數
     disdata[2]=tvalue%100/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也不顯示    }   }
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一二三区 | 欧美在线a| 国产一区二区欧美 | 97精品超碰一区二区三区 | 亚洲第一天堂 | 国产乱码精品1区2区3区 | 色婷婷综合久久久久中文一区二区 | 婷婷狠狠 | 在线中文一区 | 国产一伦一伦一伦 | 91精品国产综合久久久动漫日韩 | 青青草亚洲 | 亚洲天堂av在线 | 日韩免费在线观看视频 | 亚洲一区二区视频 | 伊人免费观看视频 | 国产一区欧美 | 男人天堂久久久 | 91色在线| 日本网站免费在线观看 | 国产一级一级毛片 | 欧美精品第三页 | 亚洲一区视频在线 | 欧美6一10sex性hd | 91亚洲一区 | 亚洲一区二区免费视频 | 91在线网站| 日产精品久久久一区二区福利 | 999久久| 作爱视频免费观看 | 成人精品免费视频 | 久久久久国产 | 日日夜夜精品免费视频 | 99视频在线播放 | 福利视频网站 | 国产日韩视频 | 精品视频导航 | 欧美激情综合网 | 香蕉av免费 | 国产视频一区二区三区四区五区 | 亚洲成人av在线播放 |