本科时候做过关于ds18b20温度传感器的课程设计,当时好像是先用单片机A采集温度,其中用矩阵键盘设置报警值,然后通过232串口将温度值传给单片机B,单片机B上的数码管显示,同时单片机B的矩阵键盘也可以设置报警值。我当时搞A和B通信这块,至于老师给的分数就不提了。后来学习stm32,想着用stm32通过单总线采集8个ds18b20的值,在通过无线传给另一个stm32,另一个stm32通过串口发给电脑,电脑上的上位机显示8个温度值。

stm32选用的stm32rct6,无线模块选用的是nrf24l01,温度传感器是ds18b20。其中DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。

温度传感器通过单总线协议与stm32进行通讯,对于温度传感器的就不在介绍了,可以百度它的中文手册。至于单点采集,就是将ds18b20的DQ与STM32的一个管脚相连,然后地接地,VCC接VCC,而采集8个点无非就是将8个温度传感器并联,这里我用到是PE4作为信号线,因为每个ds18b20都有一个独特的64位序列号,从而允许多个ds18b20同时连在一根单总线上。STM32依靠每个温度传感器独有的64位片序列号辨认总线上的器件,对8个点的温度分别进行采集,首先要知道每个ds18b20的序列号,读取序列号的程序如下:

得到的8个温度传感器的序列号:

有了这8个序列码,就可以通过匹配序列号的原则,对8个点的温度进行采集。其中匹配程序如下:

void DS18B20_Match_Serial(u8 a)
{
u8 i;
u8 id1[8]={0x28,0xee,0x59,0x52,0x18,0x16,0x02,0x08};
u8 id2[8]={0x28,0xee,0xfb,0x49,0x18,0x16,0x02,0x14};
u8 id3[8]={0x28,0xee,0x36,0x52,0x18,0x16,0x02,0x76};
u8 id4[8]={0x28,0xee,0xa5,0x43,0x18,0x16,0x02,0x38};
u8 id5[8]={0x28,0xee,0x77,0x42,0x18,0x16,0x02,0x6a};
u8 id6[8]={0x28,0xee,0xb8,0x4b,0x18,0x16,0x02,0xb4};
u8 id7[8]={0x28,0xee,0xd4,0x49,0x18,0x16,0x02,0x83};
u8 id8[8]={0x28,0xee,0xce,0x4c,0x18,0x16,0x02,0xc3};
u8 id9[8]={0x28,0xee,0x13,0x4b,0x18,0x16,0x02,0xf7};
u8 id10[8]={0x28,0xee,0xc5,0x44,0x18,0x16,0x02,0xaf};
DS18B20_Reset();
DS18B20_Write_Byte(0X55);//发匹配ROM指令
if(a==1)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id1[i]);
}
else if(a==2)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id2[i]);
}
else if(a==3)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id3[i]);
}
else if(a==4)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id4[i]);
}
else if(a==5)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id5[i]);
}
else if(a==6)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id6[i]);
}
else if(a==7)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id7[i]);
}
else if(a==8)
{
for(i=0;i<8;i++)
DS18B20_Write_Byte(id8[i]);
}

然后就是读取温度值函数:

double DS18B20_Get_wd(u8 b)
{
u8 TL=0,TH=0;
u16 temp=0;
double wd=0;
DS18B20_Reset();//复位
DS18B20_Write_Byte(0xCC); //忽略ROM指令
DS18B20_Match_Serial(b); //进行匹配
DS18B20_Write_Byte(0x44); //得到温度
delay_ms(800);
DS18B20_Reset();
DS18B20_Write_Byte(0xCC);
DS18B20_Match_Serial(b);
DS18B20_Write_Byte(0xBE);
TL=DS18B20_Read_Byte();
TH=DS18B20_Read_Byte();
temp=TH;
temp=(temp<<8)+TL;
if((temp&0xF800)==0xF800)//判断正负
{
temp=~temp;
temp=temp+1;
wd=temp*(-0.0625);
}
else
{
wd=temp*0.0625;
}
return wd;
}

然后就是需要把这8个温度值通过无线发给另一个STM32,主要用到NRF24l01模块,一次最多发32个字节。用到的是SPI通讯方式,至于NRF24l01的使用方法和一些例程什么的,大家可以百度或者看一下原子,野火的例子。

STM32(A)把采集的温度值处理后,发送的程序如下:

  NRF24L01_TX_Mode();//发送模式while(1){    temp1=DS18B20_Get_wd(1);temp2=DS18B20_Get_wd(2);temp3=DS18B20_Get_wd(3);temp4=DS18B20_Get_wd(4);temp5=DS18B20_Get_wd(5);temp6=DS18B20_Get_wd(6);temp7=DS18B20_Get_wd(7);temp8=DS18B20_Get_wd(8);sprintf( tmp_buf, "%.1f", temp1);//浮点转字符sprintf( tmp_buf1, "%.1f", temp2 );sprintf( tmp_buf2, "%.1f", temp3 );sprintf( tmp_buf3, "%.1f", temp4); sprintf( tmp_buf4, "%.1f", temp5 );sprintf( tmp_buf5, "%.1f", temp6 );sprintf( tmp_buf6, "%.1f", temp7 );sprintf( tmp_buf7, "%.1f", temp8 );strcat(tmp_buf,tmp_buf1);//字符拼接strcat(tmp_buf,tmp_buf2);strcat(tmp_buf,tmp_buf3);strcat(tmp_buf,tmp_buf4);strcat(tmp_buf,tmp_buf5);strcat(tmp_buf,tmp_buf6);strcat(tmp_buf,tmp_buf7);NRF24L01_TxPacket(tmp_buf);//打包发送}

STM32(B)接受8个温度值,并且通过串口发给电脑:
NRF24L01_RX_Mode();
while(1)
{
NRF24L01_RxPacket(tmp_buf);//打包接受
delay_ms(1000);//发现不延时的话,VB上位机接受不到数据
printf("%s\r\n",tmp_buf);//发给上位机(96 N 8 1 格式)
}

下位机的事情都完成后,然后就是上位机界面的编写,本人当时在学习VB,就用VB写了个简单的界面,不过大家也可以用Labview写,都可以。

以上内容,难免有错误与不足之处,大家踊跃拍砖。

基于stm32的无线多点温度采集系统设计相关推荐

  1. 基于射频NRF无线多点温度采集显示系统设计(毕设课设)

    1.一个主机可采集1~18路从机温度 2.主机与电脑之前通过MODBUS RTU协议通信,9600,8,N,1 3.温度超限报警,继电器控制输出,达到报警温度继电器断开. 4.从机锂电池超低功耗供电, ...

  2. 基于ZigBee 的多点温度采集系统设计与实现

    摘要:针对广阔空间环境温度采集系统对功耗及成本的要求,设计了基于无线传感网络技术的多点温度采集系统.以CC2430 为主控芯片,选用DS18B20 作为温度采集节点的传感器,基于ZigBee 协议栈构 ...

  3. 多点温度采集系统设计c语言,单片机多点(八路)DS18B20温度采集系统仿真与源码...

    #include #include #define                DATA        P1      //1602驱动端口 //ROM操作命令 #define           ...

  4. STM32单片机三线制PT100温度采集控制系统LCD12864显示器

    实践制作DIY- GC0096-三线制PT100温度采集控制系统 一.功能说明: 基于STM32单片机设计-三线制PT100温度采集控制系统 功能介绍: STM32F103C系列最小系统班+PT100 ...

  5. 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计

    1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告)  摘  要:交通灯控制系统在城市交通控制中发挥着重要的作用,本次课程设计就是以城市交通灯控制系统为背景的,主要通过运用学过的数字电路 ...

  6. 基于STM32的智能温室控制系统仿真电路设计(温控补光)-基于STM32的智能蓝牙温控风扇控制系统设计-基于STM32的无线蓝牙心电监护仪系统设计【毕设课设分享】

    1609 基于STM32的智能蓝牙温控风扇控制系统设计-毕设课设 1.LCD1602液晶显示当前温度,温度上下限值,风扇等级,自动手动模式: 2.设置有4个按键,按键1可以设置自动和手动2种模式切换: ...

  7. 带内部参考电压(VREFINT)校正的STM32 DMA 内置温度采集

    笔者今天来介绍一下STM32ADC内置温度的采集,重点是通过内置参考电压来避免ADC参考电压VDDA对温度ADC采集的影响. 1.STM32ADC简介   stm32F4系列ADC,逐次趋近型AD.1 ...

  8. 基于STM32物联网WiFi智能家居控制系统设计(原理图+源代码+系统资料)

    基于STM32物联网WiFi智能家居控制系统设计(原理图+源代码+系统资料) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 设计编号:C0053 主要功能: 1. ...

  9. 基于STM32的无线通信模块使用——A7130

    基于STM32的无线通信模块使用-A7130 2.4G Hz的无线通信芯片A7130.本文简单介绍A7130的使用. 注:相关资源在这里 A7130简介 A7130 SPI接口 A7130寄存器配置及 ...

  10. 基于STM32的无线飞鼠(二)

    基于STM32的无线飞鼠(二) 在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块 细说MPU6050 一. MPU6050简介 二. 细节问题 三. 相关技术 四. ...

最新文章

  1. 行业盛会!2018中国人体微生物组大会
  2. HTML5仿微信聊天界面、微信朋友圈实例
  3. linux系统运维面试题
  4. 游戏设计、原型与开发:基于Unity与C#从构思到实现pdf
  5. 给AI换个“大动力小心脏”之OCR异构加速
  6. java aop 实例_Spring aop 简单示例
  7. 用matlab解一维单势垒波函数,一维多势垒结构准束缚态的MATLAB分析计算
  8. 用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)...
  9. H5 FileReader对象
  10. CreateThread函数--创建线程
  11. MinIO之C#上传文件等各项操作
  12. 如何更换tomcat版本
  13. 谷歌云服务器的ip是什么ip,看到有人在问谷歌云的IP段问题,我推荐几个自用觉得不错的...
  14. 视频下载v1.0全能短视频解析
  15. 锐捷交换机配置手册完整
  16. cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro(闪迪U盘量产助手)V1.1 最新版
  17. JPEG中Huffman解码实例讲解
  18. xio you c语言 程序设计入门——函数的定义
  19. css背景颜色和图片
  20. Ubuntu / Windows 查看域名系统 (Domain Name System,DNS)

热门文章

  1. iOS 元素定位方式总结
  2. php 网站实例,php网站实例【货币问答】- php网站实例所有答案 - 联合货币
  3. python科赫雪花递归理解_科赫雪花的python3实现(递归,非递归)
  4. Next主题 - 图片设置
  5. 横向合计代码 锐浪报表_[原创]锐浪报表动态加入列和最后加入合计列+进度条显示...
  6. Ansys APDL的超声换能器的模态分析(更新中)
  7. 程序员自学能学会吗?我是自学的,努力比天分重要
  8. 操作系统实验ucore lab1
  9. 密码只靠大脑记好累,有没有试过用群晖NAS来记?
  10. 【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)