20、DS18B20实验

1、实现对外部温度的采集。

2、严格按照时序来写程序。

分析一些代码:

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)   
{   
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT  
    while (DS18B20_DQ_IN&&retry<200)// <的运算优先级高于&&,先比较retry是不是小于retry,然后再将retry与DS18B20_DQ_IN进行&&运算,这一段代码对应着将总线拉高                                                                               //15us~60us的程序
{
retry++;
delay_us(1);
};  
if(retry>=200)return 1;
else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)// 对应着DS18B20返回一个240us的低电平脉冲应答
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;    
return 0;
}



20、DS18B20实验_第1张图片

读取一个字节操作:

//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)    // read one byte
{        
    u8 i,j,dat;
    dat=0;
for (i=1;i<=8;i++) 
{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);//读取时低位在前,高位在后    所以在读取的过程中要移位操作,把低位不断的往右移动。
    }    
    return dat;
}

得到温度:

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();  
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert    
    TL=DS18B20_Read_Byte(); // LSB   
    TH=DS18B20_Read_Byte(); // MSB  
     
    if(TH>7)    //判断依据读取的位数总共有16位,高8位的最高5位是1时,数值就大于7(00000111),以此来作为判断
    {
        TH=~TH;
        TL=~TL; 
        temp=0;//温度为负  
    }else temp=1;//温度为正    
    tem=TH; //获得高八位
    tem<<=8;    
    tem+=TL;//获得底八位
    tem=(float)tem*0.625;//转换     
if(temp)return tem; //返回温度值
else return -tem;    

DS18B20数据存放格式如下:

20、DS18B20实验_第2张图片

可知,当温度小于0时,这5位为1,也就是当读取的高位的数据大于7(0000111)时就说明是负数。

其他的按照BS18B20时序来写就可以了。










你可能感兴趣的:(STM32)