(stm32f103学习总结)—DS18B20

一. 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 }

 

 

猜你喜欢

转载自www.cnblogs.com/zhj868/p/12728670.html