求助!请问为什么我用DS18B20显示温度的时候
时间:10-02
整理:3721RD
点击:
求助!请问为什么我用DS18B20显示温度的时候,一旦温度达到32度以上,LED显示屏就显示一下子跳到了48度呢?我验证过了显示部分没错,那么应该是读取的时候有问题!下面是子程序:
void read_temperature() //读取温度
{
uchar temp_lsb,temp_msb,temp;
uint tempv;
reset18B02(); //复位
write18B02(0xcc); //忽略ROM指令
write18B02(0x44); //温度转换
while(!DQ); //等待转换完成
reset18B02();
write18B02(0xcc);
write18B02(0xbe); //读取暂存器
temp_lsb=read18B02(); //读暂存器第一个字节
temp_msb=read18B02(); //读暂存器第二个字节
reset18B02();
tempv=temp_msb; //复位,用来停止读取数据
tempv=tempv<<8|temp_lsb; //将两个字节合并成一个int型
temp=(uchar)(tempv>>4);//去掉小数部分,化成char型数据
if((temp_msb&0x80)==0x80)//如果是负温度
{
tempflag=1; //负号显示
tempr=~temp+1; //实际温度值为读取值的补码
tempx=fractioncode[(~temp_lsb+1)&0x0f];//取小数部分补码,将16刻度转换为10刻度,精度为0.1度
}
else//如果是正温度
{
tempflag=0;//正温度,负号不显示
tempr=temp;//
tempx=fractioncode[temp_lsb&0x0f]; //取小数部分,将16刻度转换为10刻度,精度为0.1度
}
}
为什么不行呢?
void read_temperature() //读取温度
{
uchar temp_lsb,temp_msb,temp;
uint tempv;
reset18B02(); //复位
write18B02(0xcc); //忽略ROM指令
write18B02(0x44); //温度转换
while(!DQ); //等待转换完成
reset18B02();
write18B02(0xcc);
write18B02(0xbe); //读取暂存器
temp_lsb=read18B02(); //读暂存器第一个字节
temp_msb=read18B02(); //读暂存器第二个字节
reset18B02();
tempv=temp_msb; //复位,用来停止读取数据
tempv=tempv<<8|temp_lsb; //将两个字节合并成一个int型
temp=(uchar)(tempv>>4);//去掉小数部分,化成char型数据
if((temp_msb&0x80)==0x80)//如果是负温度
{
tempflag=1; //负号显示
tempr=~temp+1; //实际温度值为读取值的补码
tempx=fractioncode[(~temp_lsb+1)&0x0f];//取小数部分补码,将16刻度转换为10刻度,精度为0.1度
}
else//如果是正温度
{
tempflag=0;//正温度,负号不显示
tempr=temp;//
tempx=fractioncode[temp_lsb&0x0f]; //取小数部分,将16刻度转换为10刻度,精度为0.1度
}
}
为什么不行呢?
我也来坐等答案了