本帖最后由 duoluoxiaosheng 于 2013-10-30 09:56 编辑
当温度为零下16度的时候,显示为零,检查了半天,不知道什么情况,求大神解惑啊!!!
//获取温度数据,并处理
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //连续读两个字节数据 //读低8位
b=ReadOneChar(); //读高8位
if((b&0xf8)!=0x00) //负温度处理
{
b=~b;
a=~a+1;
flag=1;
}
else flag=0;
t=b;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
下面是显示
void DSY_DISPLAY(uint x)
{
uint Hundred,Ten,One,Dot1;
P0=0xff;
P2=0x00;
Hundred=x/1000;
Ten=x%1000/100;
One=x%100/10;
Dot1=x%10;
P2=0x08;
if(flag) P0=0xbf;
else if(Hundred) P0=DSY_CODE[Hundred];
else P0=0xff;
delay1ms(10);
P2=0x04;
if (Ten==0 && Hundred==0) P0=0xff;
P0=DSY_CODE[Ten];
delay1ms(10);
P2=0x02;
P0=DSY_CODE[One];
delay1ms(10);
P2=0x02;
P0=0x7f;
delay1ms(10);
P2=0x01;
P0=DSY_CODE[Dot1];
delay1ms(10);
}
0