找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4369|回复: 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 单片机教程网

快速回复 返回顶部 返回列表