找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 206|回复: 4
打印 上一主题 下一主题
收起左侧

我想在程序里加入串口通信,但穿的数据一直不是想要的温度值

[复制链接]
跳转到指定楼层
#
主程序代码如下,
#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 (5.82 KB, 下载次数: 0)

51hei20250610-142047.png

13-2 DS18B20温度报警器 (2).zip

88.65 KB, 下载次数: 0

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

地板
ID:320097 发表于 2025-6-12 22:41 | 只看该作者
是不是while(1)里面的问题,发送转换温度指令以后,应该等一段时间再读取数据,主函数开始的时候都有延时函数,大循环里面就没有延时函数
回复

使用道具 举报

板凳
ID:879809 发表于 2025-6-12 16:21 | 只看该作者
上位机解析数据就行了,还要什么自行车?
回复

使用道具 举报

沙发
ID:69038 发表于 2025-6-12 11:45 | 只看该作者
其实,我觉得传啥数据(格式、类型)都不重要,
重要的是上位机要能收到正确的数据,
再根据下位的的格式、类型做出正确的解析。。
回复

使用道具 举报

楼主
ID:320306 发表于 2025-6-11 09:45 | 只看该作者
不上传浮点数据,直接上传整数数据,用高位和低位的概念来做,一定要浮点数就用字符串的形式上传!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表