微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为啥18b20显示的温度是90多度,环境才20多度

为啥18b20显示的温度是90多度,环境才20多度

时间:10-02 整理:3721RD 点击:
/*********ds18b20.c******/
#include<reg51.h>
#include"ds18b20.h"
#include"12864.h"
void Init_Com()//串口初始化
{
   TMOD=0x20;
   PCON=0x00;
   SCON=0x50;
   TH1=0xfd;
   TL1=0xfd;
   TR1=1;
}
void Init_DS18B20()//ds18b20初始化函数
{
         unsigned char x=0;
         DQ = 1;    //DQ复位
         delay(8);  //稍做延时
         DQ = 0;    //单片机将DQ拉低
         delay(80); //精确延时 大于 480us
         DQ = 1;    //拉高总线
         delay(14);
         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
         delay(20);
}
ReadOneChar(void)//读一个字节
{
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(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
}
delay(4);
}
ReadTemperature(void)  //测量温度
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned int t=0;
        float tt=0;
        Init_DS18B20();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        Init_DS18B20();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        a=ReadOneChar();
        b=ReadOneChar();
        t=b<<8;
        tt=t|a;//2个8位寄存器温度合并为1个16位的
        t=tt*0.625;                   //对结果保留小数点后一位
         
        return(t);
}
void tmpchange(void)//温度转换
{
  Init_DS18B20();
  delay(20);
  WriteOneChar(0xcc);
  WriteOneChar(0x44);
}
void init1()//总的初始化函数
  {
    Init_Com();//串口初始化
     init();//lcd12864初始化

  }
/******12864.c******/
#include<reg51.h>
#include"12864.h"
uchar code dis1[] = {"当前温度"};
uchar code dis2[] = {"设定温度"};
uchar code table[]="0123456789";
          bit lcd_busy()         //液晶忙操作
{                          
    bit result;
    rs = 0;
    rw= 1;
    en= 1;
    delayNOP();
    result = (bit)(P0&0x80);
    en = 0;
    return(result);
}       
   void lcd_wcom(uchar com )           //写指令
   {
      while(lcd_busy());
            rs=0;
         rw=0;
         en=0;
        _nop_();
    _nop_();
    P0 = com;
    delayNOP();
    en = 1;
    delayNOP();
    en = 0;
   }
        void lcd_wdat(uchar dat)        //写数据
{                          
   while(lcd_busy());
    rs= 1;
    rw= 0;
    en= 0;
    P0 = dat;
    delayNOP();
    en= 1;
    delayNOP();
    en= 0;
}
void init (void)         //12864初始化
{        delay(50);
    psb=1;                 //并口输入
   delay(100);
   lcd_wcom(0x34);//扩充指令操作
   delay(5);
   lcd_wcom        (0x30);//基本指令操作
   delay(5);
   lcd_wcom(0x0c);//开显示,关光标
   delay(5);
   lcd_wcom(0x01);//清屏
   delay(5);
   lcd_wcom(0x06);
   delay(10);
}
          void lcd_pos(uchar X,uchar Y)         //显示在第几列第几行
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   lcd_wcom(pos);     //显示地址
}
         void lcd_display()                          //LCD12864显示程序 (显示固定不变的)
         {          uint i;
                  lcd_pos(0,0);             //设置显示位置为第一行的第1个字符
    i=0;
    while(dis1[i] != '\0')
     {                         //显示字符
       lcd_wdat(dis1[i]);
       i++;
     }
    lcd_pos(2,0);             //设置显示位置为第二行的第1个字符
    i=0;
    while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);      //显示字符
       i++;
     }
         
         }         
         
  void ds18b20_display(uint temp)//显示程序温度
{  uint a0,a1,a2,a3,i;
  a0=temp/1000;
  a0=a0%10;
  a1=temp/100;
  a1=a1%10;
  a2=temp%100;
  a2=a2/10;
  a3=temp%10;
        lcd_pos(1,0);
        lcd_wdat('+');
  lcd_wdat(table[a1]);//显示十位
  lcd_wdat(table[a2]);//显示个位
  lcd_wdat('.');//显示小数点
  lcd_wdat(table[a3]);//显示小数点后一位
    lcd_pos(1,3);             //设置显示位置为第二行的第1个字符
    i=6;
    while(dis2[i] != '\0')
     {
       lcd_wdat(dis2[i]);      //显示字符
       i++;
     }
  }
/********main.c*****/
#include"ds18b20.h"
#include"12864.h"
#include"key.h"
#include"delay.h"
void main()
{
           init();         
             lcd_display();
      ds18b20_display(ReadTemperature());
          while(1) ;
}

你的时序有问题?你的数据左移了一位,你再把时序改一下,我以前碰到过这问题,我在采集AM2301湿温度时就遇到过这问题,用单总线采集数据,你再看看你的时序

开头的时序有问题,就是开头的0被你搞掉了,你把开始拉低的时序改一下,开头的时序有问题

要怎么改呢?求程序,谢谢,本人新手

,谢谢,要怎么改呢,求程序,本人新手。谢谢

我程序不是标准的,我只是靠自己理解写出来的,一般的卖家都有一个标准的时序例程来的,而且我是用STM32不是51的,你还是自己再试试吧!

你转换温度系数不对,应该是0.0625.

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

网站地图

Top