一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于8051單片機(jī)的溫濕度采集系統(tǒng)設(shè)計(jì)

我快閉嘴 ? 來(lái)源:輕松學(xué)單片機(jī) ? 作者:輕松學(xué)單片機(jī) ? 2022-09-19 10:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

又是一周過(guò)去。不知這一周大家過(guò)得怎么樣?是否開心,是否有所收獲。

秋天,是一個(gè)收獲的季節(jié)。這一切都是建立在春耕夏播的基礎(chǔ)之上。

以上是序。


通過(guò)前面的學(xué)習(xí),我們學(xué)會(huì)了如何用串口發(fā)送數(shù)據(jù)和接收固定字節(jié)的命令。今天,我們繼續(xù)討論串口應(yīng)用協(xié)議,主要焦點(diǎn)還是在如何有效地使用串口發(fā)送數(shù)據(jù)。為了簡(jiǎn)化描述,假設(shè)我們基于8051單片機(jī)開發(fā)一個(gè)溫濕度采集系統(tǒng),周期將溫度和濕度數(shù)據(jù)上報(bào)到上位機(jī)。溫度和濕度定義如下:

float temperature = 25.0; //溫度float humidity = 70.0; //濕度

我們至少可以設(shè)計(jì)出以下兩種不同的串口應(yīng)用協(xié)議:

1.固定大小的消息:先發(fā)送float類型的溫度,再發(fā)送float類型的濕度。每次傳輸8個(gè)字節(jié)。

溫度(4字節(jié))

濕度(4字節(jié))

代碼實(shí)現(xiàn):

// 固定消息發(fā)送溫度和濕度函數(shù)void send_temperature_and_humidity(float temperature, float humidity){    uart_sendFloat(temperature); //發(fā)送溫度uart_sendFloat(humidity);//發(fā)送濕度}

  1. 字符串消息,先發(fā)送溫度的字符串,再發(fā)送濕度的字符串,兩者之間有明顯的分隔符(例如空格、分號(hào)或冒號(hào)),結(jié)尾一般以“ ”結(jié)束。

"25.0, 70.0 "

//以字符串消息發(fā)送溫度和濕度函數(shù)void send_temperature_and_humidity_string(float temperature, float humidity){    printf("%f,%f
", tempeature, humidity); //以字符串消息發(fā)送溫度、濕度}

以上兩種應(yīng)用協(xié)議中,哪一種最好呢?

  • 從消息長(zhǎng)度來(lái)看,固定消息大小都是8個(gè)字節(jié),而字符串消息則超過(guò)8個(gè)字節(jié)且長(zhǎng)度不定(請(qǐng)思考為什么?)

  • 從可讀性來(lái)看,在ASCII接收模式下,字符串消息可讀性高(人可直接讀),固定消息“不可讀”。

  • 從效率和保密性(假設(shè)有這一條吧),固定消息勝出,因?yàn)樗l(fā)送的是原始二進(jìn)制數(shù)據(jù),占用字節(jié)最少。

為了傳輸更多的數(shù)據(jù)和實(shí)現(xiàn)更復(fù)雜的功能,我們通常在固定消息的基礎(chǔ)上引入更多的輔助數(shù)據(jù)。例如,增加校驗(yàn)位保證數(shù)據(jù)傳輸無(wú)誤,增加地址字節(jié)以區(qū)分不同設(shè)備等。但對(duì)于有些上位機(jī)(LabVIEW)來(lái)說(shuō),它對(duì)字符串?dāng)?shù)據(jù)的解釋可以一步到位,無(wú)需按圖索驥。

AT命令常用于控制WiFi模塊、SMS模塊等,就是以字符串消息實(shí)現(xiàn)的。

練手項(xiàng)目:假設(shè)有一個(gè)多點(diǎn)溫度采集系統(tǒng),架構(gòu)如下圖所示。

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

其中,N值取決于具體的系統(tǒng)要求。試基于固定長(zhǎng)度消息設(shè)計(jì)串口應(yīng)用協(xié)議,實(shí)現(xiàn)多點(diǎn)數(shù)據(jù)的上報(bào)。

太簡(jiǎn)單了,一次傳完N點(diǎn)溫度,如下:

1#溫度

2#溫度

......

N#溫度

順序讀取1#~N#的溫度,先放到緩沖里,一次調(diào)用串口發(fā)送函數(shù)將N點(diǎn)數(shù)據(jù)發(fā)送出去。收工!

N很小時(shí),沒有毛病。假設(shè)N=128,則要求溫度緩存數(shù)組長(zhǎng)度至少為128個(gè),一個(gè)溫度數(shù)值占4字節(jié)(float),要128*4 = 512B,這超出了可用內(nèi)存。如果不同的項(xiàng)目,N點(diǎn)都不一樣,那么上位機(jī)的程序必須根據(jù)N點(diǎn)修改串口接收程序。累死。

怎么辦?我們可以每讀一個(gè)DS18B20,就將溫度發(fā)送到串口。重復(fù)N次就完成一次溫度采集與上報(bào)。

為了區(qū)分是哪個(gè)DS18B20,我們?cè)黾右粋€(gè)字節(jié)數(shù)據(jù)表示設(shè)備號(hào)(1~N)。所以,串口上報(bào)協(xié)議變?yōu)椋?/span>

設(shè)備號(hào)(1字節(jié), unsigned char)

溫度(4字節(jié),float)

N最大為255。這么做的好處一個(gè)是簡(jiǎn)化了程序,也便于上位機(jī)接收和處理數(shù)據(jù)。

關(guān)鍵代碼:

unsigned char ds18b20_no= 1;//讀取溫度并發(fā)送到串口float temperature;temperature = ds18b20_readTermperature(ds18b20_no); //讀取溫度uart_sendUchar(ds18b20_no); //發(fā)送設(shè)備號(hào)uart_sendFloat(temperature); //發(fā)送溫度

ds18b20_readTermperature()函數(shù)是讀取溫度函數(shù),本例中我們先使用模擬的(而不是真正去讀一個(gè)DS18B20)。實(shí)現(xiàn)如下:

//讀取DS18B20溫度(模擬)float ds18b20_readTemperature(unsigned char no){    static unsigned char tick = 0; //為了模擬得到一個(gè)變化的溫度引入的變量    float temperature;    tick++;    temperature = no + tick*0.1;    return temperature;}

我們引入模塊化編程的思想,把發(fā)送功能封裝到一個(gè)函數(shù)里。函數(shù)是模塊化開發(fā)的必經(jīng)之路。函數(shù)的引入增強(qiáng)了代碼的可讀性和復(fù)用性,也便于修改和維護(hù)程序。經(jīng)過(guò)不斷積累,函數(shù)庫(kù)的引入可以使開發(fā)事半功倍。例如前面我們把串口封裝到uart.h和uart.c,就是模塊化思想的淋漓盡致的體現(xiàn)。使用串口,則直接添加uart.h和uart.c到工程,然后在主程序包含uart.h,直接調(diào)用定義好的串口函數(shù)就可以訪問串口。

//發(fā)送溫度函數(shù),設(shè)備號(hào)(1B)溫度(4B)   void sendTemperature(unsigned char no, float temperature){   uart_sendUchar(no);   uart_sendFloat(temperature);}

我們使用C51編程入門(二十二)串口編程入門--串口應(yīng)用協(xié)議(一)proteus仿真電路,使用LabVIEW開發(fā)上位機(jī)來(lái)接收多點(diǎn)溫度數(shù)據(jù)并顯示。

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

仿真電路(沒有接DS18B20,,溫度模擬產(chǎn)生)

LabVIEW上位機(jī)能夠正確接收并解碼數(shù)據(jù)。LabVIEW的程序框圖如下:

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

結(jié)束語(yǔ)

附上本次串口源碼,如下。如果你覺得本篇文章有所幫助,請(qǐng)點(diǎn)贊,請(qǐng)打賞。您的支持是對(duì)我們的最大鼓勵(lì)。如果需要仿真電路和串口工程源碼以及LabVIEW上位機(jī)源碼,請(qǐng)?jiān)诤笈_(tái)留言。

下一篇文章我們將完善仿真電路,增加DS18B20元件及驅(qū)動(dòng)程序,并完善LabVIEW上位機(jī)(增加溫度保存功能)。如果有可能,后面會(huì)開發(fā)LabVIEW串口程序的相關(guān)教程,并提供LabVIEW源碼。

完整的代碼:(uart.h和uart.c略,前一篇文章已經(jīng)給出)

//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;//函數(shù)定義void delayMS(unsigned int nms);void keyScan(); //按鍵掃描float ds18b20_readTemperature(unsigned char no);    //讀取DS18B20溫度void sendTemperature(unsigned char no, float temperature); //發(fā)送溫度函數(shù)void main(){unsignedchards18b20_no=1;//設(shè)備號(hào)    unsigned char ds18b20_N = 3; //ds18b20總數(shù)    float temperature; //溫度    uart_init();    while(1)    {        temperature = ds18b20_readTemperature(ds18b20_no); //讀溫度        sendTemperature(ds18b20_no, temperature); //發(fā)送溫度        ds18b20_no++;        if(ds18b20_no > ds18b20_N)//已經(jīng)讀完所有點(diǎn)的溫度            {                ds18b20_no = 1;delayMS(1000);//等待1s左右,再開始下一次采集            }                       }}void keyScan(){floattemperature;    if(key_s1 == 0)    {delayMS(10);//消抖        if(key_s1 == 0)    //按鍵按下,讀取并上報(bào)1#地點(diǎn)的溫度        {            temperature = ds18b20_readTemperature(1); //讀溫度            sendTemperature(1, temperature); //發(fā)送溫度            
        }    }}//延時(shí)函數(shù)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;}//發(fā)送溫度函數(shù)    void sendTemperature(unsigned char no, float temperature){   uart_sendUchar(no);   uart_sendFloat(temperature);}


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44997

    瀏覽量

    650754
  • 串口
    +關(guān)注

    關(guān)注

    15

    文章

    1588

    瀏覽量

    79992
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    590

    瀏覽量

    22313
  • 溫濕度采集系統(tǒng)

    關(guān)注

    0

    文章

    6

    瀏覽量

    6166

原文標(biāo)題:C51編程入門(二十三)串口編程入門--串口應(yīng)用協(xié)議(二)

文章出處:【微信號(hào):輕松學(xué)單片機(jī),微信公眾號(hào):輕松學(xué)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    51單片機(jī)溫濕度監(jiān)控系統(tǒng)

    ,實(shí)現(xiàn)系統(tǒng)對(duì)超限溫濕度監(jiān)控報(bào)警; 5.設(shè)計(jì)輸入單元,可對(duì)系統(tǒng)正常溫濕度范圍進(jìn)行調(diào)節(jié); 6.仿真系統(tǒng)能夠可靠、穩(wěn)定地運(yùn)行; 運(yùn)行原理
    發(fā)表于 08-18 21:12

    單片機(jī)溫濕度傳輸

    要求一片單片機(jī)采集溫濕度 通過(guò)串口傳輸?shù)搅硪?b class='flag-5'>單片機(jī) 可是我就能傳一個(gè) 不是溫度就是濕度 傳兩個(gè)的話 接方
    發(fā)表于 11-28 14:56

    基于SHT11溫濕度傳感器和單片機(jī)技術(shù)的智能溫濕度測(cè)量系統(tǒng)

    研究了基于SHT11溫濕度傳感器和單片機(jī)技術(shù)的智能溫濕度測(cè)量系統(tǒng)。系統(tǒng)使用SHT11溫濕度傳感器
    發(fā)表于 04-27 06:34

    怎樣去設(shè)計(jì)一個(gè)基于單片機(jī)的多路溫濕度采集系統(tǒng)

    設(shè)計(jì)簡(jiǎn)介:本設(shè)計(jì)是基于單片機(jī)的多路溫濕度采集系統(tǒng),主要實(shí)現(xiàn)以下功能:可通過(guò)LCD1602顯示溫濕度和閾值;可通過(guò)按鍵設(shè)置
    發(fā)表于 02-18 06:37

    基于單片機(jī)溫濕度采集系統(tǒng)的硬件設(shè)計(jì)

    利用AT89C2051 單片機(jī)強(qiáng)大的功能,同時(shí)結(jié)合智能傳感器SHT75 測(cè)量溫濕度有快速和使用簡(jiǎn)便等特點(diǎn),設(shè)計(jì)了一個(gè)溫濕度采集系統(tǒng)來(lái)對(duì)
    發(fā)表于 07-21 17:13 ?8453次閱讀
    基于<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>溫濕度</b><b class='flag-5'>采集</b><b class='flag-5'>系統(tǒng)</b>的硬件設(shè)計(jì)

    單片機(jī)控制溫濕度

    單片機(jī)控制溫濕度,并且可以通過(guò)GSM短信報(bào)警
    發(fā)表于 03-22 17:48 ?21次下載

    基于單片機(jī)倉(cāng)庫(kù)溫濕度的監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)

    基于51單片機(jī)溫濕度檢測(cè)與報(bào)警,希望大家好好利用
    發(fā)表于 05-06 15:13 ?23次下載

    基于單片機(jī)的AM2320的溫濕度采集

    基于單片機(jī)的AM2320的溫濕度采集
    發(fā)表于 11-05 11:42 ?51次下載

    基于51單片機(jī)實(shí)現(xiàn)溫濕度顯示

    基于51單片機(jī)實(shí)現(xiàn)溫濕度顯示的資料。
    發(fā)表于 12-17 21:49 ?79次下載

    基于單片機(jī)控制的大棚溫濕度監(jiān)控系統(tǒng)的設(shè)計(jì)

    基于單片機(jī)控制的大棚溫濕度監(jiān)控系統(tǒng)的設(shè)計(jì)
    發(fā)表于 09-20 08:24 ?109次下載
    基于<b class='flag-5'>單片機(jī)</b>控制的大棚<b class='flag-5'>溫濕度</b>監(jiān)控<b class='flag-5'>系統(tǒng)</b>的設(shè)計(jì)

    基于單片機(jī)溫濕度控制系統(tǒng)

    設(shè)計(jì)簡(jiǎn)介:本設(shè)計(jì)是基于單片機(jī)溫濕度控制系統(tǒng),主要實(shí)現(xiàn)以下功能:可通過(guò)LCD1602顯示溫濕度和閾值; 可通過(guò)按鍵設(shè)置溫濕度閾值; 可通過(guò)蜂
    發(fā)表于 11-23 17:21 ?49次下載
    基于<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>溫濕度</b>控制<b class='flag-5'>系統(tǒng)</b>

    基于單片機(jī)的糧倉(cāng)溫濕度監(jiān)控系統(tǒng)

    設(shè)計(jì)簡(jiǎn)介:本設(shè)計(jì)是基于單片機(jī)的糧倉(cāng)溫濕度監(jiān)控系統(tǒng),主要實(shí)現(xiàn)以下功能:可通過(guò)LCD1602顯示時(shí)間以及溫濕度、煙霧濃度、模式; 可通過(guò)按鍵手動(dòng)控制制冷和除濕; 可通過(guò)按鍵調(diào)整時(shí)間、
    發(fā)表于 12-23 19:29 ?39次下載
    基于<b class='flag-5'>單片機(jī)</b>的糧倉(cāng)<b class='flag-5'>溫濕度</b>監(jiān)控<b class='flag-5'>系統(tǒng)</b>

    基于單片機(jī)的多路溫濕度采集系統(tǒng)

    設(shè)計(jì)簡(jiǎn)介:本設(shè)計(jì)是基于單片機(jī)的多路溫濕度采集系統(tǒng),主要實(shí)現(xiàn)以下功能:可通過(guò)LCD1602顯示溫濕度和閾值; 可通過(guò)按鍵設(shè)置
    發(fā)表于 12-23 19:30 ?38次下載
    基于<b class='flag-5'>單片機(jī)</b>的多路<b class='flag-5'>溫濕度</b><b class='flag-5'>采集</b><b class='flag-5'>系統(tǒng)</b>

    基于單片機(jī)和LabVIEW的溫濕度監(jiān)測(cè)系統(tǒng)設(shè)計(jì)

    利用單片機(jī)和虛擬儀器LabVIEW在PC端設(shè)計(jì)了溫濕度測(cè)量及控制系統(tǒng),用于溫濕度數(shù)據(jù)監(jiān)測(cè)。該系統(tǒng)上位機(jī)
    的頭像 發(fā)表于 06-09 14:02 ?5337次閱讀
    基于<b class='flag-5'>單片機(jī)</b>和LabVIEW的<b class='flag-5'>溫濕度</b>監(jiān)測(cè)<b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)

    基于PIC18系列單片機(jī)的DHT11溫濕度采集系統(tǒng)設(shè)計(jì)

    基于PIC18系列(PIC18F4520)單片機(jī)+DHT11的溫濕度采集系統(tǒng)的設(shè)計(jì)與制作(Proteus仿真部分)
    的頭像 發(fā)表于 06-16 16:36 ?1464次閱讀
    基于PIC18系列<b class='flag-5'>單片機(jī)</b>的DHT11<b class='flag-5'>溫濕度</b><b class='flag-5'>采集</b><b class='flag-5'>系統(tǒng)</b>設(shè)計(jì)