Stm32-DS18B20的使用

来源:互联网 发布:编程谜题 pdf 编辑:程序博客网 时间:2024/06/07 22:00

库函数版本

端口:PA0

.c文件:

#include "ds18b20.h"#include "SysTick.h"/*PA0-DQ*///复位DS18B20void DS18B20_Rst(void)   {                 DS18B20_IO_OUT(); //SET PA0 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 PA0 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/0u8 DS18B20_Read_Bit(void)  // read one bit{    u8 data;DS18B20_IO_OUT();//SET PA0 OUTPUT    DS18B20_DQ_OUT=0; Delay_us(2);    DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PA0 INPUTDelay_us(12);if(DS18B20_DQ_IN)data=1;    else data=0;     Delay_us(50);               return data;}//从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//dat:要写入的字节void DS18B20_Write_Byte(u8 dat)      {                 u8 j;    u8 testb;DS18B20_IO_OUT();//SET PA0 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)// ds1820 开始转换{                      DS18B20_Rst();  //复位 DS18B20_Check();//检测传感器是否存在    DS18B20_Write_Byte(0xcc);//rom    DS18B20_Write_Byte(0x44);// 转换} //初始化DS18B20的IO口 DQ 同时检测DS的存在//返回1:不存在//返回0:存在     u8 DS18B20_Init(void){ GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口时钟  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PORTA0 推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_0);    //输出1DS18B20_Rst();return DS18B20_Check();}  //从ds18b20得到温度值//精度:0.1C//返回值:温度值 (-550~1250) float DS18B20_Get_Temp(void){    u8 temp;    u8 TL,TH;float Temperature;short tem;DS18B20_Init();//初始化    DS18B20_Start ();                    // ds1820开始转换    DS18B20_Rst();    DS18B20_Check();     DS18B20_Write_Byte(0xcc);// 写rom    DS18B20_Write_Byte(0xbe);// 转换        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;//获得低八位    Temperature=(float)((float)tem*0.0625);//转换     /*if(temp)return tem; //返回温度值else return -tem;    */return Temperature;} 

.h文件

#ifndef __DS18B20_H#define __DS18B20_H #include "stm32f10x.h" #include "sys.h" //#define uchar unsigned char////////////////////////////////////////////////////////////////////////////////// //DS18B20:PA0-DQ////////////////////////////////////////////////////////////////////////////////////IO方向设置#define DS18B20_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}#define DS18B20_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}////IO操作函数   #defineDS18B20_DQ_OUT PAout(0) //数据端口PA0#defineDS18B20_DQ_IN  PAin(0)  //数据端口PA0    u8 DS18B20_Init(void);//初始化DS18B20float 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);//检测是否存在DS18B20void DS18B20_Rst(void);//复位DS18B20  //void Send_temp(void);//发送数据到串口  #endif


0 0
原创粉丝点击