Ds18b20+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.。
