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

2019-07-15 20:24发布

我用proteus仿真可以用1602显示出正确的温度,可是焊完电路,1602一直显示-1度,是怎么回事啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
BBOYBL
1楼-- · 2019-07-16 02:01
先检查硬件有没有焊错!如果没有请发程序上来!
sdqdlgj
2楼-- · 2019-07-16 02:20
硬件没有焊错,程序如下:(我写的是.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;
}
sdqdlgj
3楼-- · 2019-07-16 06:49
求大神解答啊!!!!这个问题困扰我很久了
伏尔加的鱼
4楼-- · 2019-07-16 10:08
 精彩回答 2  元偷偷看……
sdqdlgj
5楼-- · 2019-07-16 12:44
@伏尔加的鱼 谢谢!我再看看
sdqdlgj
6楼-- · 2019-07-16 15:54
@BBOYBL 也谢谢你的热心!

一周热门 更多>