关于温度处理函数的一些笔记:
从ds18b20读取到的值带有4位小数,二进制0.0001在十进制中为0.0625,二进制在运算中自动转换成十进制乘以0.0625。再乘以10或100是为了防止数值过小,在浮点类型转换为整数类型时精度丢失,后面取整取余的时候再调整回来就好了。+0.5是为了四舍五入,计算机小数是直接舍弃的。
关于温度负值的处理"取反后加一"和"减一后取反"结果是相同的。
- 取反后加一:原码=补码的补码
- 减一后取反:补码的逆运算
//基于51单片机
sbit DQ = P1^1;
int Ds18b20_Init() //ds18b20初始化
{
DQ = 0;
Delay10us(65);
DQ = 1;
Delay10us(7);
if(DQ==1){
return 1;//初始化成功
}
else{
return 0;//初始化失败
}
}
void Ds18b20_Write_Cmd(unsigned char dat)//向ds18b20写一个字节的命令
{
unsigned int i,j;
for(j=0;j<8;j++)
{
DQ = 0;
i++;
DQ = dat & 0x01;
i = 6;
Delay10us(7);
DQ = 1;
dat >>= 1;
}
}
unsigned char Ds18b20_Read_Date() //从ds18b20读取一个字节的命令
{
unsigned char date,mid_date;
unsigned int i,j;
for(j=0;j<8;j++)
{
DQ = 0;
i++;
DQ = 1;
i++;
i++;
mid_date = DQ;
date = (date >> 1)|(mid_date << 7);
i = 4;
while(i--);
}
return date;
}
void ds18b20_begina()//ds18b20开始温度测量
{
Ds18b20_Init();
DelayMs(1);
Ds18b20_Write_Cmd(0xcc);
Ds18b20_Write_Cmd(0x44);
DelayMs(1000);
}
unsigned int datepros(int temp_2) //温度数据处理函数
{
float temp_float;
if(temp_2<0)
{
Lcd1602_write_cmd(0x80+0x45);
Lcd1602_write_date('-');
temp_2=temp_2-1;
temp_2=~temp_2;
temp_float=temp_2;
temp_2=temp_float*0.0625*10+0.5;
}
else
{
Lcd1602_write_cmd(0x80+0x45);
Lcd1602_write_date('+');
temp_float=temp_2;
temp_2=temp_float*0.0625*10+0.5;
}
temp_1=temp_2/10;
return temp_2;
}