DS18B20温度模块驱动(STM32)

发布者:睿智之光最新更新时间:2019-05-08 来源: eefocus关键字:DS18B20  温度模块驱动  STM32 手机看文章 扫描二维码
随时随地手机看文章

一、前期准备

单片机:STM32F103C8T6

开发环境:MDK5.14

库函数:标准库V3.5

DS18B20模块:淘宝有售

在这里插入图片描述

二、实验效果


在这里插入图片描述
在这里插入图片描述

三、驱动原理

看数据手册。

需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。


四、驱动代码

ds18b20.h


#ifndef __DS18B20_H__

#define __DS18B20_H__

#include "stm32f10x.h"

#include "gpio.h"

#include "delay.h"


#define DS18B20_Direction_I  {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 8;}

#define DS18B20_Direction_O  {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 3;}


#define DS18B20_DQ_O PAout(0) 

#define DS18B20_DQ_I PAin(0) 


extern uint8_t DS18B20_IsOnline(void) ;

extern void DS18B20_StartConversion(void);

extern uint8_t DS18B20Configuration(void);

extern int16_t DS18B20_GetTemperature(void);

#endif


ds18b20.c


#include "ds18b20.h"


//复位DS18B20

void DS18B20_Reset(void)    

{                 

DS18B20_Direction_O; //SET PG11 OUTPUT

    DS18B20_DQ_O = 0; //拉低DQ

    DelayUs(750);    //拉低750us

    DS18B20_DQ_O = 1; //DQ=1 

DelayUs(15);      //15US

}


//等待DS18B20的回应

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

//返回0:存在

uint8_t DS18B20_IsOnline(void)    

{   

uint16_t retry = 0;

DS18B20_Direction_I; //SET PA0 INPUT

    while (DS18B20_DQ_I && retry < 200)

{

retry++;

DelayUs(1);

};  

if(retry >= 200)

{

return 1;

}

else 

{

retry = 0;

}

    while (!DS18B20_DQ_I && retry < 240)

{

retry ++;

DelayUs(1);

};

if(retry >= 240)

{

return 1;

}

 

return 0;

}


//从DS18B20读取一个位

//返回值:1/0

uint8_t DS18B20_ReadBit(void)  

{

    uint8_t data;

DS18B20_Direction_O;

    DS18B20_DQ_O = 0; 

DelayUs(2);

    DS18B20_DQ_O = 1; 

DS18B20_Direction_I;

DelayUs(12);

if(DS18B20_DQ_I)

{

data = 1;

}

    else 

{

data = 0;

}

    DelayUs(50);           

    return data;

}


//从DS18B20读取一个字节

//返回值:读到的数据

uint8_t DS18B20_ReadByte(void)     

{        

    uint8_t i, j, dat;

    dat = 0;

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

{

        j = DS18B20_ReadBit();

        dat = (j << 7) | (dat >> 1);

    }     

    return dat;

}


//写一个字节到DS18B20

//dat:要写入的字节

void DS18B20_WriteByte(uint8_t dat)     

 {             

    uint8_t j;

    uint8_t testb;

DS18B20_Direction_O; //SET PG11 OUTPUT;

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

{

        testb = dat & 0x01;

        dat >>= 1;

        if (testb) 

        {

            DS18B20_DQ_O = 0; // Write 1

            DelayUs(2);                            

            DS18B20_DQ_O = 1;

            DelayUs(60);             

        }

        else 

        {

            DS18B20_DQ_O = 0; // Write 0

            DelayUs(60);             

            DS18B20_DQ_O = 1;

            DelayUs(2);                          

        }

    }

}

 

//开始温度转换

void DS18B20_StartConversion(void) 

{                   

    DS18B20_Reset();    

DS18B20_IsOnline();  

    DS18B20_WriteByte(0xcc); // skip rom

    DS18B20_WriteByte(0x44); // convert


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

//返回1:不存在

//返回0:存在     

uint8_t DS18B20Configuration(void)

{

  GPIO_InitTypeDef  MyGPIO;

 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA口时钟 

  MyGPIO.GPIO_Pin = GPIO_Pin_0; //PORTA.00 推挽输出

  MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;   

  MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &MyGPIO);

  DS18B20_DQ_O = 1;    //输出1

DS18B20_Reset();

return DS18B20_IsOnline();

}  


//从ds18b20得到温度值

//精度:0.1C

//返回值:温度值 (-550~1250) 

int16_t DS18B20_GetTemperature(void)

{

    uint8_t temp;

    uint8_t TL,TH;

int16_t tem;

    DS18B20_StartConversion();  // ds1820 start convert

    DS18B20_Reset();

    DS18B20_IsOnline();  

    DS18B20_WriteByte(0xCC); // skip rom

    DS18B20_WriteByte(0xBE); // convert     

    TL = DS18B20_ReadByte(); // LSB   

    TH = DS18B20_ReadByte(); // 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;

}

}


关键字:DS18B20  温度模块驱动  STM32 引用地址:DS18B20温度模块驱动(STM32)

上一篇:HC-SR501热释电红外传感器驱动(STM32)
下一篇:HC-SR04超声波模块驱动(STM32)

推荐阅读最新更新时间:2024-11-09 22:12

关于多路步进电机控制系统的设计方案分析
本文设计实现了一种三路步进电机控制系统,它基于RTThread嵌入式实时系统,提高了系统的实时性和后期的功能扩展能力。系统控制电路采用STM32F4系列的微控制器,结合小功率步进电机驱动器A4988,完成了硬件电路板设计。软件中运用操作系统自带的finsh机制,实现对指令的初步解析,控制系统可以通过读取G指令,控制多路电机按照一定轨迹运动,同时可以调节电机运动的加减速参数。实际项目验证证明该系统具有很好的稳定性。 随着计算机技术和微电子技术的发展,步进电机作为自动化控制的执行单元,越来越多地运用在各种领域中,许多控制领域需要对多台步进电机进行同步协调控制,如军事、航空、机器人控制。特别是近年来,随着嵌入式技术和集成化的发展,其
[单片机]
关于多路步进电机控制系统的设计方案分析
STM32开发设计中FSMC可能遇到问题应对方案
本文将就使用FSMC可能遇到的问题进行说明。希望能对大家的学习有所帮助。 一、端口配置 1、 由于FSMC写NOR时序与8080接口的时序十分相识,因此我们采用模拟8080时序, 2、 STM32的引脚图如图所示。 3、根据上图我们可以得出,FSMC的数据端口D 如下 4、我们使用的是 FSMC 的信号线 NE1 作为控制 8080 的 CSX 片选信号,所以我们把本成配置为 FSMC_Bank1_NORSRAM1 (NE1 片选BANK1)。由上图得FSMC-NE1 ==PD7 ---------LCD-CS 5、数据地址的选择 本成员用于设置 FSMC 接口的数据宽度,可被设置为 8Bit 或 16b
[单片机]
<font color='red'>STM32</font>开发设计中FSMC可能遇到问题应对方案
stm32之USB应用实例(官方例程资料下载使用)
开发环境:Window 7 开发工具:Keil uVision5 硬件:stc32f103c8t6 stm32系列芯片很多都拥有一个USB2.0全速的通讯接口,下面介绍怎么使用st官方的usb应用例程。 首先从官网下载源码: https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html 需要登录才能下载,如果没有账号,注册一个也很快的。
[单片机]
<font color='red'>stm32</font>之USB应用实例(官方例程资料下载使用)
STM32待机模式Standby Mode与ADC DMA模式测试备忘
1)STM32运行十秒后自动进入待机,使用WakeUp引脚唤醒CPU后,重复以上动作。 int main(void) { time_cnt = 0; HAL_Init(); SystemClock_Config(); HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET); HAL_PWR_DisableWakeUpPin(PWR_CSR_EWUP); //禁止wakeup PA0引脚,可以用来做普通引脚功能 while (1) { HAL_Delay(1000); HAL_GPIO_TogglePin(GPIOG, GPIO_P
[单片机]
<font color='red'>STM32</font>待机模式Standby Mode与ADC DMA模式测试备忘
STM32的CRC计算
CRC计算 CRC校验仅用于保证全双工通信的可靠性。数据发送和数据接收分别使用单独的CRC计算器。 通过对每一个接收位进行可编程的多项式运算来计算CRC。CRC的计算是在由SPI_CR1寄存器中CPHA和CPOL位定义的采样时钟边沿进行的。 注意: 该SPI接口提供了两种CRC计算方法,取决于所选的发送和/或接收的数据帧格式:8位数据帧采用CR8;16位数据帧采样CRC16-CCITT。 CRC计算是通过设置SPI_CR1寄存器中的CRCEN位启用的。设置CRCEN位时同时复位CRC寄存器(SPI_RXCRCR和SPI_TXCRCR)。当设置了SPI_CR1的CRCNEXT位,SPI_TXCRCR的内容将在当前字节
[单片机]
STM32示波器程序ILI9341_IO模拟源程序+Proteus仿真
uint8 x_1= 0,y_1 = 0; uint8 x_2= 0,y_2 = 0; uint8 x_3= 0,y_3 = 0; uint8 x_4= 0,y_4 = 0; uint8 x_5= 0,y_5 = 0; uint8 t4_PianYi_x = 0,t4_PianYi_y = 0; uint8 t5_PianYi_x = 0,t5_PianYi_y = 0; int i = 0 ; for( i= 0;i t1*3;i++) { x_1 = 10+ i;
[单片机]
<font color='red'>STM32</font>示波器程序ILI9341_IO模拟源程序+Proteus仿真
STM32系统时钟的小知识
什么是时钟? 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。 为什么 STM32 要有多个时钟源呢? STM32本身十分复杂,外设非常多 但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费 并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的
[单片机]
STM32之一 建立工程及led闪烁
摸索了好久,今天终于实现了自己的工程模板,首先看下我的工程结构: 我的工程文件夹建立了五个文件夹,CMSIS、Libraries、Project、Startup、USER。里面分别存放了各自的初始文件, 关于MDK中的工程树情况如上图,分别在各自的文件夹下存放各自的文件,我们采用的是模块化编程,例如编写led程序就建立led.h和led.c文件,添加至工程,另外建立了延时函数文件,即delay.c和delay.h文件,而且这文件以后都可以用在其他工程中,led灯闪烁即led.c中, 首先要建立GPIO对象,然后首先要进行时钟使能,然后对GPIO进行初始化,下面来看led.h文件: 关键是中间的两个宏定义,定义ledon代表了
[单片机]
<font color='red'>STM32</font>之一 建立工程及led闪烁
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved