DS18B20的程序,找了半天也没找到问题在哪里,温度显示不出来

炼气士 2011-06-25 09:18:04
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P3^3; // DS18B20
sbit led=P0^0;
sbit E=P2^2;
sbit RS=P2^0;
sbit RW=P2^1;

uchar sign=0;
uchar tempI,tempD;
uchar tempIH,tempIL,tempDH,tempDL;
code uchar datas[]={"0123456789"};

//--1602
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void write_com(uchar com)
{
RS = 0;
RW = 0;
P0 = com;
E = 0;
delay_50us(10);
E = 1;
delay_50us(20);
E = 0;
}
void init1602(void)
{
delay_50us(300);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
delay_50us(100);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0c);
}

void write_data(uchar dat)
{
RS = 1;
RW = 0;
P0 = dat;
E = 0;
delay_50us(10);
E = 1;
delay_50us(20);
E = 0;
}
void display()
{
write_com(0x80);
//if(sign)
write_data(sign?'-':'+');

write_data(tempIH);
write_data(tempIL);
write_data('.');
write_data(tempD);
}


// DS18b20
void delay7us(uint i)
{
while(i--);
}
void init_18b20()
{
dq=1;
_nop_();
dq = 0;
delay7us(80);
// 释放总线
dq = 1;
delay7us(60);
// while(dq);
}
void write_18b20(uchar dat)
{
uchar i;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq = 0;
_nop_();
_nop_();

dq = dat&0x01;
delay7us(10);
dq = 1;
dat>>=1;
delay7us(1);

}

delay7us(10);
}
uchar read_18b20()
{
uchar i ,value;

for(i=0;i<8;i++)
{
dq = 0;
_nop_();
_nop_();
_nop_();
_nop_();
dq = 1;
_nop_();
_nop_();
value>>=1;
if(dq)
value|=0x80;

delay7us(10);
dq = 1;

}

delay7us(10);
return value;
}
void readTemp()
{
uchar a,b;
uint c;
init_18b20();
write_18b20(0xcc);
write_18b20(0x44);
delay7us(300); // 温度转换

init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a = read_18b20();
b = read_18b20();
c = b;
c=c<<8+a;
if(b&0xf0)
{
sign = 1; // 1是负,0是正
c=~c+1;
}else
{
sign = 0;
}

tempI=(c&0x0700)<<4+(c&0x00f0)>>4;
tempD=((c&0x0f)*0.625);

tempIH = datas[tempI/10];
tempIL= datas[tempI%10];

tempD = datas[tempD/10];

}
void main(void)
{
init1602();

while(1)
{
readTemp();
display();
}
}
1602上总是显示+00.0
...全文
374 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
炼气士 2011-06-25
  • 打赏
  • 举报
回复
三楼说的有道理,加上括号后,显示正常
炼气士 2011-06-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ljd680 的回复:]
发现问题在哪里了
好像不能这样处理,但这是为什么呢

比如
tempI=b<<4+a>>4;
就不行

tempI=b>>4;
tempI+=a>>4;
就可以,谁能解释一下,谢谢!
[/Quote]
写错了是笔误
应该是和tempI=b<<4;
tempI+=a>>4;比较
AnYidan 2011-06-25
  • 打赏
  • 举报
回复
tempI=b<<4+a>>4;

tempI=b>>4;
tempI+=a>>4;

Lz 认为等价吗?
jq_whh 2011-06-25
  • 打赏
  • 举报
回复
运算符号优选级的问题,不同的编译器,优选级可能略有不同。
如果想保证可移植性,就不要吝啬括号'('和')'。
炼气士 2011-06-25
  • 打赏
  • 举报
回复
发现问题在哪里了
好像不能这样处理,但这是为什么呢

比如
tempI=b<<4+a>>4;
就不行

tempI=b>>4;
tempI+=a>>4;
就可以,谁能解释一下,谢谢!
炼气士 2011-06-25
  • 打赏
  • 举报
回复
自己发现个问题
tempI=(c&0x0700)<<4+(c&0x00f0)>>4;
应该改成tempI=(c&0x0700)>>4+(c&0x00f0)>>4;
但好像还是不行

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧