×
单片机 > 单片机程序设计 > 详情

基于STM32的DS18B20驱动

发布时间:2020-06-18 发布时间:
|

#include "ds18b20.h"

#include "delay.h" 



short tmp_arg; //温度平滑滤波

//复位DS18B20

void DS18B20_Rst(void)   

{                 

DS18B20_IO_OUT(); //SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; //拉低DQ

    delay_us(750);     //拉低750us

    DS18B20_DQ_OUT=1; //DQ=1 

delay_us(15);     //15US

}

//等待DS18B20的回应

//返回1:未检测到DS18B20的存在

//返回0:存在

u8 DS18B20_Check(void)   

{   

u8 retry=0;

DS18B20_IO_IN(); //SET PG11 INPUT  

    while (DS18B20_DQ_IN&&retry<200)

{

retry++;

delay_us(1);

};  

if(retry>=200)return 1;

else retry=0;

    while (!DS18B20_DQ_IN&&retry<240)

{

retry++;

delay_us(1);

};

if(retry>=240)return 1;    

return 0;

}

//从DS18B20读取一个位

//返回值:1/0

u8 DS18B20_Read_Bit(void)  

{

    u8 data;

DS18B20_IO_OUT(); //SET PG11 OUTPUT

    DS18B20_DQ_OUT=0; 

delay_us(2);

    DS18B20_DQ_OUT=1; 

DS18B20_IO_IN(); //SET PG11 INPUT

delay_us(12);

if(DS18B20_DQ_IN)data=1;

    else data=0;  

    delay_us(50);           

    return data;

}

//从DS18B20读取一个字节

//返回值:读到的数据

u8 DS18B20_Read_Byte(void)     

{        

    u8 i,j,dat;

    dat=0;

for (i=1;i<=8;i++) 

{

        j=DS18B20_Read_Bit();

        dat=(j<

    }    

    return dat;

}

//写一个字节到DS18B20

//dat:要写入的字节

void DS18B20_Write_Byte(u8 dat)     

 {             

    u8 j;

    u8 testb;

DS18B20_IO_OUT(); //SET PG11 OUTPUT;

    for (j=1;j<=8;j++) 

{

        testb=dat&0x01;

        dat=dat>>1;

        if (testb) 

        {

            DS18B20_DQ_OUT=0; // Write 1

            delay_us(2);                            

            DS18B20_DQ_OUT=1;

            delay_us(60);             

        }

        else 

        {

            DS18B20_DQ_OUT=0; // Write 0

            delay_us(60);             

            DS18B20_DQ_OUT=1;

            delay_us(2);                          

        }

    }

}

//开始温度转换

void DS18B20_Start(void) 

{                 

    DS18B20_Rst();   

DS18B20_Check();  

    DS18B20_Write_Byte(0xcc); // skip rom

    DS18B20_Write_Byte(0x44); // convert



//初始化DS18B20的IO口 DQ 同时检测DS的存在

//返回1:不存在

//返回0:存在      

u8 DS18B20_Init(void)

{

  GPIO_InitTypeDef  GPIO_InitStructure;

  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PORTG口时钟 


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PORTG.11 推挽输出

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOG, &GPIO_InitStructure);



  GPIO_SetBits(GPIOG,GPIO_Pin_11);    //输出1



DS18B20_Rst();



return DS18B20_Check();

}  

//从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)

    {

        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;    

}



short Get_tempAverage(void)

{

u32 temp_sum;

short temp;


temp = DS18B20_Get_Temp();

if(DS18B20_Init() == 0) //温度采集的起始条件

{

tmp_arg = temp;

temp_sum = tmp_arg;

temp_sum = temp_sum<<3; //放大8倍

}

temp_sum += temp; //加最近的温度值7

temp_sum -= tmp_arg; //减最开始的温度值0

tmp_arg = temp_sum >> 3;

return tmp_arg;

}



 






#ifndef __DS18B20_H


#define __DS18B20_H 

#include "sys.h"   



//IO方向设置

#define DS18B20_IO_IN()  {GPIOB->CRL&=0xFFFFF0FF;GPIOB->CRL|=8 << 1;}

#define DS18B20_IO_OUT() {GPIOB->CRL&=0xFFFFF0FF;GPIOB->CRL|=7 << 1;}

////IO操作函数   

#define DS18B20_DQ_OUT PBout(1) //数据端口 PB1

#define DS18B20_DQ_IN  PBin(1)  //数据端口 PB1 



extern short tmp_arg; //温度平滑滤波



u8 DS18B20_Init(void);//初始化DS18B20

short DS18B20_Get_Temp(void);//获取温度

void DS18B20_Start(void);//开始温度转换

void DS18B20_Write_Byte(u8 dat);//写入一个字节

u8 DS18B20_Read_Byte(void);//读出一个字节

u8 DS18B20_Read_Bit(void);//读出一个位

u8 DS18B20_Check(void);//检测是否存在DS18B20

void DS18B20_Rst(void);//复位DS18B20  

short Get_tempAverage(void); //温度平滑滤波

#endif

关键字:STM32  DS18B20驱动 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机的电子存包柜的软件设计