DS18B20 for STM32 源代码 【worldsing笔记】

发布者:WanderlustSoul最新更新时间:2019-12-25 来源: eefocus关键字:DS18B20  STM32  worldsing笔记 手机看文章 扫描二维码
随时随地手机看文章

DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃。主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。必须先启动DS18B20开始转换,再读出温度转换值。本程序仅挂接一个芯片,使用默认的12位转换精度,外接供电电源,读取的温度值高位字节送WDMSB单元,低位字节送WDLSB单元,再按照温度值字节的表示格式及其符号位,经过简单的变换即可得到实际温度值.本例VCC用3.3V 供电,将DQ连接结到stm32的PA1口,

DS18B20 STM32 源代码下载 

 

DB18B20ForStm32.c

 

#include "ds18b20.h" 

#define EnableINT()  

#define DisableINT()


#define DS_PORT   GPIOA           //DS18B20连接口

#define DS_DQIO   GPIO_Pin_1      //GPIOA1


#define DS_RCC_PORT  RCC_APB2Periph_GPIOA


#define DS_PRECISION 0x7f   //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位;

#define DS_AlarmTH  0x64

#define DS_AlarmTL  0x8a

#define DS_CONVERT_TICK 1000


#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)

#define SetDQ()  GPIO_SetBits(DS_PORT,DS_DQIO)

#define GetDQ()  GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)

 

 


void Delay_us(u32 Nus) 

{  

 SysTick->LOAD=Nus*9;          //时间加载       

 SysTick->CTRL|=0x01;             //开始倒数     

 while(!(SysTick->CTRL&(1<<16))); //等待时间到达  

 SysTick->CTRL=0X00000000;        //关闭计数器 

 SysTick->VAL=0X00000000;         //清空计数器      


 


unsigned char ResetDS18B20(void)

{

 unsigned char resport;

 SetDQ();

 Delay_us(50);

 

 ResetDQ();

 Delay_us(500);  //500us (该时间的时间范围可以从480到960微秒)

 SetDQ();

 Delay_us(40);  //40us

 //resport = GetDQ();

 while(GetDQ());

 Delay_us(500);  //500us

 SetDQ();

 return resport;

}


void DS18B20WriteByte(unsigned char Dat)

{

 unsigned char i;

 for(i=8;i>0;i--)

 {

   ResetDQ();     //在15u内送数到数据线上,DS18B20在15-60u读数

  Delay_us(5);    //5us

  if(Dat & 0x01)

   SetDQ();

  else

   ResetDQ();

  Delay_us(65);    //65us

  SetDQ();

  Delay_us(2);    //连续两位间应大于1us

  Dat >>= 1; 

 } 

}



unsigned char DS18B20ReadByte(void)

{

 unsigned char i,Dat;

 SetDQ();

 Delay_us(5);

 for(i=8;i>0;i--)

 {

   Dat >>= 1;

    ResetDQ();     //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后

  Delay_us(5);   //5us

  SetDQ();

  Delay_us(5);   //5us

  if(GetDQ())

    Dat|=0x80;

  else

   Dat&=0x7f;  

  Delay_us(65);   //65us

  SetDQ();

 }

 return Dat;

}



void ReadRom(unsigned char *Read_Addr)

{

 unsigned char i;


 DS18B20WriteByte(ReadROM);

  

 for(i=8;i>0;i--)

 {

  *Read_Addr=DS18B20ReadByte();

  Read_Addr++;

 }

}



void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)

{

 DisableINT();

 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(WriteScratchpad);

 DS18B20WriteByte(AlarmTL);

 DS18B20WriteByte(AlarmTH);

 DS18B20WriteByte(Precision);


 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(CopyScratchpad);

 EnableINT();


 while(!GetDQ());  //等待复制完成 ///////////

}



void DS18B20StartConvert(void)

{

 DisableINT();

 ResetDS18B20();

 DS18B20WriteByte(SkipROM); 

 DS18B20WriteByte(StartConvert); 

 EnableINT();

}


void DS18B20_Configuration(void)

{

 GPIO_InitTypeDef GPIO_InitStructure;

 

 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);


 GPIO_InitStructure.GPIO_Pin = DS_DQIO;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度

 GPIO_Init(DS_PORT, &GPIO_InitStructure);

}



void ds18b20_init(void)

{

 DS18B20_Configuration();

 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);

 DS18B20StartConvert();

}



float ds18b20_read(void)

{

unsigned char DL, DH;

unsigned short TemperatureData;

float Temperature;


DisableINT();

DS18B20StartConvert();

ResetDS18B20();

DS18B20WriteByte(SkipROM); 

DS18B20WriteByte(ReadScratchpad);

DL = DS18B20ReadByte();

DH = DS18B20ReadByte(); 

EnableINT();


TemperatureData = DH;

TemperatureData <<= 8;

TemperatureData |= DL;


Temperature = (float)((float)TemperatureData * 0.0625); //分辨率为0.0625度


return  Temperature;

}

 


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


DB18B20ForStm32.h


 


#ifndef __DS18B20_H__

#define __DS18B20_H__


#include"stm32f10x.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_gpio.h"



#define  SkipROM    0xCC     //跳过ROM

#define  SearchROM  0xF0  //搜索ROM

#define  ReadROM    0x33  //读ROM

#define  MatchROM   0x55  //匹配ROM

#define  AlarmROM   0xEC  //告警ROM


#define  StartConvert    0x44  //开始温度转换,在温度转换期间总线上输出0,转换结束后输出1

#define  ReadScratchpad  0xBE  //读暂存器的9个字节

#define  WriteScratchpad 0x4E  //写暂存器的温度告警TH和TL

#define  CopyScratchpad  0x48  //将暂存器的温度告警复制到EEPROM,在复制期间总线上输出0,复制完后输出1

#define  RecallEEPROM    0xB8    //将EEPROM的温度告警复制到暂存器中,复制期间输出0,复制完成后输出1

#define  ReadPower       0xB4    //读电源的供电方式:0为寄生电源供电;1为外部电源供电



void ds18b20_init(void);

float ds18b20_read(void);

//unsigned short ds18b20_read(void);



#endif

 


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


main.c


//如何使用?


int main(void)

{

     float t;

     ds18b20_init();

     t = ds18b20_read();

     printf("温度 = %05.1f", t);

}


关键字:DS18B20  STM32  worldsing笔记 引用地址:DS18B20 for STM32 源代码 【worldsing笔记】

上一篇:74HC595 for STM32 源代码【worldsing笔记】
下一篇:stm32 cortext-M3 类型对齐问题【worldsing笔记】

推荐阅读最新更新时间:2024-10-28 20:27

STM32 之六 USB IP(USB模块)、官方驱动版本 详解
模块分类   在 STM32 众多系列的 MCU 中,USB模块并不是相同的,官方称呼为USB IP 不同。总的来说可以分文两大类:USB IP、OTG IP。这两种 IP又可以进行更进一步的细分,如下图: 上图中罗列的芯片并不是很全面,某些新系列的芯片可能与上图有出入。各IP的主要区别如下: USB IP: 仅可作为全速或低速的USB设备; 符合USB2.0中的全速规范 可用资源:8个双向可配置端点 512字节 的专用数据包缓冲存储器SRAM CRC(循环冗余校验)生成/校验,反向不归零(NRZI)编码/解码和位填充 支持四种传输类型:对于bulk和同步传输,还支持double buffer模式;使得一个buffer用于
[单片机]
<font color='red'>STM32</font> 之六 USB IP(USB模块)、官方驱动版本 详解
KeilMDK4.22 编译STM32工程警告:warning: #223-D
建立工程,编译大量报错和警告: ..\FWlib\src\stm32f10x_usart.c(135): warning: #223-D: function assert_param declared implicitly ..\FWlib\src\stm32f10x_usart.c: assert_param(IS_USART_ALL_PERIPH(USARTx)); ..\FWlib\src\stm32f10x_usart.c: ^ ..\FWlib\src\stm32f10x_usart.c(184): warning: #223-D: function assert_param declared implicit
[单片机]
KeilMDK4.22 编译<font color='red'>STM32</font>工程警告:warning: #223-D
STM32内存分配解析及变量的存储位置
内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称之为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM。在对于RAM紧缺的嵌入式系统中,是缺少MMU内存管理单元的。因此在一些嵌入式系统中,比如常用的STM32来讲,内存映射被划分为闪存段(也被称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32的Flash和RAM地址范围 标题中所说的内存是指STM32的Flash和RAM,下图是ARM Cortex M3的地址映射 从图中我们可以看出,RAM地址是从0x2000 0000开始的,Flash地址是从0x8000 0000开始的。 Flash 代码
[单片机]
<font color='red'>STM32</font>内存分配解析及变量的存储位置
STM32】HAL库 STM32CubeMX教程五----看门狗
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,窗口看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 知识概括: 通过本篇博客您将学到: STM32CubeMX创建看门狗例程 独立看门狗,靠窗看门狗 工作原理 看门狗 在由单片机
[单片机]
【<font color='red'>STM32</font>】HAL库 STM32CubeMX教程五----看门狗
stm32利用oled显示屏与按键进行PID参数调节实现人机交互
上一个学期在学校做四轮车利用PID实现直线走,在调试过程中,我之前是每改一个参数就下载程序进控制板进行调试,观察车是否偏移来确定pid参数,但是后来我发现这样的效率很慢,经别人提醒后,我自己做了一个小小的人机交互界面,来显示pid的参数以及对pid参数进行调整。 以下是显示效果: 接着我在附上主要代码: // 功能描述 : OLED 7针SPI接口演示例程(STM32F103系列) // 说明: // ---------------------------------------------------------------- // GND 电源地 // VCC 3.
[单片机]
<font color='red'>stm32</font>利用oled显示屏与按键进行PID参数调节实现人机交互
STM32 GPIO速度,模式等理解
一、 / GPIO模式配置 1、输入/输出模式(参考stm32手册) 2、GPIO输出模式下,几种速度的区别: (1). GPIO 引脚速度: GPIO_Speed_2MHz (10MHz, 50MHz) ; 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果信号频率为10MHz,而你配置
[单片机]
ST推出STM32无线微控制器模块,提升物联网产品开发效率
半导体供应商意法半导体推出一个新的加快物联网产品上市的解决方案,该方案可利用现成的微型STM32无线微控制器(MCU)模块加快基于Bluetooth® LE和802.15.4新物联网设备的开发周期。 这个7mm x 11.3mm的 STM32WB5MMG模块让缺少无线设计能力的产品研发团队也能开发物联网产品。为开发层数最少的低成本PCB电路板而设计,新模块集成了直到天线的整个射频子系统。用户还可以免费使用意法半导体的STM32Cube MCU开发生态系统工具、设计向导、射频协议栈和完整软件库,快速高效地完成开发项目。 意法半导体部门副总裁兼微控制器产品总经理Ricardo de Sa Earp表示:“我们的首个基于S
[单片机]
ST推出<font color='red'>STM32</font>无线微控制器模块,提升物联网产品开发效率
基于STM32设计的智能灌溉控制系统
一、项目介绍 随着现代农业的发展,人们对于水资源的合理利用越来越重视。而传统的灌溉方式往往存在着浪费水资源、劳动力投入大、效率低等问题。因此,设计一款智能灌溉控制系统,可以实现对灌溉水量的精准控制,增加水资源利用率,提高农业生产效率,具有广泛的应用前景。 当前文章介绍一款高性能的智能灌溉控制系统的开发过程,可自动采集电压、电流、累计用水量,并根据用户需要实现自动灌溉、定时灌溉、周期灌溉和手动灌溉等多种模式,同时具备中控室控制、手机短信、现场遥控及现场手动等多种方式控制功能。该系统可以对现场温湿度限值进行设置和修改,并通过控制器或后台监控系统完成灌溉起始时间、停止时间、喷灌时间等参数设置。系统显示功能包括液晶屏以中文菜单方式显示现场
[单片机]
基于<font color='red'>STM32</font>设计的智能灌溉控制系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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