8051单片机串口发hex模式两数接收hex模式他们的和,想问怎么接收到和,试了好久写不出来

我的理解是hex模式发的是十六进制数,我先把它变为十进制数进行加法运算(因为我以为接收到的十六进制不可以直接运算),然后我想把两数和一个一个数字输出,但是这个地方就不太清楚了,一直出问题

img


#include <REGX52.H>


unsigned char UART_Receive()    //返回电脑输入数据函数
{
    if(RI==1)            //接收控制器接收后变1,需软件复位0
        RI=0;
    return SBUF;
}

void UART_Init(void)        //串口初始化函数  
                            //4800bps@12.000MHz
{
    PCON |= 0x80;        //使能波特率倍速位SMOD
    SCON = 0x50;        //8位数据,可变波特率,使能接收
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式
    TL1 = 0xF3;            //设置定时初始值
    TH1 = 0xF3;            //设置定时重载值
    ET1 = 0;            //禁止定时器中断
    TR1 = 1;            //定时器1开始计时
    EA=1;                //串口中断
    ES=1;
}

void UART_SendByte(unsigned char Byte)       //串口发送一个字节数据
{
    SBUF=Byte;
    while(TI==0);     //发送控制器发送后变1,需软件重新赋值0
    TI=0;
}        

unsigned char Ten(unsigned char sixteen)          //例:将0x05变为5
{
    unsigned char ten;
    ten=(sixteen/16)*10+(sixteen%16);
    return ten;
}


unsigned char data1,data2,sum,data3,data4;

void main()
{
    UART_Init();

    while(1)
    {

    }
}

void UART_Routine() interrupt 4    
{
    data1=UART_Receive();           //返回电脑输入第一个数据函数,十六进制
    data2=UART_Receive();        //返回电脑输入第二个数据函数,十六进制
    data1=Ten(data1);            //把发送缓冲区接收到的十六进制数据转为十进制数
    data2=Ten(data2);
    sum=data1+data2;
    data3=sum/10;
    data4=sum%10;
    UART_SendByte(data3);
    UART_SendByte(data4);
}

中断程序不对
串口中断,包含了发送和接收两个中断,需要分别处理。
一个接收中断,只能接收一个数,你的代码中有两次接收
发送可以不用中断
比如

//中断服务函数可以随便写  但interrupt 4代表的串口0中断
//这是程序的框架
void uart0_interrupt (void) interrupt 4
{
    if(RI)  //RI为1代表接收完成一帧数据
    {
        /*
        需要具体做的事情
        */
        RI = 0;//清除标志位,以便当接收到下一帧数据进入中断
    }
    if(TI)//TI为1代表发送完成中断
    {
        /*
        需要具体做的事情
       */
        TI = 0;//清除标志位,以便当接收到下一帧数据进入中断
 
    }
}

收到的都是一个字符类型,不需要进行进制转换

【以下回答由 GPT 生成】

由于8051单片机中没有直接支持十六进制数的函数,因此需要通过将十六进制数转换为十进制数来进行计算。下面是一种可能的解决方案:

  1. 首先,我们需要通过串口接收函数来接收两个十六进制数。在main函数中添加以下代码:
data1 = UART_Receive(); // 接收第一个十六进制数
data2 = UART_Receive(); // 接收第二个十六进制数

这样,data1data2就存储了两个十六进制数的值。

  1. 接下来,我们需要将这两个十六进制数转换为十进制数。可以编写一个函数来实现转换。在代码中添加以下函数:
unsigned char HexToDec(unsigned char hex)
{
    unsigned char digit1 = hex >> 4;      // 获取高4位数值
    unsigned char digit2 = hex & 0x0F;    // 获取低4位数值
    unsigned char dec = digit1 * 10 + digit2;  // 转换为十进制数
    return dec;
}

然后,在main函数中调用该函数来将data1data2转换为十进制数:

unsigned char dec1 = HexToDec(data1); // 将第一个十六进制数转换为十进制数
unsigned char dec2 = HexToDec(data2); // 将第二个十六进制数转换为十进制数

现在,dec1dec2存储了两个十六进制数的十进制值。

  1. 现在,我们可以对十进制数进行求和操作。在main函数中添加以下代码:
unsigned char decSum = dec1 + dec2; // 计算两个十进制数的和
  1. 最后,我们将和的结果以逐个数字的形式输出。可以编写一个函数来实现每个数字的输出。在代码中添加以下函数:
void OutputDigits(unsigned char number)
{
    unsigned char digit1 = number / 10;   // 获取十位数值
    unsigned char digit2 = number % 10;   // 获取个位数值

    UART_SendByte(digit1 + '0');    // 输出十位数字
    UART_SendByte(digit2 + '0');    // 输出个位数字
}

然后,在main函数中调用该函数来输出和的每个数字:

OutputDigits(decSum); // 以逐个数字的形式输出和的结果

这样,当你接收到两个十六进制数后,它们将被转换为十进制数并求和,然后以逐个数字的形式输出和的结果。

请注意:上述代码只是一个简单的示例,可能需要根据具体的应用场景进行修改和调整。另外,代码中使用的函数UART_ReceiveUART_SendByte等可能还需要根据你的具体硬件和串口配置进行适当修改。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^