(stm32f103学习总结)—DS18B20
阅读原文时间:2023年07月10日阅读:1

一. 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代码

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

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

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

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

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

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

(2).延时1微妙。

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

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

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

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

数据手册内读解释:

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

(2).延时15微妙。

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

(4).延时60微妙。

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

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

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

数据手册内的解释

写时间片(write timeslots)

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

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 }

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章