用数码管显示ds18b20 为什么显示温度一直不变?
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int dudata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
unsigned int wedata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit we=P2^1;
sbit du=P2^0;
sbit DQ=P2^2;
uchar tempdata[6];
uchar temph,templ,temp,flag_get,num;
void ds18B20 ();
void write_B(uchar dat);
uchar read_B();
uint duqutemp ();
void display ();
void delay (uchar i)
{
while(i--);
}
void display ()
{
static int i=0;
P0=0;
we=1;
we=0;
P0=wedata;
we=1;
we=0;
P0=tempdata;
du=1;
du=0;
delay(200);
i++;
if(i==6)
i=0;
}
void main ( )
{
while(1)
{
tempdata[5]=0x39; //最后一位显示温度符号 cC
tempdata[0]=0;
tempdata[1]=dudata[temph/100];
tempdata[2]=dudata[(temph%100)/10];
tempdata[3]=dudata[(temph%100)%10];
tempdata[4]=dudata[templ];
display();
if(flag_get==1)
{
temp=duqutemp();
temph=temp>>4;
templ=temp&0x0f;
templ=templ*6/10;
flag_get=0;
}
}
}
void ds18B20 ()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);//600us
DQ=1;
delay(8); //等待15到60毫秒
n=DQ;
delay(8);
}
void write_B (uchar dat)
{
uchar t;
for(t=0;t<8;t++)
{
DQ=0;
DQ=dat|0x01;
delay(8);// 45us
DQ=1;
dat>>=1; //从最低位写入数据
}
delay(4);
}
uchar read_B()
{
uchar t,value;
for(t=0;t<8;t++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80; //1000 0000 从最低位开始读取
delay(4);
}
return (value);
}
uint duqutemp ()
{
uchar a,c,t;
ds18B20();
write_B(0xcc); //跳过rom
write_B(0x44); //启动温度转换 开始检测温度
delay(200); //给时间读取温度
ds18B20 ();
write_B(0xcc);//
write_B(0xbe); // 读取温度
a=read_B();
c=read_B();
c<<=8;
t=a+c;
return t;
}
看了半天还是不明白哪里出错了 ,求高手赐教,万分感激!
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned int dudata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
unsigned int wedata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit we=P2^1;
sbit du=P2^0;
sbit DQ=P2^2;
uchar tempdata[6];
uchar temph,templ,temp,flag_get,num;
void ds18B20 ();
void write_B(uchar dat);
uchar read_B();
uint duqutemp ();
void display ();
void delay (uchar i)
{
while(i--);
}
void display ()
{
static int i=0;
P0=0;
we=1;
we=0;
P0=wedata;
we=1;
we=0;
P0=tempdata;
du=1;
du=0;
delay(200);
i++;
if(i==6)
i=0;
}
void main ( )
{
while(1)
{
tempdata[5]=0x39; //最后一位显示温度符号 cC
tempdata[0]=0;
tempdata[1]=dudata[temph/100];
tempdata[2]=dudata[(temph%100)/10];
tempdata[3]=dudata[(temph%100)%10];
tempdata[4]=dudata[templ];
display();
if(flag_get==1)
{
temp=duqutemp();
temph=temp>>4;
templ=temp&0x0f;
templ=templ*6/10;
flag_get=0;
}
}
}
void ds18B20 ()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);//600us
DQ=1;
delay(8); //等待15到60毫秒
n=DQ;
delay(8);
}
void write_B (uchar dat)
{
uchar t;
for(t=0;t<8;t++)
{
DQ=0;
DQ=dat|0x01;
delay(8);// 45us
DQ=1;
dat>>=1; //从最低位写入数据
}
delay(4);
}
uchar read_B()
{
uchar t,value;
for(t=0;t<8;t++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80; //1000 0000 从最低位开始读取
delay(4);
}
return (value);
}
uint duqutemp ()
{
uchar a,c,t;
ds18B20();
write_B(0xcc); //跳过rom
write_B(0x44); //启动温度转换 开始检测温度
delay(200); //给时间读取温度
ds18B20 ();
write_B(0xcc);//
write_B(0xbe); // 读取温度
a=read_B();
c=read_B();
c<<=8;
t=a+c;
return t;
}
看了半天还是不明白哪里出错了 ,求高手赐教,万分感激!
没看小编程序,不才不会编。不过敢问小编硬件上没接错吧。
没有 针脚检查很多遍了
c<<=8;
t=a+c;
return t;
最后的处理函数写错了,第二行是t=a|c; 目的是把高八位和低八位合并成一个字节
我也遇到跟你一样的情况。但是是时序设置的有问题。把时序该对就好了
我也遇到跟你一样的情况。但是是时序设置的有问题。把时序该对就好了
把write_B 中的这一DQ=dat|0x01;位改成DQ=dat&0x01;试试
我也是这个问题,但是程序放在单片机上正常工作。而在自己焊的板子上却不会读取温度,硬件焊接是按照单片机原理图焊接的,不知道为什么不工作
同问,我的一直显示15.9度
谢谢分享谢谢分享谢谢分享
flag_get没有再置高!if只运行一次
同问,我的是8.5
时序怎么改啊
对 我的也是 这个度数 后来怎么解决的啊