微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > Ds18b20+1602 测温,温度一直显示-1度,怎么回事?

Ds18b20+1602 测温,温度一直显示-1度,怎么回事?

时间:10-02 整理:3721RD 点击:
我用proteus仿真可以用1602显示出正确的温度,可是焊完电路,1602一直显示-1度,是怎么回事啊?

先检查硬件有没有焊错!如果没有请发程序上来!

硬件没有焊错,程序如下:(我写的是.h文件,然后调用该.h文件)
---------------------------------------------以下为主文件---------------------------------------------------------
#include<pic.h>
#include "Ds18b20.h"            //调用温度传感器头文件,头文件的编写在下面
#include "1602.h"                 //调用1602显示的都文件
__CONFIG(0x3B31);
void main()
{
        Lcd1602_Init();
        uchar Temper[4];
        Disp(0,0,'T');
        Disp(1,0,'E');
        Disp(2,0,'M');
        Disp(3,0,'P');
        Disp(4,0,':');
        while(1)
        {
                Temper[0]=Ds18_TemPart(Ds18_GetTem_char())[0];
                Temper[1]=Ds18_TemPart(Ds18_GetTem_char())[1];
                Temper[2]=Ds18_TemPart(Ds18_GetTem_char())[2];
                Temper[3]=Ds18_TemPart(Ds18_GetTem_char())[3];
                if(Temper[0]==1)
                {
                        Disp(5,0,'-');
                }
                else
                {
                        Disp(5,0,'+');
                }
                Disp(6,0,'0'+Temper[1]);
                Disp(7,0,'0'+Temper[2]);
                Disp(8,0,'0'+Temper[3]);
               
               
        }
}
-------------------------------------------以下为Ds18b20的头文件-----------------------------------------------------------
//--------------------------------------------
//Ds18b20 模块函数
//--------------------------------------------
//DQ为Ds数据连接口
//T_DQ为数据接口传输方向
//使用Ds18_GetTem_char()返回一个字节,包含温度
//使用Ds18_TemPart(uchar temp)将Ds18_GetTem_char()的字节返回一个数组[4]
//[0]:温度正负 [1]:温度百位 [2]:温度十位 [3]:温度个位
//---------------------------------------------------
#include<pic.h>
#define DQ RC0
#define T_DQ TRISC0
#define DQ_HIGH() T_DQ=1
#define DQ_LOW() T_DQ=0;DQ=0
#define uint unsigned int
#define uchar unsigned char
void Ds18_delay(uint x);
void Ds18_delay(uint x);
void Ds18_delayus(uint,uchar);
void Ds18_init();
void Ds18_write_byte(uchar date);
uchar Ds18_read_byte();
void Ds18_reset()
{
        uchar st=1;
        DQ_HIGH();
        NOP();NOP();
        while(st)
        {
                DQ_LOW();
                Ds18_delayus(70,30);
                DQ_HIGH();
                Ds18_delayus(4,4);
                if(DQ==1)
                        st=1;
                else
                        st=0;
                Ds18_delayus(50,10);
        }
}
void Ds18_write_byte(uchar date)
{
        uchar i,temp;
        DQ_HIGH();
        NOP();NOP();
        for(i=8;i>0;i--)
        {
                temp=date&0x01;//01010101
                DQ_LOW();
                Ds18_delayus(0,0);
                if(temp==1)
                        DQ_HIGH();
                Ds18_delayus(2,2);
                DQ_HIGH();
                date=date>>1;//00101010
        }
}
uchar Ds18_read_byte()
{
        uchar i,date=0;
        static bit j;
        for(i=8;i>0;i--)
        {
                date=date>>1;
                DQ_HIGH();
                NOP();NOP();
                DQ_LOW();
                NOP();NOP();NOP();NOP();NOP();NOP();
                DQ_HIGH();
                NOP();NOP();NOP();NOP();
                j=DQ;
                if(j==1)
                        date=date|0x80;//1000 0000
                Ds18_delayus(1,1);
        }
        return (date);
}

void Ds18_delayus(uint x,uchar y)
{
        uint i;
        uchar j;
        for(i=x;i>0;i--);
        for(j=y;j>0;j--);
}
void Ds18_delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
                for(b=110;b>0;b--);
}
void Ds18_init()
{
        T_DQ=0;
        DQ=0;
}
uchar Ds18_GetTem_char()
{
        Ds18_init();
        uchar tem1=0,tem2=0;
        uchar tem[4];
        uchar *temper;
        Ds18_reset();  //复位
        Ds18_write_byte(0xCC);//跳过ROM
        Ds18_write_byte(0x44);//温度转换
        Ds18_reset();
        Ds18_write_byte(0xCC);
        Ds18_write_byte(0xBE);
        tem1=Ds18_read_byte();
        tem2=Ds18_read_byte();
        tem1=tem1>>4;
        tem2=tem2<<4;
        tem1=tem1|tem2;
        return tem1;
}
uchar *Ds18_TemPart(uchar temp)
{
        uchar tem2;
        uchar tem[4];
        uchar temper;
        tem2=temp&0x7F;
        tem[0]=(temp&0x80)>>7;
        if(tem[0]==1)
        {
                tem2=128-tem2;
        }
        tem[1]=tem2/100;
        tem[2]=tem2%100/10;
        tem[3]=tem2%10;
        temper=tem;
        return temper;
}

求大神解答啊!这个问题困扰我很久了

你先让1602对应显示数字的地方显示其他字符看看,再就是仿真只是设计的一小部分,有时候程序要修改,比如延时什么的

@伏尔加的鱼 谢谢!我再看看

@BBOYBL 也谢谢你的热心!

小编最后怎么解决啊,我也是,求帮助啊

最后我用的LM35,没用18b20.。

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

网站地图

Top