单片机用DS18B20测温,不显示温度,是不是温度启动动不了还是其他问题,请各位大侠帮忙看看,不甚感激! #i
3个回答
展开全部
时序不对 DS18B20 的时序要求很严格,稍有不慎就会读不出
void delay(uchar k)
{
while(--k);
}
void delay1(uint k)
{
uint i,j;
for(i=0;i<60;i++)
for(j=0;j<k;j++);
}
/*
每次读写前对DS18B20进行复位初始化。复位要求主CPU将数据线下拉500μ
,然后释放,DS18B20收到信号后等待16 - 60us然后60-240us的存在低脉冲
脉冲,主CPU收到此信号后表示复位成功。
*/
uchar init_ds18b20(void)//返回为0表示初始化成功
{
uchar j=0;
DQ=1;//这两条语句用不用不关紧要
delay(4);
DQ=0;
delay(180);//精确延时 730us 检测总线上是否有480-960微秒的低电平出现
delay(200);
DQ=1;
delay(15);//35us 如果有总线转为高电平后等待15-60微秒自动将总线电平拉低60-240微秒做出响应存在脉冲
j=DQ;
delay(50);//105us 至少要100秒以上
return(j);
}
uchar read_byte(void)
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=1;
dat>>=1;
if(DQ)
dat|=0x80;
delay(25);
}
return(dat);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=dat&0x01;
delay(10);//写所需时间
DQ=1;
dat>>=1;
delay(2);
}
delay(1);
}
这是我做过DB18B20 时序程序,很成功。 仅供参考
void delay(uchar k)
{
while(--k);
}
void delay1(uint k)
{
uint i,j;
for(i=0;i<60;i++)
for(j=0;j<k;j++);
}
/*
每次读写前对DS18B20进行复位初始化。复位要求主CPU将数据线下拉500μ
,然后释放,DS18B20收到信号后等待16 - 60us然后60-240us的存在低脉冲
脉冲,主CPU收到此信号后表示复位成功。
*/
uchar init_ds18b20(void)//返回为0表示初始化成功
{
uchar j=0;
DQ=1;//这两条语句用不用不关紧要
delay(4);
DQ=0;
delay(180);//精确延时 730us 检测总线上是否有480-960微秒的低电平出现
delay(200);
DQ=1;
delay(15);//35us 如果有总线转为高电平后等待15-60微秒自动将总线电平拉低60-240微秒做出响应存在脉冲
j=DQ;
delay(50);//105us 至少要100秒以上
return(j);
}
uchar read_byte(void)
{
uchar i=0,dat;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=1;
dat>>=1;
if(DQ)
dat|=0x80;
delay(25);
}
return(dat);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
delay(5);//15us
DQ=dat&0x01;
delay(10);//写所需时间
DQ=1;
dat>>=1;
delay(2);
}
delay(1);
}
这是我做过DB18B20 时序程序,很成功。 仅供参考
展开全部
问题大体上是有两个部分的。
一个是DS18B20的程序。你需要一步一步的检查,看看复位有没有成功。
另一个是显示程序,你同样需要用非常简单的程序测试,你的显示是没有问题的。
一个是DS18B20的程序。你需要一步一步的检查,看看复位有没有成功。
另一个是显示程序,你同样需要用非常简单的程序测试,你的显示是没有问题的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-04-27 · 知道合伙人教育行家
关注
展开全部
你的18b20程序不对,好好看看延时吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询