久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 269|回復: 4
收起左側

我想在程序里加入串口通信,但穿的數據一直不是想要的溫度值

[復制鏈接]
ID:1153430 發表于 2025-6-10 14:21 | 顯示全部樓層 |閱讀模式
主程序代碼如下,
#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Timer0.h"
#include "UART.h"
#include <stdio.h>
float T,TShow;
char TLow,THigh;
unsigned char KeyNum;
void UART_SendFloat(float f)
{
        unsigned char *p = (unsigned char *)&f;
        int i;
    // 可選:發送起始標志(例如0xAA)
    UART_SendByte(0xAA);

    // 發送4個字節(小端模式:低字節在前)
    for(i = 0; i < 4; i++) {
        UART_SendByte(p[i]);
    }

    // 可選:發送結束標志(例如0x55)
    UART_SendByte(0x55);
}
       

void main()
{
        DS18B20_ConvertT();                //上電先轉換一次溫度,防止第一次讀數據錯誤
        Delay(1000);        //等待轉換完成
        THigh=AT24C02_ReadByte(0);        //讀取溫度閾值數據
        TLow=AT24C02_ReadByte(1);
        if(THigh>125 || TLow<-55 || THigh<=TLow)
        {
                THigh=20;                        //如果閾值非法,則設為默認值
                TLow=15;
        }
        LCD_Init();
        UART_Init();
        LCD_ShowString(1,1,"T:");
        LCD_ShowString(2,1,"TH:");
        LCD_ShowString(2,9,"TL:");
        LCD_ShowSignedNum(2,4,THigh,3);
        LCD_ShowSignedNum(2,12,TLow,3);
        Timer0_Init();
       
        while(1)
        {
                KeyNum=Key();
               
                /*溫度讀取及顯示*/
                DS18B20_ConvertT();        //轉換溫度
                T=DS18B20_ReadT();        //讀取溫度
                if(T<0)                                //如果溫度小于0
                {
                        LCD_ShowChar(1,3,'-');        //顯示負號
                        TShow=-T;                //將溫度變為正數
                }
                else                                //如果溫度大于等于0
                {
                        LCD_ShowChar(1,3,'+');        //顯示正號
                        TShow=T;
                }
                LCD_ShowNum(1,4,TShow,3);                //顯示溫度整數部分
                LCD_ShowChar(1,7,'.');                //顯示小數點
                LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//顯示溫度小數部分
                UART_SendFloat(TShow);
                Delay(500);
                /*閾值判斷及顯示*/
                if(KeyNum)
                {
                        if(KeyNum==1)        //K1按鍵,THigh自增
                        {
                                THigh++;
                                if(THigh>125){THigh=125;}
                        }
                        if(KeyNum==2)        //K2按鍵,THigh自減
                        {
                                THigh--;
                                if(THigh<=TLow){THigh++;}
                        }
                        if(KeyNum==3)        //K3按鍵,TLow自增
                        {
                                TLow++;
                                if(TLow>=THigh){TLow--;}
                        }
                        if(KeyNum==4)        //K4按鍵,TLow自減
                        {
                                TLow--;
                                if(TLow<-55){TLow=-55;}
                        }
                        LCD_ShowSignedNum(2,4,THigh,3);        //顯示閾值數據
                        LCD_ShowSignedNum(2,12,TLow,3);
                        AT24C02_WriteByte(0,THigh);                //寫入到At24C02中保存
                        Delay(5);
                        AT24C02_WriteByte(1,TLow);
                        Delay(5);
                }
                if(T>THigh)                        //越界判斷
                {
                        LCD_ShowString(1,13,"OV:H");
                }
                else if(T<TLow)
                {
                        LCD_ShowString(1,13,"OV:L");
                }
                else
                {
                        LCD_ShowString(1,13,"    ");
                }
        }
}

void Timer0_Routine() interrupt 1
{
        static unsigned int T0Count;
        TL0 = 0x18;                //設置定時初值
        TH0 = 0xFC;                //設置定時初值
        T0Count++;
        if(T0Count>=20)
        {
                T0Count=0;
                Key_Loop();        //每20ms調用一次按鍵驅動函數
        }
}
接受的串口通信就像圖片那樣

51hei20250610-142047.png

13-2 DS18B20溫度報警器 (2).zip

88.65 KB, 下載次數: 0

回復

使用道具 舉報

ID:320306 發表于 2025-6-11 09:45 | 顯示全部樓層
不上傳浮點數據,直接上傳整數數據,用高位和低位的概念來做,一定要浮點數就用字符串的形式上傳!
回復

使用道具 舉報

ID:69038 發表于 2025-6-12 11:45 | 顯示全部樓層
其實,我覺得傳啥數據(格式、類型)都不重要,
重要的是上位機要能收到正確的數據,
再根據下位的的格式、類型做出正確的解析。。
回復

使用道具 舉報

ID:879809 發表于 2025-6-12 16:21 | 顯示全部樓層
上位機解析數據就行了,還要什么自行車?
回復

使用道具 舉報

ID:320097 發表于 2025-6-12 22:41 | 顯示全部樓層
是不是while(1)里面的問題,發送轉換溫度指令以后,應該等一段時間再讀取數據,主函數開始的時候都有延時函數,大循環里面就沒有延時函數
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一二三在线观看 | 久久躁日日躁aaaaxxxx | 国产精品久久久久久久久久久久久 | 日韩免费在线观看视频 | 亚洲欧美国产精品久久 | 午夜精品久久久久久不卡欧美一级 | 999热精品 | 三级黄视频在线观看 | 99re在线 | 天天操天天干天天曰 | 91 久久| 天天成人综合网 | 男人天堂久久久 | 国产精品国产成人国产三级 | 日韩欧美在线一区 | aaa天堂| 中文字幕av在线 | 99影视 | 台湾av在线| 2021天天躁夜夜看 | 久久精品91久久久久久再现 | 麻豆国产一区二区三区四区 | 6996成人影院网在线播放 | 精品国产1区2区3区 在线国产视频 | 欧美日韩国产不卡 | 日韩欧美网 | 成人欧美一区二区三区在线观看 | 自拍视频在线观看 | 国产成人在线看 | 伊人久久综合 | 免费黄色在线观看 | 久草视频在线播放 | 国产一级淫片a直接免费看 免费a网站 | 日韩在线视频一区 | 天天曰天天曰 | 亚洲一二三区不卡 | 欧美日韩一区二区三区在线观看 | 国产精品1区2区 | 成人综合在线视频 | 亚洲色综合 | 一区二区三区精品在线视频 |