0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于8051单片机的温湿度采集系统设计

我快闭嘴 来源:轻松学单片机 作者:轻松学单片机 2022-09-19 10:16 次阅读

又是一周过去。不知这一周大家过得怎么样?是否开心,是否有所收获。

秋天,是一个收获的季节。这一切都是建立在春耕夏播的基础之上。

以上是序。


通过前面的学习,我们学会了如何用串口发送数据和接收固定字节的命令。今天,我们继续讨论串口应用协议,主要焦点还是在如何有效地使用串口发送数据。为了简化描述,假设我们基于8051单片机开发一个温湿度采集系统,周期将温度和湿度数据上报到上位机。温度和湿度定义如下:

float temperature = 25.0; //温度float humidity = 70.0; //湿度

我们至少可以设计出以下两种不同的串口应用协议:

1.固定大小的消息:先发送float类型的温度,再发送float类型的湿度。每次传输8个字节。

温度(4字节)

湿度(4字节)

代码实现:

// 固定消息发送温度和湿度函数void send_temperature_and_humidity(float temperature, float humidity){    uart_sendFloat(temperature); //发送温度uart_sendFloat(humidity);//发送湿度}

  1. 字符串消息,先发送温度的字符串,再发送湿度的字符串,两者之间有明显的分隔符(例如空格、分号或冒号),结尾一般以“ ”结束。

"25.0, 70.0 "

//以字符串消息发送温度和湿度函数void send_temperature_and_humidity_string(float temperature, float humidity){    printf("%f,%f
", tempeature, humidity); //以字符串消息发送温度、湿度}

以上两种应用协议中,哪一种最好呢?

  • 从消息长度来看,固定消息大小都是8个字节,而字符串消息则超过8个字节且长度不定(请思考为什么?)

  • 从可读性来看,在ASCII接收模式下,字符串消息可读性高(人可直接读),固定消息“不可读”。

  • 从效率和保密性(假设有这一条吧),固定消息胜出,因为它发送的是原始二进制数据,占用字节最少。

为了传输更多的数据和实现更复杂的功能,我们通常在固定消息的基础上引入更多的辅助数据。例如,增加校验位保证数据传输无误,增加地址字节以区分不同设备等。但对于有些上位机(LabVIEW)来说,它对字符串数据的解释可以一步到位,无需按图索骥。

AT命令常用于控制WiFi模块、SMS模块等,就是以字符串消息实现的。

练手项目:假设有一个多点温度采集系统,架构如下图所示

1af7613a-3745-11ed-ba43-dac502259ad0.png

其中,N值取决于具体的系统要求。试基于固定长度消息设计串口应用协议,实现多点数据的上报。

太简单了,一次传完N点温度,如下:

1#温度

2#温度

......

N#温度

顺序读取1#~N#的温度,先放到缓冲里,一次调用串口发送函数将N点数据发送出去。收工!

N很小时,没有毛病。假设N=128,则要求温度缓存数组长度至少为128个,一个温度数值占4字节(float),要128*4 = 512B,这超出了可用内存。如果不同的项目,N点都不一样,那么上位机的程序必须根据N点修改串口接收程序。累死。

怎么办?我们可以每读一个DS18B20,就将温度发送到串口。重复N次就完成一次温度采集与上报。

为了区分是哪个DS18B20,我们增加一个字节数据表示设备号(1~N)。所以,串口上报协议变为:

设备号(1字节, unsigned char)

温度(4字节,float)

N最大为255。这么做的好处一个是简化了程序,也便于上位机接收和处理数据。

关键代码:

unsigned char ds18b20_no= 1;//读取温度并发送到串口float temperature;temperature = ds18b20_readTermperature(ds18b20_no); //读取温度uart_sendUchar(ds18b20_no); //发送设备号uart_sendFloat(temperature); //发送温度

ds18b20_readTermperature()函数是读取温度函数,本例中我们先使用模拟的(而不是真正去读一个DS18B20)。实现如下:

//读取DS18B20温度(模拟)float ds18b20_readTemperature(unsigned char no){    static unsigned char tick = 0; //为了模拟得到一个变化的温度引入的变量    float temperature;    tick++;    temperature = no + tick*0.1;    return temperature;}

我们引入模块化编程的思想,把发送功能封装到一个函数里。函数是模块化开发的必经之路。函数的引入增强了代码的可读性和复用性,也便于修改和维护程序。经过不断积累,函数库的引入可以使开发事半功倍。例如前面我们把串口封装到uart.h和uart.c,就是模块化思想的淋漓尽致的体现。使用串口,则直接添加uart.h和uart.c到工程,然后在主程序包含uart.h,直接调用定义好的串口函数就可以访问串口。

//发送温度函数,设备号(1B)温度(4B)   void sendTemperature(unsigned char no, float temperature){   uart_sendUchar(no);   uart_sendFloat(temperature);}

我们使用C51编程入门(二十二)串口编程入门--串口应用协议(一)proteus仿真电路,使用LabVIEW开发上位机来接收多点温度数据并显示

1b0a6302-3745-11ed-ba43-dac502259ad0.png

仿真电路(没有接DS18B20,,温度模拟产生)

LabVIEW上位机能够正确接收并解码数据。LabVIEW的程序框图如下:

1b2689a6-3745-11ed-ba43-dac502259ad0.png

结束语

附上本次串口源码,如下。如果你觉得本篇文章有所帮助,请点赞,请打赏。您的支持是对我们的最大鼓励。如果需要仿真电路和串口工程源码以及LabVIEW上位机源码,请在后台留言。

下一篇文章我们将完善仿真电路,增加DS18B20元件及驱动程序,并完善LabVIEW上位机(增加温度保存功能)。如果有可能,后面会开发LabVIEW串口程序的相关教程,并提供LabVIEW源码。

完整的代码:(uart.h和uart.c略,前一篇文章已经给出)

//uart_firstdemo.c#include "uart.h"//#include"reg51.h"sbit beeper_en = P2^0;sbit key_s1 = P1^0;char msg[] = "Welcome back.
";unsigned char uart_rx_buffer[2];unsigned int count = 0;//函数定义void delayMS(unsigned int nms);void keyScan(); //按键扫描float ds18b20_readTemperature(unsigned char no);    //读取DS18B20温度void sendTemperature(unsigned char no, float temperature); //发送温度函数void main(){unsignedchards18b20_no=1;//设备号    unsigned char ds18b20_N = 3; //ds18b20总数    float temperature; //温度    uart_init();    while(1)    {        temperature = ds18b20_readTemperature(ds18b20_no); //读温度        sendTemperature(ds18b20_no, temperature); //发送温度        ds18b20_no++;        if(ds18b20_no > ds18b20_N)//已经读完所有点的温度            {                ds18b20_no = 1;delayMS(1000);//等待1s左右,再开始下一次采集            }                       }}void keyScan(){floattemperature;    if(key_s1 == 0)    {delayMS(10);//消抖        if(key_s1 == 0)    //按键按下,读取并上报1#地点的温度        {            temperature = ds18b20_readTemperature(1); //读温度            sendTemperature(1, temperature); //发送温度            
        }    }}//延时函数void delayMS(unsigned int nms){unsignedinti,j;    for(i=0;i        for(j=0;j<130;j++);}//读取DS18B20温度(模拟)float ds18b20_readTemperature(unsigned char no){    static unsigned char tick = 0;    float temperature;    tick++;    temperature = no + tick*0.1;    return temperature;}//发送温度函数    void sendTemperature(unsigned char no, float temperature){   uart_sendUchar(no);   uart_sendFloat(temperature);}


审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632689
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76158
  • 字符串
    +关注

    关注

    1

    文章

    577

    浏览量

    20485
  • 温湿度采集系统

    关注

    0

    文章

    6

    浏览量

    6095

原文标题:C51编程入门(二十三)串口编程入门--串口应用协议(二)

文章出处:【微信号:轻松学单片机,微信公众号:轻松学单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机温湿度监控系统

    ,实现系统对超限温湿度监控报警; 5.设计输入单元,可对系统正常温湿度范围进行调节; 6.仿真系统能够可靠、稳定地运行; 运行原理
    发表于 08-18 21:12

    单片机温湿度传输

    要求一片单片机采集温湿度 通过串口传输到另一单片机 可是我就能传一个 不是温度就是湿度 传两个的话 接方
    发表于 11-28 14:56

    基于SHT11温湿度传感器和单片机技术的智能温湿度测量系统

    研究了基于SHT11温湿度传感器和单片机技术的智能温湿度测量系统系统使用SHT11温湿度传感器
    发表于 04-27 06:34

    怎样去设计一个基于单片机的多路温湿度采集系统

    设计简介:本设计是基于单片机的多路温湿度采集系统,主要实现以下功能:可通过LCD1602显示温湿度和阈值;可通过按键设置
    发表于 02-18 06:37

    基于单片机温湿度采集系统的硬件设计

    利用AT89C2051 单片机强大的功能,同时结合智能传感器SHT75 测量温湿度有快速和使用简便等特点,设计了一个温湿度采集系统来对
    发表于 07-21 17:13 8157次阅读
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>温湿度</b><b class='flag-5'>采集</b><b class='flag-5'>系统</b>的硬件设计

    单片机控制温湿度

    单片机控制温湿度,并且可以通过GSM短信报警
    发表于 03-22 17:48 21次下载

    基于单片机仓库温湿度的监测系统的设计

    基于51单片机温湿度检测与报警,希望大家好好利用
    发表于 05-06 15:13 21次下载

    基于单片机的AM2320的温湿度采集

    基于单片机的AM2320的温湿度采集
    发表于 11-05 11:42 51次下载

    基于51单片机实现温湿度显示

    基于51单片机实现温湿度显示的资料。
    发表于 12-17 21:49 76次下载

    基于单片机控制的大棚温湿度监控系统的设计

    基于单片机控制的大棚温湿度监控系统的设计
    发表于 09-20 08:24 109次下载
    基于<b class='flag-5'>单片机</b>控制的大棚<b class='flag-5'>温湿度</b>监控<b class='flag-5'>系统</b>的设计

    基于单片机温湿度控制系统

    设计简介:本设计是基于单片机温湿度控制系统,主要实现以下功能:可通过LCD1602显示温湿度和阈值; 可通过按键设置温湿度阈值; 可通过蜂
    发表于 11-23 17:21 49次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>温湿度</b>控制<b class='flag-5'>系统</b>

    基于单片机的粮仓温湿度监控系统

    设计简介:本设计是基于单片机的粮仓温湿度监控系统,主要实现以下功能:可通过LCD1602显示时间以及温湿度、烟雾浓度、模式; 可通过按键手动控制制冷和除湿; 可通过按键调整时间、
    发表于 12-23 19:29 37次下载
    基于<b class='flag-5'>单片机</b>的粮仓<b class='flag-5'>温湿度</b>监控<b class='flag-5'>系统</b>

    基于单片机的多路温湿度采集系统

    设计简介:本设计是基于单片机的多路温湿度采集系统,主要实现以下功能:可通过LCD1602显示温湿度和阈值; 可通过按键设置
    发表于 12-23 19:30 35次下载
    基于<b class='flag-5'>单片机</b>的多路<b class='flag-5'>温湿度</b><b class='flag-5'>采集</b><b class='flag-5'>系统</b>

    基于单片机和LabVIEW的温湿度监测系统设计

    利用单片机和虚拟仪器LabVIEW在PC端设计了温湿度测量及控制系统,用于温湿度数据监测。该系统上位
    的头像 发表于 06-09 14:02 5337次阅读
    基于<b class='flag-5'>单片机</b>和LabVIEW的<b class='flag-5'>温湿度</b>监测<b class='flag-5'>系统</b>设计

    基于PIC18系列单片机的DHT11温湿度采集系统设计

    基于PIC18系列(PIC18F4520)单片机+DHT11的温湿度采集系统的设计与制作(Proteus仿真部分)
    的头像 发表于 06-16 16:36 1045次阅读
    基于PIC18系列<b class='flag-5'>单片机</b>的DHT11<b class='flag-5'>温湿度</b><b class='flag-5'>采集</b><b class='flag-5'>系统</b>设计