总结:如何驱动DS18B20温度传感器
DS18B20时序分析:
以下是STM32的驱动代码:
- #include "bsp_ds18b20.h"
- static void DS18B20_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(DS18B20_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
- GPIO_SetBits(DS18B20_PORT, DS18B20_PIN);
- }
- static void DS18B20_Mode_IPU(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
- }
- static void DS18B20_Mode_Out_PP(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = DS18B20_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DS18B20_PORT, &GPIO_InitStructure);
- }
- static void DS18B20_Rst(void)
- {
- DS18B20_Mode_Out_PP();
- DS18B20_DATA_OUT(LOW);
- Delay_us(750);
- DS18B20_DATA_OUT(HIGH);
- Delay_us(15);
- }
- static uint8_t DS18B20_Presence(void)
- {
- uint8_t pulse_time = 0;
- DS18B20_Mode_IPU();
- while( DS18B20_DATA_IN() && pulse_time<100 )
- {
- pulse_time++;
- Delay_us(1);
- }
- if( pulse_time >=100 )
- return 1;
- else
- pulse_time = 0;
- while( !DS18B20_DATA_IN() && pulse_time<240 )
- {
- pulse_time++;
- Delay_us(1);
- }
- if( pulse_time >=240 )
- return 1;
- else
- return 0;
- }
- static uint8_t DS18B20_Read_Bit(void)
- {
- uint8_t dat;
- DS18B20_Mode_Out_PP();
- DS18B20_DATA_OUT(LOW);
- Delay_us(10);
- DS18B20_Mode_IPU();
- //Delay_us(2);
- if( DS18B20_DATA_IN() == SET )
- dat = 1;
- else
- dat = 0;
- Delay_us(45);
- return dat;
- }
- uint8_t DS18B20_Read_Byte(void)
- {
- uint8_t i, j, dat = 0;
- for(i=0; i<8; i++)
- {
- j = DS18B20_Read_Bit();
- dat = (dat) | (j<<i);
- }
- return dat;
- }
- void DS18B20_Write_Byte(uint8_t dat)
- {
- uint8_t i, testb;
- DS18B20_Mode_Out_PP();
- for( i=0; i<8; i++ )
- {
- testb = dat&0x01;
- dat = dat>>1;
- if (testb)
- {
- DS18B20_DATA_OUT(LOW);
- Delay_us(8);
- DS18B20_DATA_OUT(HIGH);
- Delay_us(58);
- }
- else
- {
- DS18B20_DATA_OUT(LOW);
- /* 60us < Tx 0 < 120us */
- Delay_us(70);
- DS18B20_DATA_OUT(HIGH);
- Delay_us(2);
- }
- }
- }
- void DS18B20_Start(void)
- {
- DS18B20_Rst();
- DS18B20_Presence();
- DS18B20_Write_Byte(0XCC);
- DS18B20_Write_Byte(0X44);
- }
- uint8_t DS18B20_Init(void)
- {
- DS18B20_GPIO_Config();
- DS18B20_Rst();
- return DS18B20_Presence();
- }
- float DS18B20_Get_Temp(void)
- {
- uint8_t tpmsb, tplsb;
- short s_tem;
- float f_tem;
- DS18B20_Rst();
- DS18B20_Presence();
- DS18B20_Write_Byte(0XCC);
- DS18B20_Write_Byte(0X44);
- DS18B20_Rst();
- DS18B20_Presence();
- DS18B20_Write_Byte(0XCC);
- DS18B20_Write_Byte(0XBE);
- tplsb = DS18B20_Read_Byte();
- tpmsb = DS18B20_Read_Byte();
- s_tem = tpmsb<<8;
- s_tem = s_tem | tplsb;
- if( s_tem < 0 )
- f_tem = (~s_tem+1) * 0.0625;
- else
- f_tem = s_tem * 0.0625;
- return f_tem;
- }
- /*************************************END OF FILE******************************/
总结:如何驱动DS18B20温度传感器的更多相关文章
- DS18b20温度传感器基础使用
认识管脚 认识唯一标示的64位地址序列号 寄存器数据译码成温度值(下面只针对12位转化的,还有9..10等其他位的转化方式,不同位的转化,其精度也不同) 传感器存储器 配置寄存器使用说明 DS18b2 ...
- DS18B20温度传感器知识点总结
2018-01-1818:20:48 感觉自己最近有点凌乱,一个很简单的问题都能困扰自己很久.以前能很好使用和调试的DS18B20温度传感器,今天愣是搞了很久,妈卖批. 仅仅一个上拉电阻就困扰了我很久 ...
- 单线制DS18B20温度传感器LED数码管显示当前的温度值
/******************************************* 程序功能:利用单线制DS18B20温度传感器 LED数码管显示当前的温度值 ***************** ...
- STM32驱动DS18B20
DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线”接口的温度传感器.与传 统的热敏电阻等测温元件相比,它是一种新型的体积小.适用电压宽.与微处理器接口简单的 数字化温度传感器.一线 ...
- 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- 单片机学习(十二)1-Wire通信协议和DS18B20温度传感器
目录 一.DS18B20 1. DS18B20简介 2. 电路原理图 3. 内部结构 内部完整结构框图 存储器结构 二.单总线(1-Wire BUS) 1. 单总线简介 2. 电路规范 3. 单总线的 ...
- nanopi的ds18b20温度传感器测试
参考(抄袭)资料在这里 先接线,3.3v,gnd,数据输出脚,我是PG11 vim /boot/armbianEnv.txt overlays=w1-gpio param_w1_pin=PG11 pa ...
- 使用天祥TX-1C调试DS18B20温度传感器的收获
翻查DS18B20的DataSheet编写操作函数,其过程遇到了不少坎,记下来备查. 对于单总线的DS18B20芯片,首先严格按照时序图写出正确的“写0”.“写1”和“读0.1”的基础函数,再以此写出 ...
- stm32 ds18b20 温度传感器
相关文章:http://blog.csdn.net/zhangxuechao_/article/details/74991985 举例 void DS18B20_in() { GPIO_InitTyp ...
随机推荐
- Solr 5.5.0 + tomcat 7.0.69 + zookeeper-3.4.6 Cloud部署
Solr介绍:Solr是一个独立的企业级搜索应用服务器,Solr基于Lucene的全文搜索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了 ...
- java中&和&&的区别 位运算
1.1. 逻辑与的运算符功能 1.1.1. 测试&& public static void main(String[] args) { int x=5; if (x==6 && ...
- iterm2 快捷键
最近开始使用mac,用iterm2的终端,有些快捷键纪录下. 标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 或者 command + 左 ...
- Qt中事件分发源代码剖析
Qt中事件分发源代码剖析 Qt中事件传递顺序: 在一个应该程序中,会进入一个事件循环,接受系统产生的事件,并且进行分发,这些都是在exec中进行的. 下面举例说明: 1)首先看看下面一段示例代码: i ...
- Spark:大数据的电花火石!
什么是Spark?可能你很多年前就使用过Spark,反正当年我四六级单词都是用的星火系列,没错,星火系列的洋名就是Spark. 当然这里说的Spark指的是Apache Spark,Apache Sp ...
- window.open 打开子窗口,关闭所有的子窗口
需求:通过window.open方法打开了子窗口,当关闭主窗口时,子窗口应当也关闭. 实现思路: 1.打开子窗口函数window.open(url,winName)的第二个参数winName可以唯一标 ...
- 怎么避免在类实现的cpp文件中不要多次进行类声明
方法1: 类的头文件中写 #pragma once class MyTeacher { public: MyTeacher(); ~MyTeacher(); }; 方法2: 类的头文件中写 #ifnd ...
- [sersync] github镜像 二进制包
这几天在搞数据的本地备份和远程备份的事情,用到了sersync这个国产的同步工具,可是发现他托管在google code,需要fanqiang才能下载, 于是就弄了一个github的镜像,顺便把64位 ...
- lk中内联调用的dsb()
lk中内联调用的dsb() 比如lk的uart_dm_init()函数就调用了dsb() /* Configure the uart clock */ clock_config_uart_dm(id) ...
- Sql表注释
1 创建表的时候写注释 create table test1 ( field_name int comment '字段的注释' )comment='表的注释'; 2 修改表的注释 alter tabl ...