一. DS18B20简介

DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

二. DS18B20的特性

1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电

2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微 处理器与DS18B20的双向通讯。

3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网 多点测温。

4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一 只三极管的集成电路内。

5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃

6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃ 和0.0625℃,可实现高精度测温。

7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快。

8、测量结果直接输出数字温度信号,以"一根总线"串行传送给CPU,同时可传送 CRC校验码,具有极强的抗干扰纠错能力

。 9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。

三. DS18B20实物图

四. DS18B20的内部结构

五. DS18B20的ROM指令表

操作rom的流程

六. DS18B20的RAM指令表

操作ram的流程

 

单总线协议DS1820代码

一.DS18B20初始化

(1).数据线拉到低电平“0”。

(2).延时480微妙(该时间的时间范围可以从480到960微妙)。

(3).数据线拉到高电平“1”。

(4).延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。

(5).若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(3)步的时间算起)最少要480微妙。

二.DS18B20读时序

(1).将数据线拉低“0”。

(2).延时1微妙。

(3).将数据线拉高“1”,释放总线准备读数据。

(4).延时10微妙。 //等待数据稳定

(5).读数据线的状态得到1个状态位,并进行数据处理。

(6).延时45微妙。 (7).重复1~7步骤,直到读完一个字节

数据手册内读解释:

三.DS18B20写时序

(1).数据线先置低电平“0”

(2).延时15微妙。

(3).按从低位到高位的顺序发送数据(一次只发送一位)。

(4).延时60微妙。

(5).将数据线拉到高电平。

(6).重复1~5步骤,直到发送完整的字节。

(7).最后将数据线拉高。

数据手册内的解释

写时间片(write timeslots)

DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令( 0XCC )→发开始转换命令( 0X44)→延时→复位→发送 SKIP ROM 命令( 0XCC)→发读存储器命令( 0XBE)→连续读出两个字节数据(即温度)→ 结束。

四、读DS18B20温度代码

 1 #ifndef _hwjs_H
2 #define _hwjs_H
3
4 #include "system.h"
5
6
7
8 void Hwjs_Init(void);
9 u8 HW_jssj(void);
10
11 //定义全局变量
12 extern u32 hw_jsm;
13 extern u8 hw_jsbz;
14
15
16 #endif
  1 #include "hwjs.h"
2 #include "SysTick.h"
3
4
5 u32 hw_jsm; //定义一个32位数据变量,保存接收码
6 u8 hw_jsbz; //定义一个8位数据的变量,用于指示接收标志
7
8
9 /*******************************************************************************
10 * 函 数 名 : Hwjs_Init
11 * 函数功能 : 红外端口初始化函数 时钟端口及外部中断初始化
12 * 输 入 : 无
13 * 输 出 : 无
14 *******************************************************************************/
15 void Hwjs_Init()
16 {
17 GPIO_InitTypeDef GPIO_InitStructure;
18 EXTI_InitTypeDef EXTI_InitStructure;
19 NVIC_InitTypeDef NVIC_InitStructure;
20
21 /* 开启GPIO时钟及管脚复用时钟 */
22 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO,ENABLE);
23
24 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//红外接收
25 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
26 GPIO_Init(GPIOG,&GPIO_InitStructure);
27
28 GPIO_EXTILineConfig(GPIO_PortSourceGPIOG, GPIO_PinSource15); //选择GPIO管脚用作外部中断线路
29 EXTI_ClearITPendingBit(EXTI_Line15);
30
31 /* 设置外部中断的模式 */
32 EXTI_InitStructure.EXTI_Line=EXTI_Line15;
33 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
34 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
35 EXTI_InitStructure.EXTI_LineCmd=ENABLE;
36 EXTI_Init(&EXTI_InitStructure);
37
38 /* 设置NVIC参数 */
39 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //打开全局中断
40 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
41 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级为1
42 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
43 NVIC_Init(&NVIC_InitStructure);
44
45 }
46
47
48 /*******************************************************************************
49 * 函 数 名 : HW_jssj
50 * 函数功能 : 高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us
51 * 输 入 : 无
52 * 输 出 : t
53 *******************************************************************************/
54 u8 HW_jssj()
55 {
56 u8 t=0;
57 while(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1)//高电平
58 {
59 t++;
60 delay_us(20);
61 if(t>=250) return t;//超时溢出
62 }
63 return t;
64 }
65
66
67 void EXTI15_10_IRQHandler(void) //红外遥控外部中断
68 {
69 u8 Tim=0,Ok=0,Data,Num=0;
70 while(1)
71 {
72 if(GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15)==1)
73 {
74 Tim=HW_jssj();//获得此次高电平时间
75
76 if(Tim>=250) break;//不是有用的信号
77
78 if(Tim>=200 && Tim<250)
79 {
80 Ok=1;//收到起始信号
81 }
82 else if(Tim>=60 && Tim<90)
83 {
84 Data=1;//收到数据 1
85 }
86 else if(Tim>=10 && Tim<50)
87 {
88 Data=0;//收到数据 0
89 }
90
91 if(Ok==1)
92 {
93 hw_jsm<<=1;
94 hw_jsm+=Data;
95
96 if(Num>=32)
97 {
98 hw_jsbz=1;
99 break;
100 }
101 }
102
103 Num++;
104 }
105 }
106
107 EXTI_ClearITPendingBit(EXTI_Line15);//如果不清除中断标志 CPU会一直执行中断函数顺序执行完成后再从头执行
108 }
 1 #include "system.h"
2 #include "SysTick.h"
3 #include "led.h"
4 #include "usart.h"
5 #include "hwjs.h"
6
7
8 /*******************************************************************************
9 * 函 数 名 : main
10 * 函数功能 : 主函数
11 * 输 入 : 无
12 * 输 出 : 无
13 *******************************************************************************/
14 int main()
15 {
16 u8 i=0;
17
18 SysTick_Init(72);
19 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
20 LED_Init();
21 USART1_Init(9600);
22 Hwjs_Init();
23
24 while(1)
25 {
26 if(hw_jsbz==1) //如果红外接收到
27 {
28 hw_jsbz=0; //清零
29 printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
30 hw_jsm=0; //接收码清零
31 }
32
33 i++;
34 if(i%20==0)
35 {
36 led1=!led1;
37 }
38
39 delay_ms(10);
40 }
41 }

最新文章

  1. js实现蛇形矩阵
  2. Nginx负载均衡
  3. Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
  4. C# 中var as is 泛型集合
  5. StarlingMVC Framework 原理。。。
  6. python成长笔记
  7. CSS3 transition 动画过度属性
  8. GEF-whole-upload教程中遇到的问题及解决方案
  9. python实战===生成随机数
  10. [CVPR 2017] Semantic Autoencoder for Zero-Shot Learning论文笔记
  11. Magento 2 Error: A technical problem with the server created an error. Try again to continue what you were doing. If the problem persists, try again later.
  12. 常用js方法整理(个人)
  13. Spring事物的属性
  14. shell统计当前文件夹下的文件个数、目录个数
  15. InfluxDB配置文件详解
  16. [原创]SOAPUI工具介绍
  17. 浅谈MyBatis缓存
  18. Java文件字节流和字符流
  19. PHP中is_null()方法
  20. 使用批处理方式从svn 检出DEMO

热门文章

  1. 二叉树的N中遍历方式和拓展应用
  2. 从零开始,开发一个 Web Office 套件(6):光标 &amp; Click 事件
  3. Spring AOP之3w的配置
  4. 居然可以像玩游戏一样学Git
  5. tp5 多文件上传
  6. tp5 全选,全不选 ,ajax批量删除
  7. doctor学习(二) - contos7安装doctor
  8. 服务器安装centos8提示显示器不支持输出的分辨率
  9. CF772D题解
  10. ArcMap操作随记(1)