我的理解是hex模式发的是十六进制数,我先把它变为十进制数进行加法运算(因为我以为接收到的十六进制不可以直接运算),然后我想把两数和一个一个数字输出,但是这个地方就不太清楚了,一直出问题
#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单片机中没有直接支持十六进制数的函数,因此需要通过将十六进制数转换为十进制数来进行计算。下面是一种可能的解决方案:
main
函数中添加以下代码:data1 = UART_Receive(); // 接收第一个十六进制数
data2 = UART_Receive(); // 接收第二个十六进制数
这样,data1
和data2
就存储了两个十六进制数的值。
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
函数中调用该函数来将data1
和data2
转换为十进制数:
unsigned char dec1 = HexToDec(data1); // 将第一个十六进制数转换为十进制数
unsigned char dec2 = HexToDec(data2); // 将第二个十六进制数转换为十进制数
现在,dec1
和dec2
存储了两个十六进制数的十进制值。
main
函数中添加以下代码:unsigned char decSum = dec1 + dec2; // 计算两个十进制数的和
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_Receive
、UART_SendByte
等可能还需要根据你的具体硬件和串口配置进行适当修改。
【相关推荐】