首页 » 互联网 » 【STM32F103ZET6开拓板】第3-4讲:DS18B20温度传感器_温度_串口

【STM32F103ZET6开拓板】第3-4讲:DS18B20温度传感器_温度_串口

落叶飘零 2024-10-22 02:09:07 0

扫一扫用手机浏览

文章目录 [+]

测试中最常用的温度传感器有:热电偶传感器、热敏电阻传感器、铂电阻传感器(RTD)、集成(IC)温度传感器。

图1:常见温度传感器类型示例

【STM32F103ZET6开拓板】第3-4讲:DS18B20温度传感器_温度_串口 互联网

热电偶测温的基本事理是两种不同成份的材质导体组成闭合回路,当两端存在温度梯度时,回路中就会有电流利过,此时两端之间就存在电动势——热电动势,由该事理可知热电偶的一个上风是其无需外部供电。
其余,热电偶还有测温范围宽、价格便宜、适应各种大气环境等优点,但其缺陷是丈量精度不高,故在高精度的丈量和运用中不宜利用热电偶。
热电偶两种不同成份的材料连接是标准的,根据采取材料不同可分为K型热电偶、S型热电偶、E型热电偶、N型热电偶、J型热电偶等等。

热敏电阻是敏感元件的一类,热敏电阻的电阻值会随着温度的变革而改变。
按照温度系数不同分为正温度系数热敏电阻(PTC)和负温度系数热敏电阻(NTC)。
正温度系数热敏电阻(PTC)在温度越高时电阻值越大,负温度系数热敏电阻(NTC)在温度越高时电阻值越低,它们同属于半导体器件,被广泛运用于各种电子元器件中。
热敏电阻常日在有限的温度范围内可实现较高的精度,常日是-90℃〜130℃。

铂电阻,又称为铂热电阻,它的阻值会随着温度的变革而改变。
并且铂电阻阻值会随着温度的升高匀速有规律的变大。
铂电阻可分为PT100和 PT1000等系列产品,PT100即表示它在0℃时阻值为100欧姆,PT1000即表示它在0℃时阻值为1000欧姆。
铂电阻具有抗振动、稳定性好、准确度高、耐高压等优点,被广泛运用于医疗、电机、工业、温度打算、卫星、气候、阻值打算等高精温度设备中。

集成(IC)温度传感器是将温度传感器集成在一个芯片上、可完成温度丈量及旗子暗记输出功能的专用IC。
集成(IC)温度传感器的紧张特点是功能单一(仅丈量温度)、测温偏差小、价格低、相应速率快、传输间隔远、体积小、微功耗等,适宜远间隔测温、控测,不须要进行非线性校准,外围电路大略。
集成(IC)温度传感器按输出旗子暗记类型可分为仿照集成温度传感器和数字集成温度传感器两种。

注:电子元器件常日都有一定的温度系数,其输出旗子暗记会随温度变革而漂移,称为“温漂”,为了减小温漂,采取一些补偿方法在一定程度上抵消或减小其输出的温漂,这便是温度补偿。
DS18B20数字温湿度传感器

DS18B20是Dallas 半导体公司推出的新一代单总线数字温湿度传感器,DS18B20内部构造紧张由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。
正是这个地址序列码使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。

图2:DS18B20光刻ROM的64位序列号

DS18B20紧张根据运用处所的不同而改变其外不雅观。
封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,清洁室测温,弹药库测温等各种非极限温度场合。
耐磨耐碰,体积小,利用方便,封装形式多样,适用于各种狭小空间设备数字测温和掌握领域。
下面给出DS18B20传感器芯片和已封装DS18B20传感器于金属壳内的实物图。

图3:DS18B20传感器芯片和带外壳线子的DS18B20传感器实物图

注:艾克姆科技IK-ZET6开拓板有DS18B20传感器专用接口J17,用户不须要购买带线子的DS18B20产品。
DS18B20数字温度传感器的规格参数

下面先容下DS18B20数字温度传感器芯片的规格参数,DS18B20数字温度传感器芯片还有贴片封装的,在此不做先容。

表1:DS18B20数字温度传感器规格参数

参数

规格

事情电压

3V〜5.5V

封装

TO-92-3

丈量范围

温度:-55〜+125℃

精度

-10〜+85℃:±0.5℃ -55〜+125℃:±2℃

转换韶光

9位:93.75ms 10位:187.5ms 11位:375ms 12位:750ms

衰 减 值

无衰减,无需校准。

输出旗子暗记

单总线数字旗子暗记

引脚数

3个

注: DS18B20传感器转换精度可通过配置寄存器实现,默认转换精度是12位,对应转换韶光是750ms。
DS18B20数字温度传感器的管脚定义

下面先容DS18B20数字温度传感器的管脚定义,首先将DS18B20数字温度传感器的引脚号标注下。

图4:DS18B20数字温度传感器管脚号

表2:DS18B20数字温度传感器管脚定义

DS18B20管脚号

管脚名

功能描述

1

GND

供电地

2

DATA

串行数据引脚

3

VCC

供电正

注:MCU的GPIO口可以和DS18B20的串行数据引脚DATA连接,但须要该引脚上接有上拉电阻方可有效采集传感器信息。
DS18B20数字温度传感器与开拓板连接

IK-ZET6开拓板上设计了1个DS18B20/DHT11传感器接口,该接口串行数据引脚DATA连接到STM32F103ZET6的PB1引脚上。
通过单总线通信协议读取DS18B20数字温度传感器采集的数据。

图5:IK-ZET6开拓板DS18B20/DHT11接口

1个DS18B20/DHT11接口占用的单片机的引脚如下表:

表3:DS18B20/DHT11接口引脚分配

DHT11

引脚

解释

DATA

PB1

独立GPIO

注:独立GPIO表示开拓板没有其他的电路利用这个GPIO,非独立GPIO解释开拓板有其他电路用到了该GPIO。
软件设计DS18B20数字温度传感器通信

和DHT11数字温湿度传感器一样,DS18B20数字温度传感器采取的也是单总线通信。
单总线在前面已经有过详细讲解在此不再赘述。
但不同于DHT11的校验办法,DS18B20采取的是CRC8校验办法。

CRC校验先容

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特色是信息字段和校验字段的长度可以任意选定。
循环冗余检讨(CRC)是一种数据传输检错功能,对数据进行多项式打算,并将得到的结果附在帧的后面,吸收设备也实行类似的算法,以担保数据传输的精确性和完全性。

下面先容下CRC校验的几个基本观点:

1、帧考验序列FCS(Frame Check Sequence):为了进行差错考验而添加的冗余码。

2、多项式模2运行:实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也便是不考虑进位、借位的二进制加减运算。

如:10011011 + 11001010 = 01010001。

3、天生多项式(generator polynomial):当进行CRC考验时,发送方与吸收方须要事先约定一个除数,即天生多项式,一样平常记作G(x)。
天生多项式的最高位与最低位必须是1。
常用的CRC码的天生多项式有:

CRC8=X^8+X^5+X^4+1

CRC-CCITT=X^16+X^12+X^5+1

CRC16=X^16+X^15+X^5+1

CRC12=X^12+X^11+X^3+X^2+1

CRC32=X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+1

注:每一个天生多项式都可以与一个代码相对应,如CRC8对应代码:100110001。
CRC8校验先容

CRC8校验有常规编码算法和逆序CRC信息单元编码算法两种,下面将分别进行算法先容,仅供大家参考。

常规编码算法

下面先容对单个字节的CRC8常规编码算法先容。

#define POLYNOMIAL 0x131 //G(x) = x^8 + x^5 + x^4 + 1 = 100110001 / 函 数 名: calcrc_1byte 功能解释: 单字节CRC校验 形 参: unsigned char abyte:待校验单字节数据 返 回 值: 经CRC校验值 / unsigned char calcrc_1byte(unsigned char abyte) { unsigned char bit,crc_1byte; crc_1byte=abyte; for (bit = 8; bit > 0; --bit) { if (crc_1byte & 0x80) //判断最高位是否为1 { crc_1byte = (crc_1byte << 1) ^ POLYNOMIAL; //最高位为1,左移一位与多项式异或 } else { crc_1byte = (crc_1byte << 1); //最高位为0,直接左移一位 } } return crc_1byte; }

下面先容对多字节的CRC8常规编码算法先容。

#define POLYNOMIAL 0x131 //G(x) = x^8 + x^5 + x^4 + 1 = 100110001 / 函 数 名: calcrc_nbyte 功能解释: 多字节CRC校验 形 参: unsigned char buf:待校验数组指针 unsigned char len:校验数 返 回 值: 经CRC校验值 / unsigned char calcrc_nbyte(unsigned char buf,unsigned char len) { unsigned char bit,crc_nbyte; crc_nbyte=0xFF; while(len--) { crc_nbyte ^= buf++; //先与须要打算的数异或,再指向下一个数 for (bit = 8; bit > 0; --bit) { if (crc_nbyte & 0x80) //判断最高位是否为1 { crc_nbyte = (crc_nbyte << 1) ^ POLYNOMIAL; //最高位为1,左移一位与多项式异或 } else { crc_nbyte = (crc_nbyte << 1); //最高位为0,直接左移一位 } } } return crc_nbyte; } 逆序CRC信息单元编码算法

下面先容对单个字节的逆序CRC信息单元编码算法先容。

#define POLYNOMIAL 0x8C //00110001反序为10001100 / 函 数 名: calcrc_1byte 功能解释: 单字节CRC校验 形 参: unsigned char abyte:待校验单字节数据 返 回 值: 经CRC校验值 / unsigned char calcrc_1byte(unsigned char abyte) { unsigned char bit,crc_1byte; crc_1byte=abyte; for (bit = 8; bit > 0; --bit) { if (crc_1byte & 0x01) //判断最低位是否为1 { crc_1byte = (crc_1byte >> 1) ^ POLYNOMIAL; //最低位为1,右移一位与多项式异或 } else { crc_1byte = (crc_1byte >> 1); //最低位为0,直接右移一位 } } return crc_1byte; }

下面先容对多字节的逆序CRC信息单元编码算法先容。

#define POLYNOMIAL 0x8C //00110001反序为10001100 / 函 数 名: calcrc_nbyte 功能解释: 多字节CRC校验 形 参: unsigned char buf:待校验数组指针 unsigned char len:校验数 返 回 值: 经CRC校验值 / unsigned char calcrc_nbyte(unsigned char buf,unsigned char len) { unsigned char bit,crc_nbyte; crc_nbyte=0; while(len--) { crc_nbyte ^= buf++; //先与须要打算的数异或,再指向下一个数 for (bit = 8; bit > 0; --bit) { if (crc_nbyte & 0x01) //判断最低位是否为1 { crc_nbyte = (crc_nbyte >> 1) ^ POLYNOMIAL; //最低位为1,右移一位与多项式异或 } else { crc_nbyte = (crc_nbyte >> 1); //最低位为0,直接右移一位 } } } return crc_nbyte; } 注:DS18B20天生CRC码利用的便是逆序CRC信息单元编码算法。
DS18B20数字温度传感器与MCU通信

DS18B20数字温度传感器DATA引脚用于与微处理器MCU进行单总线通信,下图给出MCU作为单总线通信的主机与DS18B20从机之间进行通信的步骤。

图6:MCU与DS18B20单总线通信步骤示意

注:可以将上图中的第1步到第4步理解为一个事情周期,常日大部分操作实行一个事情周期即可。
而如果是读取当前温度,则须要实行两个事情周期。
下面给出MCU向DS18B20发送的ROM指令和RAM指令

表4:ROM指令表

序号

指令

代码

功能描述

1

读ROM

33H

读DS18B20温度传感器ROM中的编码。

2

匹配ROM

55H

发出此命令后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20使之做出相应,为下一步读写DS18B20做准备。

3

跳过ROM

CCH

忽略64位ROM地址,直接向DS18B20发温度变换命令。

4

搜索ROM

F0H

用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址。
为操作各器件做好准备。

5

报警芯片搜索

ECH

实行后,只有温度超过设定值上限或下限的电影才做出相应。

注:此处跳过ROM指令并非不发送ROM指令,这是一条分外的指令。

表5:RAM指令表

序号

指令

代码

功能描述

1

写暂存器

4EH

发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令后是传送2字节的数据。

2

读暂存器

BEH

读内部RAM中9字节的内容。

3

复制暂存器

48H

将RAM中第3、4字节的内容复制到EEPROM中。

4

温度变换

44H

启动DS18B20进行温度变换,结果存入内部9字节RAM中。

5

重调EEPROM

B8H

将EEPROM中内容规复到RAM中的第3、4字节。

6

读供电办法

B4H

读DS18B20供电模式。
寄生供电时DS18B20发送0,外接电源供电时DS18B20发送1。

DS18B20数字温湿度传感器吸收数据打算示例正温时,DS18B20温度转换打算公式如下:

图7:DS18B20正温打算公式

负温时,DS18B20温度转换打算公式如下:

图8:DS18B20负温打算公式

DS18B20温度变换后暂存器中的9字节数据:

图9:DS18B20温度变换后暂存器中的9字节数据

DS18B20温度串口调试助手显示实验(串口1)注:本节的实验源码是在“实验3-3-1:DHT11温湿度传感器 - 串口调试助手显示(串口1)”的根本上修正。
本节对应的实验源码是:“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”。
工程须要用到的库文件

本例须要用到的c文件如下表所示,工程须要添加下表中的c文件。

表6:实验须要用到的C文件

序号

文件名

后缀

功能描述

1

stm32f10x_rcc

.c

复位与时钟掌握器。

2

stm32f10x_gpio

.c

通用输入输出。

3

stm32f10x_usart

.c

通用同步/异步收发器。

4

misc

.c

中断向量掌握器。

按下图所示将须要的c文件添加到工程。

图10:在新建工程中添加所需库函数c文件

头文件引用和路径设置须要引用的头文件

由于在“main.c”文件中利用了标准库和我们自己建的软件延时函数,以是须要引用下面的头文件。

#include "stm32f10x.h" //delay这里报错的缘故原由是:delay函数用汇编实现的,导致了MDK误报。
#include "delay.h" 须要包含的头文件路径

本例须要包含的头文件路径如下表:

表7:头文件包含路径

序号

路径

描述

1

..\Lib\F10x_FWLIB\inc

标准库头文件路径。

2

..\User

stm32f10x_conf.h头文件在该路径,以是要包含。

3

..\User\bsp

自建的板卡干系的驱动文件路径。

MDK中点击魔术棒,打开工程配置窗口,按照下图所示添加头文件包含路径。

图11:添加头文件包含路径

MCU与DS18B20传感器通信所需函数搜集

在“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”工程中有ds18b20.c文件,该文件包括了MCU单总线与DS18B20通信所用到的函数。
这些函数仅是艾克姆科技根据DS18B20手册设计的函数,仅供用户参考。
下表列举了这些函数。

表8:MCU与DS18B20单总线通信干系函数搜集

序号

函数名

功能描述

1

DS18B20_Rst

MCU发复位脉冲给DS18B20。

2

DS18B20_Presence

MCU检测DS18B20返回的存在脉冲。

3

DS18B20_Read_Bit

从DS18B20读取一个位。

4

DS18B20_Read_Byte

从DS18B20读取一个字节。

5

DS18B20_Write_Byte

写一个字节到DS18B20。

6

DS18B20_Init

初始化DS18B20。

7

DS18B20_Get_Temp

从DS18B20读取温度值。

编写代码

首先先容下DS18B20_Rst 函数和DS18B20_Presence 函数,由于是单总线通信,须要根据手册上对时序的哀求来合理设定延时及判断脉冲长度。

代码清单:MCU发复位脉冲给DS18B20

/ 描 述 : 主机给从机发送复位脉冲 入 参 : 无 返回值 : 无 / static void DS18B20_Rst(void) { DS18B20_Mode_Out_PP(); //主机设置为推挽输出 DS18B20_DATA_OUT(LOW); //主机至少产生不少于480us的低电平复位旗子暗记 sw_delay_us(750); DS18B20_DATA_OUT(HIGH); //主机在产生复位旗子暗记后,需将总线拉高 sw_delay_us(15); //从机吸收到主机的复位旗子暗记后,会在15~60us后给主机发一个存在脉冲}

代码清单:MCU检测DS18B20返回的存在脉冲

/ 描 述 : 检测从机给主机返回的存在脉冲 入 参 : 无 返回值 : 0:成功 1:失落败 / static uint8_t DS18B20_Presence(void) { uint8_t pulse_time = 0; DS18B20_Mode_IPU(); //主机设置为上拉输入 //等待存在脉冲的到来,存在脉冲为一个60~240us的低电平旗子暗记 //如果存在脉冲没有来则做超时处理,从机吸收到主机的复位旗子暗记后,会在15~60us后给主机发一个存在脉冲 while( DS18B20_DATA_IN() && pulse_time<100 ) { pulse_time++; sw_delay_us(1); } if( pulse_time >=100 ) //经由100us后,存在脉冲都还没有到来 return 1; //读取失落败 else //存在脉冲及时到来 pulse_time = 0; //清零计时变量,实行下面的代码 //存在脉冲到来,且存在的韶光不能超过240us //如果存在脉冲超过240us则做超时处理 while( !DS18B20_DATA_IN() && pulse_time<240 ) { pulse_time++; sw_delay_us(1); } if( pulse_time >=240 ) //存在脉冲到来,但存在的韶光超过了240us return 1; //读取失落败 else //有效的存在脉冲 return 0; //读取成功 }

然后,在对DS18B20写ROM和RAM指令时用到DS18B20_Write_Byte函数,在读取DS18B20干系数据时用到DS18B20_Read_Byte函数。
这两个函数清单如下。

代码清单:写一个字节数据到DS18B20

/ 描 述 : 写一个字节到DS18B20,低位先行 入 参 : uint8_t 返回值 : 无 / 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; / 写0和写1的韶光至少要大于60us / if (testb) { DS18B20_DATA_OUT(LOW); sw_delay_us(8); //1us < 这个延时 < 15us DS18B20_DATA_OUT(HIGH); sw_delay_us(58); //58us+8us>60us } else { DS18B20_DATA_OUT(LOW); / 60us < Tx 0 < 120us / sw_delay_us(70); DS18B20_DATA_OUT(HIGH); / 1us < Trec(规复韶光) < 无穷大/ sw_delay_us(2); } } }

代码清单:从DS18B20读取一个字节数据

/ 描 述 : 从DS18B20读一个字节,低位先行 入 参 : 无 返回值 : uint8_t / uint8_t DS18B20_Read_Byte(void) { uint8_t i, j, dat = 0; for(i=0; i<8; i++) { j = DS18B20_Read_Bit(); //从DS18B20读取一个bit dat = (dat) | (j<<i); } return dat; }

末了,MCU从DS18B20读取温度值(没有进行CRC校验,这样程序实行效率会高些),并且在主函数中通过串口实时显示温度信息。

代码清单:从DS18B20读取温度值

/ 描 述 : 从DS18B20读取温度值 入 参 : 无 返回值 : float /float DS18B20_Get_Temp(void) { uint8_t tpmsb, tplsb; short s_tem; float f_tem; DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); //ROM指令: 跳过 ROM DS18B20_Write_Byte(0X44); //RAM指令: 开始温度转换 DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); //ROM指令: 跳过 ROM DS18B20_Write_Byte(0XBE); //RAM指令: 读温度值 tplsb = DS18B20_Read_Byte(); //读温度值低8位 tpmsb = DS18B20_Read_Byte(); //读温度值高8位 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; }

代码清单:主函数

int main(void) { //初始化USART1并配置USART1中断优先级 USART1_Init(); //主循环 while(DS18B20_Init()) { printf("\r\n no ds18b20 exit \r\n"); //温度传感器初始化失落败,即DS18B20_Init()值为1 } printf("\r\n ds18b20 exit \r\n"); //温度传感器初始化成功,即DS18B20_Init()值为0 for(;;) { printf("\r\n temperature %.1f\r\n",DS18B20_Get_Temp()); //实时读取温度值,并将温度值串口打印出来 sw_delay_ms(1500); // 1.5s 读取一次温度值 } } 实验步骤解压“…\第3部分:标准库教程和实验源码\ 2 – 传感器实验程序\”目录下的压缩文件“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”,将解压后得到的文件夹拷贝到得当的目录,如“D\STM32F103ZET6”。
启动MDK5.23。
在MDK5中实行“Project→Open Project”打开“…\DS18B20\projec”目录下的工程“DS18B20.uvproj”。
点击编译按钮编译工程。
把稳查看编译输出栏,不雅观察编译的结果,如果有缺点,修处死式,直到编译成功为止。
编译后天生的HEX文件“DS18B20.hex”位于工程目录下的“Objects”文件夹中。
点击下载按钮下载程序 。
如果须要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。
程序运行后,打开串口调试助手选择精确的串口号,波特率设置为19200,数据位为8、停滞位为1,可以不雅观察到串口调试助手1.5s显示一次读取到的温度信息。
DS18B20温度串口调试助手显示实验(RS485)注:本节的实验源码是在“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”的根本上修正。
本节对应的实验源码是:“实验3-4-2:DS18B20温度传感器 - 串口调试助手显示(RS485)”。
工程须要用到的库文件

在利用库函数建“实验3-4-2:DS18B20温度传感器 - 串口调试助手显示(RS485)”工程时,须要用到的c文件以及添加头文件包含路径的方法与先容“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”完备一样,在此不再赘述。

编写代码

首先ds18b20.c干系的函数与“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”的代码完备一样,在此不再赘述。

然后,在主函数中会对所利用RS485接口进行初始化,在利用RS485接口上传DS18B20温度信息时主函数代码如下。

程序清单:主函数

int main(void) { //初始化RS485所用GPIO口及所用USART2配置 RS485_Init(); //使能RS485吸收,关闭发送 RS485RX; //主循环 while(DS18B20_Init()) { RS485TX; //使能发送,关闭吸收 sw_delay_ms(1); //延时1ms,不可省去 printf("\r\n no ds18b20 exit \r\n"); //温度传感器初始化失落败,即DS18B20_Init()值为1 sw_delay_ms(1); //延时1ms,不可省去 RS485RX; //使能吸收,关闭发送 } RS485TX; //使能发送,关闭吸收 sw_delay_ms(1); //延时1ms,不可省去 printf("\r\n ds18b20 exit \r\n"); //温度传感器初始化成功,即DS18B20_Init()值为0 sw_delay_ms(1); //延时1ms,不可省去 RS485RX; //使能吸收,关闭发送 for(;;) { RS485TX; //使能发送,关闭吸收 sw_delay_ms(1); //延时1ms,不可省去 printf("\r\n temperature %.1f\r\n",DS18B20_Get_Temp()); //实时读取温度值,并将温度值串口打印出来 sw_delay_ms(1); //延时1ms,不可省去 RS485RX; //使能吸收,关闭发送 sw_delay_ms(1500); // 1.5s 读取一次温度值 } } 实验步骤解压“…\第3部分:标准库教程和实验源码\ 2 – 传感器实验程序\”目录下的压缩文件“实验3-4-2:DS18B20温度传感器 - 串口调试助手显示(RS485)”,将解压后得到的文件夹拷贝到得当的目录,如“D\STM32F103ZET6”。
启动MDK5.23。
在MDK5中实行“Project→Open Project”打开“…\DS18B20\projec”目录下的工程“DS18B20.uvproj”。
点击编译按钮编译工程。
把稳查看编译输出栏,不雅观察编译的结果,如果有缺点,修处死式,直到编译成功为止。
编译后天生的HEX文件“DS18B20.hex”位于工程目录下的“Objects”文件夹中。
点击下载按钮下载程序 。
如果须要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。
程序运行后,打开串口调试助手,选择USB转RS485模块对应的串口号,波特率设置为19200,数据位为8、停滞位为1,可以不雅观察到串口调试助手1.5s显示一次读取到的温度信息。
DS18B20温度串口调试助手显示实验(CRC校验)注:本节的实验源码是在“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”的根本上修正。
本节对应的实验源码是:“实验3-4-3:DS18B20温度传感器 - CRC校验 - 串口调试助手显示(串口1)”。
工程须要用到的库文件

在利用库函数建“实验3-4-3:DS18B20温度传感器 - CRC校验 - 串口调试助手显示(串口1)”工程时,须要用到的c文件以及添加头文件包含路径的方法与先容“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”完备一样,在此不再赘述。

编写代码

首先ds18b20.c干系的函数与“实验3-4-1:DS18B20温度传感器 - 串口调试助手显示(串口1)”的代码只有读取温度信息时对读取的信息进行了CRC校验,该函数的代码如下。

代码清单:CRC校验(适宜DS18B20的校验算法)

/ 描 述 : 读温度寄存器的值(原始数据),带CRC校验。
入 参 : uint8_t buf:待校验数组指针 uint8_t size:校验数 返回值 : 经CRC校验值 / uint8_t dallas_crc8(uint8_t buf, uint8_t size) { unsigned char bit,crc_nbyte; crc_nbyte=0; while(size--) { crc_nbyte ^= buf++; //先与须要打算的数异或,再指向下一个数 for (bit = 8; bit > 0; --bit) { if (crc_nbyte & 0x01) //判断最低位是否为1 { crc_nbyte = (crc_nbyte >> 1) ^ 0x8C; //最低位为1,右移一位与多项式异或 } else { crc_nbyte = (crc_nbyte >> 1); //最低位为0,直接右移一位 } } } return crc_nbyte; }

程序清单:MCU读取DS18B20温度等信息并进行校验

/ 描 述 : 从DS18B20读取温度值 入 参 : 无 返回值 : float / float DS18B20_Get_Temp(void) { uint8_t temp[8], crc; short s_tem; float f_tem; DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); / 跳过 ROM / DS18B20_Write_Byte(0X44); / 开始转换 / DS18B20_Rst(); DS18B20_Presence(); DS18B20_Write_Byte(0XCC); / 跳过 ROM / DS18B20_Write_Byte(0XBE); / 读温度值 / temp[0] = DS18B20_Read_Byte(); / 读温度值低字节 / temp[1] = DS18B20_Read_Byte(); / 读温度值高字节 / temp[2] = DS18B20_Read_Byte(); / Alarm High Byte / temp[3] = DS18B20_Read_Byte(); / Alarm Low Byte / temp[4] = DS18B20_Read_Byte(); / Reserved Byte 1 / temp[5] = DS18B20_Read_Byte(); / Reserved Byte 2 / temp[6] = DS18B20_Read_Byte(); / Count Remain Byte / temp[7] = DS18B20_Read_Byte(); / Count Per degree C / crc = DS18B20_Read_Byte(); / CRC校验值 / //对读取的前8字节进行CRC校验,所得校验值与第9字节比对 if(crc != dallas_crc8(temp, 8)) { return 0x800; } s_tem = temp[1]<<8; s_tem = s_tem | temp[0]; if( s_tem < 0 ) //读取的温度值是负值,代表温度是负温 f_tem = (~s_tem+1) 0.0625; else //读取的温度值是正值,代表温度是正温 f_tem = s_tem 0.0625; return f_tem; }

然后,在主函数中通过串口实时显示温度信息。
代码清单如下。

程序清单:主函数

int main(void) { //初始化USART1并配置USART1中断优先级 USART1_Init(); //主循环 while(DS18B20_Init()) { printf("\r\n no ds18b20 exit \r\n"); //温度传感器初始化失落败,即DS18B20_Init()值为1 } printf("\r\n ds18b20 exit \r\n"); //温度传感器初始化成功,即DS18B20_Init()值为0 for(;;) { printf("\r\n temperature %.1f\r\n",DS18B20_Get_Temp()); //实时读取温度值,并将温度值串口打印出来 sw_delay_ms(1500); // 1.5s 读取一次温度值 } } 实验步骤解压“…\第3部分:标准库教程和实验源码\ 2 – 传感器实验程序\”目录下的压缩文件“实验3-4-3:DS18B20温度传感器 - CRC校验 - 串口调试助手显示(串口1)”,将解压后得到的文件夹拷贝到得当的目录,如“D\STM32F103ZET6”。
启动MDK5.23。
在MDK5中实行“Project→Open Project”打开“…\DS18B20\projec”目录下的工程“DS18B20.uvproj”。
点击编译按钮编译工程。
把稳查看编译输出栏,不雅观察编译的结果,如果有缺点,修处死式,直到编译成功为止。
编译后天生的HEX文件“DS18B20.hex”位于工程目录下的“Objects”文件夹中。
点击下载按钮下载程序 。
如果须要对程序进行仿真,点击Debug按钮,即可将程序下载到STM32F103ZET6中进行仿真。
程序运行后,打开串口调试助手,选择精确的串口号,波特率设置为19200,数据位为8、停滞位为1,可以不雅观察到串口调试助手1.5s显示一次读取到的温度信息。
标签:

相关文章

全球芯片缺少来源在哪里_芯片_华为

本报 赵觉珵 本报驻美国特约 吴 倩美国得克萨斯州连日来的暴雪景象,导致当地电力供应系统失落灵,三星、恩智浦、英飞凌等芯片巨子在当...

互联网 2024-12-13 阅读0 评论0