求个温度采集的流程图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求个温度采集的流程图相关的知识,希望对你有一定的参考价值。

用DS18B20温度采集
大概说说就行

参考技术A 写好初始化、读字节、写字节、读取温度、温度值转换子程序
然后开机初始化DS18B20,需要时调用读取温度子程序即可
注意DS18B20的读写时序,延时时间,上拉电阻阻值,工作电压。
否则无法工作、精度极低或显示85.0℃
————————————————————————————
使用DS18B20的注意事项
(1)DS18B20从测温结束到将温度值转换成数字量需要一定的转换时间,这是必须保证的,不然会导致转换错误,使温度输出总是显示85℃。
(2)在实际使用中发现,应使电源电压保持在5V左右,若电源电压过低,会使所测得的温度与实际温度出现偏高现象,经过试验发现,一般在5V左右。
(3)较小的硬件开销需要相对复杂的软件进行补偿,由于DS18B20与单片机间采用串行方式传送数据,因此,在对DS18B20进行读写编程时,必须严格保证读写时序,否则将无法读取测温结果。
(4)在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环,这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。

可用的例子程序,用于51系列12M,需要用到时包含这个驱动即可
temp就是温度值浮点数数值
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//这是一个温度采集模块的驱动程序。
/*
|----|
| DS | DS18B20管脚排列
+----+
| | |
| | |
| | |----------Vdd
| |------------DQ-->P1.0
|---------------GND
*/
#ifndef _DS18B20_h
#include "stdio.h"
#include "reg52.h"
#include "intrins.h"
#include <delay.h>

//外部函数
//--------------delay.c--------------------
extern void delay_nus(unsigned int delay_time); //延时子程序
//----------------------------------------

//------------DS18B20控制命令-----------------------------
#define T_CONVER 0x44 //开始温度转换
#define T_CONFIG 0x5f //11位转换
#define T_READ 0xbe //读暂存器
#define T_WRITE 0x4e //写暂存器
#define T_ROM_JMP 0xcc //忽略64ROM地址
#define T_COPY_E2 0x48 //将温度上下限数值写到E2ROM
#define T_RECALL_E2 0xb8 //将E2中存储的温度上下限数值复制到上下限寄存器中。
#define T_cont 0.0625 //温度转换常数
//------------------------------------------------------
sbit DQ=P1^0; //DS18B20数据输出端
sbit LED=P1^5; //LED
bit REC_suc=0; //DS18B20成功复位标志位
bit T_sign; //温度正负符号
float temp=0; //转换好的温度数值
signed char temp_TH=25,temp_TL=10; //温度上下限
unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
void DS18B20_init(); //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
void ReadTemperature(); //读取温度数值
void temp_data_turn(float in_data); //温度转换
//--------------------------------------------------------

/****************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init()
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:丁霄
/**********************************************************************/
void DS18B20_init()

unsigned char i=1;
DQ=0;
DQ=1;
delay_nus(20); //延时227us
while(REC_suc==0)

DQ=0;
delay_nus(45); //延时502us
DQ=1;
delay_nus(3); //等待DS18B20作出相应 延时40us
while(1)
i=DQ;
if(i==0)

REC_suc=1;
delay_nus(20); //延时227us
break;



REC_suc=0;


/****************************DS18B20发送函数**************************/
/*函数原型:void DS18B20_send(unsigned char in_data)
/*函数功能:DS18B20发送数据
/*输入参数:要发送的数据
/*输出参数:无
/*调用模块:_cror_()
/*建立时间:2005/11/14
/*作者:丁霄
/**********************************************************************/
void DS18B20_send(unsigned char in_data)

unsigned char i,out_data,k;
out_data=in_data;
for(i=1;i<9;i++) //串行发送数据

DQ=0;
DQ=1;
_nop_();
_nop_();
k=out_data&0x01;
if(k==0x01) //判断数据 写1

DQ=1;

else //写0

DQ=0;

delay_nus(5); //延时62us
DQ=1;
out_data=_cror_(out_data,1); //循环左移1位



/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:delay()
/*建立时间:2005/11/14
/*作者:丁霄
/******************************************************************/
unsigned char DS18B20_read()

unsigned char i,in_data,k;
in_data=0;
for(i=1;i<9;i++) //串行发送数据

DQ=0;
DQ=1;
_nop_();
_nop_();
k=DQ; //读DQ端
if(k==1) //读到的数据是1

in_data=in_data|0x01;

else

in_data=in_data|0x00;

delay_nus(4); //延时51us
DQ=1;
in_data=_cror_(in_data,1); //循环左移1位

return(in_data);


/**************************DS18B20读取温度函数**************************/
/*函数原型:void ReadTemperature()
/*函数功能:DS18B20读取温度转换好的数据
/*输入参数:无
/*输出参数:无
/*调用模块:DS18B20_send(),DS18B20_send(),DS18B20_init(),DS18B20_send(),DS18B20_send(),
T_L=DS18B20_read(),T_H=DS18B20_read()
/*建立时间:2005/11/15
/*作者:丁霄
/******************************************************************/
void ReadTemperature()

unsigned char T_L=0;
unsigned char T_H=0;
unsigned char k;
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

T_L=DS18B20_read();
T_H=DS18B20_read();

k=T_H&0xf8;
if(k==0xf8)
T_sign=1; //温度是负数
else
T_sign=0; //温度是正数

T_H=T_H&0x07;
temp=(T_H*256+T_L)*T_cont;


/**************************DS18B20温度转换函数**************************/
/*函数原型:void temp_data_turn(float in_data)
/*函数功能:DS18B20读取温度转换
/*输入参数:无
/*输出参数:无
/*调用模块:无
/*建立时间:2005/11/16
/*作者:丁霄
/******************************************************************/
void temp_data_turn(float in_data)

unsigned int y;
in_data=in_data*10; //数值扩大10倍,精度到0.1
t_bai=in_data/1000;
y=(unsigned int)in_data%1000;
t_shi=y/100;
y=y%100;
t_ge=y/10;
t_feng=y%10;

参考资料:http://baike.baidu.com/view/1341776.html?wtp=tt

本回答被提问者采纳

IoT无线温度采集系统设计

随着工业和农业的发展,无线采集系统的应用范围变得更加广泛,对无线数据采集系统的测量参数也越来越多,精准度也越来越高。目前国内外有很多的无线温度采集系统,但很多的无线温度采集系统存在很多问题,如采集速度和稳定性不够高,不能适应复杂的环境,采集精准度不够高等等。因此,需要性能更高的无线数据采集系统来满足工农业的需求。

本设计是基于单片机的无线温度采集系统,由数据采集发送模块和数据接收模块两个模块组成。数据采集发送模块由DS18B20数字温度传感器、LCD1602液晶显示屏、单片机、NRF905数据发送模块组成;数据接收模块由单片机、LCD1602液晶显示屏、NRF905数据接收模块组成。DS18B20数字温度传感器把信号直接传给的单片机,单片机把数据进行电平转换,然后通过NRF905数据发送模块把数据发送出去,同时将数据显示到LCD1602液晶显示屏。NRF905数据接收模块接收到数据将数据显示在LCD1602液晶显示屏。

本设计最终成功实现了温度采集和数据的无线传输,具有传送距离远、测量准确、应用广泛等特点。

系统整体设计

本文主要设计的是基于单片机的无线温度采集系统,该系统由发送端和接收端两个部分组成。发送端由DS18B20数字温度传感器、LCD1602液晶显示屏、单片机、NRF905数据发送模块组成。接收端由单片机、LCD1602液晶显示屏、NRF905数据接收模块组成。

系统工作原理

本系统温度传感器采用DS18B20,显示部分采用LCD1602,无线通信部分采用NRF905模块。DS18B20主要完成温度采集,把周围的温度模拟信号通过1-wire总线直接传给单片机,单片机把数据进行电平转换,然后通过NRF905数据发送模块把数据发送出去,同时将数据显示到LCD1602液晶显示屏。NRF905数据接收模块接收到数据将数据显示在LCD1602液晶显示屏上。该系统可实现对温度实时多点检测,还实现了远程无线通信,可以对DS18B20覆盖的区域进行实时监控。

 硬件设计

核心控制器件--STC89C52

STC89C52是一款高性能的8位微控制器。具有8K字节可编程Flash存储器,512字节数据存储空间,内带4K字节EEPROM,而且可以直接使用串口下载。

STC89C52单片机封装采用的是双列直插封装(DIP40)。

单片机的最小系统:

单片机的最小系统主要由单片机、电源、晶振电路、复位电路组成。

本系统单片机采用是STC89C52RC。单片机电源采用标准+5V电源。EA接高电平,选用片内ROM作为程序存储器。

晶振电路为单片机定时计数器等提供时钟信号,本设计采用内部时钟方式,在XTAL1和XTAL2外接12MHz晶振和陶瓷电容。因为单片机内部有一个高增益反相放大器,当外接12MHz晶振后,就会构成自激振荡器,并产生时钟脉冲,时钟脉冲可以为单片机定时计数器提供时钟信号。

复位电路采用外部复位。当按键按下时,RST脚接高电平,完成系统复位。

注意晶振电路尽可能的与单片机靠近,路线尽量短。

电源电路

本设计是基于单片机的无线温度采集系统,单片机和LCD1602采用标准+5V直流电源供电。NRF905通信模块采用3.3V直流电源供电。采用电压转换得到3.3V直流电源。本设计采用AMS1117-3.3稳压芯片把5V转换成3.3V。

电压转换电路:

数字温度传感器DS18B20

温度传感器采用DS18B20的引脚排列:

温度传感器利用独有的单总线协议,只需要一个单线端口通讯,通过这根口线从DS18B20读出或者写入信息。板载上拉电阻与单片机直接相连。每个器件有唯一的64位序列号存储在内部只读存储器中。高速暂存器为8字节的存储器,头两个字节包含温度传感器输出的温度信息,第3、4字节为TH(报警温度上限)、TL(报警温度下限),第5字节为配置寄存器,用于确定温度值的数字转换分辨率,第6、7、8字节保留未用。其中,第3,4,5字节可存储到EEPROM中。DS18B20的精度采用增量递增的形式,其精度为可编程9,10,11,12位,分别为0.5℃,0.25℃,0.125℃,0.0625℃。在上电时默认精度为12位。本设计采用默认精度,即12位。

温度传感器测量范围为-55℃~+125℃,而且测量范围在-10℃~+85℃内精度高达±0.5℃。DS18B20可以直接从单线通讯线上汲取能量,除去了对外部电源的需求。除此之外,因为每个DS18B20有自己特有的位序列号,所以可允许多只DS18B20同时连在一根单总线上,因此可用一个微型控制器控制很多覆盖在一大片区域的DS18B20。这一特性可以应用到环境监测、探测建筑物、仪器或机器的温度以及过程检测和控制等等。

无线传输

NRF905的基本介绍

本设计的无线通信选用的是NRF905,由挪威Nordic VLSI公司制造。本设计采用标准3.3V电源,3.3V电源由ASM1117-3.3芯片电平转换而来,采用QFN封装,NRF905有32个引脚,选择工作于433MHz(工业)频道,不需要在频道之间转换,节省了频段之间的转换时间。由于数据传输过程中可能会受到干扰,使得收发数据不一致,因此一般发送端都需要对数据进行编码,编码后才能发送,同样接收端需要对数据译码,纠错。由于NRF905片内集成了曼彻斯特编码和译码,因此,不需要用户对收发数据进行任何编码和译码,使用非常可靠、方便。除此之外,NRF905采用ShockBurstTM发送和ShockBurstTM接收模式,特点是自动产生前导码和CRC(循环冗余码校验)。NRF905与微控制器之间通过SPI接口通信,SPI接口的配置非常简便。而且,NRF905是一款低功耗产品,以-10dBm的输出功率发射时电流为11mA,工作于接收模式时的电流为12.5mA,并且还有空闲模式与关机模式,这样更节能。

NRF905的应用非常广泛,可用于无线遥控、遥感勘测、无线报警及安全系统、无线数据通讯、无线开锁、家庭自动化、玩具等。

NRF905进行数据收发时主要依靠SPI接口和微控制器,通过射频收发模式进行无线数据传送,非常可靠、方便。

NRF905工作模式和节能模式

NRF905有两种工作模式和两种节能模式。两种节能模式分别为为空闲模式和关机模式。两种工作模式分别为为ShockBurstTM发送模式和ShockBurstTM接收模式。其工作模式由TRX_CE、TX_EN和PWR_UP三个引脚决定:

ShockBurstTM模式

NRF905可以处理与射频数据包有关的高速信号。NRF905通过SPI接口与微控制器通信,微控制器可以通过配置的SPI接口来决定数据在微控制器中低速处理,在NRF905中高速发送。在ShockBurstTM发送模式下,NRF905有自动产生字头和CRC校验码的功能。当发送完成后,置高数据准备好(DR)引脚,这样微控制器就可以检测到发送完成。在ShockBurstTM接收模式下,当NRF905接收到一个包含正确地址和数据的数据包后,置低地址匹配(AM)和数据准备好(DR)两个引脚,这样微控制器就可以检测到接收完成。这样可以降低微控制器的存储需求,降低成本,而且还可缩短软件开发的时间。

LCD1602

 LCD1602简介

LCD1602的功能是能够显示字母、数字、符号等,是一种点阵式LCD。LCD1602可以显示16*2,即32个字符,工作电压4.5-5V,工作电流2.0mA(5.0V),本设计采用标准+5V直流电源。LCD1602是一种5*7点阵,可以通过指令设置带光标显示的字符显示。如图3-7所示是LCD1602液晶显示屏实物。

 软件

NRF905发送步骤

  1. 当有数据需要发送时,通过通信应用协议和器件配置来确定SPI接口速率。微控制器件通过SPI接口按时序把TX_address和要发送的数据传给NRF905;
  2. 开启NRF905的ShockBurstTM发送模式:设置TRX_CE=1,TX_EN=1;
  3. NRF905的ShockBurstTM发送:自动开启射频寄存器、打包数据包(带字头和CRC校验码)、发送数据包、当数据发送完成后,设置数据准备好引脚=1;
  4. 设置AUTO_RETRAN=1,NRF905连续发送数据包,直到设置TRX_CE=0;
  5. 当设置TRX_CE=0后,NRF905数据发送完成,自动进入空闲模式。

注意:当进入ShockBurstTM工作模式,若开始发送数据,不管TRX_EN=1、TX_EN=1、TRX_EN=0、TX_EN=0,发送过程都会被逐一处理完。只有当前一个数据包发送完毕后,NRF905才可以接收下一个数据包。

NRF905接收步骤

  1. 进入NRF905的ShockBurstTM接收模式:设置TRX_CE=1,TX_EN=0;
  2. 等待650us,NRF905不断监测信息,等待接收数据;
  3. 当同一接收频段的载波被NRF905检测到后,设置载波检测引脚=1;
  4. 当一个相匹配的有效地址被接收后,设置地址匹配引脚=1;
  5. 当一个正确的数据包被成功接收完后,字头、地址、CRC校验位被NRF905自动移除,接着设置数据准备引脚=1;
  6. 设置TRX_CE=0,NRF905进入空闲低电流模式;
  7. 微控制器通过SPI接口,以合适的速率读出有效数据,并移动到微控制器内;
  8. 接收完所有数据后,NRF905设置数据准备好引脚和地址匹配=0;
  9. NRF905能进入ShockBurstTM接收模式、ShockBurstTM发送模式、关机模式。

注意:当正在接收一个数据包时,TRX_CE或TX_EN引脚的状态发生改变,NRF905的工作模式将发生改变,数据包丢失。当地址匹配脚的信号被微处理器接收到后,可以判断出NRF905正在接收数据包,可让NRF905继续接收该数据包还是进入下一个工作模式。 

 

 温度采集:

 

 

 

以上是关于求个温度采集的流程图的主要内容,如果未能解决你的问题,请参考以下文章

求个汇编语言流程图

基于arm的多路温度采集控制系统需求分析

VM系列振弦采集模块启动流程的工作原理

多路温湿度采集仪设计与制作

视频采集以及播放的流程

superset采集流程