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 for STM32 源代码 【worldsing笔记】的更多相关文章

  1. Keil uCos 2.52 stm32 【worldsing笔记】

    1.uCOSii V2.52    a.加了7个可以配置的钩子函数宏     #define OS_TASK_CREATE_HOOK_EN    0    /* 任务创建时调用钩子函数      使能 ...

  2. 74HC595 for STM32 源代码【worldsing笔记】

    74HC595是硅结构的CMOS器件, 兼容低电压TTL电路,遵守JEDEC标准. 74HC595是具有8位移位寄存器和一个存储器,三态输出功能. 移位寄存器和存储器是分别的时钟. 数据在SHcp(移 ...

  3. Mongodb源代码阅读笔记:Journal机制

    Mongodb源代码阅读笔记:Journal机制 Mongodb源代码阅读笔记:Journal机制 涉及的文件 一些说明 PREPLOGBUFFER WRITETOJOURNAL WRITETODAT ...

  4. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  5. CI框架源代码阅读笔记5 基准測试 BenchMark.php

    上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...

  6. CI框架源代码阅读笔记3 全局函数Common.php

    从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...

  7. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  8. stm32 HAL库笔记(零)

    最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配 ...

  9. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

随机推荐

  1. window下编译ffmpeg 比较简单

    网上关于编译ffmpeg的帖子很多,我也尝试了很多次,但是很多都过不了,一部分原因是版本问题,还有就是有的路劲没说的太明白导致的,经过一天的摸索,最终编译好了,下面把编译方式写下来,希望对看到帖子的人 ...

  2. 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换

    原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...

  3. MyBatis的动态SQL操作--插入

    需求:向数据库中插入一条数据 //id,name,sal非空,三个字段都插入 insert into student(id,name,sal) values (?,?,?) //id,name非空,只 ...

  4. Android开发UI之给ImageView添加蒙版

    ImageView控件添加蒙版, 通过属性:android:tint="" 比如 android:tint="#44ff0000"

  5. Java面试题-并发工具

    1. 如何实现一个流控程序,用于控制请求的调用次数?

  6. poj 1426 Find The Multiple( bfs )

    题目:http://poj.org/problem?id=1426 题意:输入一个数,输出这个数的整数 倍,且只有0和1组成 程序里写错了一个数,结果一直MLE.…… #include <ios ...

  7. poj2182

    首先容易知道,最后一个数是最容易确定的,于是从后往前确定 对于位置j,它的数就是1~n中剩余数的第a[j]+1小的数 这当然可以用平衡数做,复杂度为O(nlogn) 有没有更简洁得算法?树状数组+二分 ...

  8. jsp请求由servlet响应的方式

    一.登录页面主要代码:login.jsp<%@ page language="java" import="java.util.*" pageEncodin ...

  9. 【转】 Homebrew – OSX下简单的包管理系统

    很多linux用户很喜欢 (Debian/Ubuntu)系列的apt包管理系统和(Redhat/Fedora)系列的yum包管理系统. 包括Windows用户都有多种方便的软件管理工具,如:360软件 ...

  10. Loadrunner通过sitescope监控mysql

    1.   Loadrunner通过sitescope监控mysql 1.1. Sitescope下载 第一次在网上下载的是sitescope11.30,安装之后无法破解,所以最后卸载了,重新下载了si ...