标题:
代码高手看一下我的单片机代码有些问题但不知道问题在哪
[打印本页]
作者:
zhai123
时间:
2023-6-21 20:51
标题:
代码高手看一下我的单片机代码有些问题但不知道问题在哪
第一个算式正确第二个就在第一个的基础上累加,输入没有优先级
51hei.png
(24.51 KB, 下载次数: 52)
下载附件
2023-6-21 22:14 上传
单片机源程序如下:
#include<reg52.h>
#include<stdio.h>
#include <stdlib.h>
void send_int_to_serial_port(int c);
unsigned char rec_data[32],bete;
unsigned char op,flag, num[2],n=0;
unsigned int i,ansi,j,nm;
void send_data(char jieguo);
void chuankou_chushihua()//串口初始化程序
{
TMOD|=0X20; //设置计数器1为工作方式 2
SCON=0X50; //设置串行口为工作方式 1
PCON=0X80; //波特率加倍
TH1=0XFA; //计数器初始值设置9600baud
TL1=0XFA;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void uart() interrupt 4 //串口通信中断函数
{
if(RI == 1)
{
RI=0;//清除接收中断标志位
bete=SBUF;//存储接收到的数据
send_data(bete);
rec_data[nm++]=bete;
}
flag=1;
}
void send_data(char jieguo)
{
SBUF=jieguo;
while(TI==0);
TI=0;
}
int panduan_jisuan()
{
if('0'<=rec_data[0]&&rec_data[0]<='9')
num[0] = rec_data[0] - '0';
// 将第一个数字存入num[0]
for (i = 1; i < nm; i++)// 扫描整个字符数组,从第二个字符开始逐一处理
{
if (rec_data[i] == '+' || rec_data[i] == '-' || rec_data[i] == '*' ||rec_data[i] == '/')// 如果是运算符,则将其存储到op中,并将下一个数字存入num[1]
{
op = rec_data[i];
num[1] = rec_data[i + 1] - '0'; // 将指针移位至下一个数
}
else if (rec_data[i] == '=') // 如果是等号,则运算结果即为第一个数字
{
ansi = num[0];
}
else if('0'<=rec_data[0]&&rec_data[0]<='9') // 如果是数字,则根据之前的运算符进行运算
{
switch (op)
{
case '+':
num[0] = num[0] + (rec_data[i] - '0');
break;
case '-':
num[0] = num[0] - (rec_data[i] - '0');
break;
case '*':
num[0] = num[0] * (rec_data[i] - '0');
break;
case '/':
num[0] = num[0] / (rec_data[i] - '0');
break;
}
ansi=num[0];
}
}
return ansi;
}
void send_int_to_serial_port(int c)
{
char buffer[16];
sprintf(buffer, "%d", c);// 使用 sprintf() 函数将整型变量转换为字符串
for (i = 0; buffer[i] != '\0'; i++) // 将字符串逐个发送到串口
{
send_data(buffer[i]);
}
}
void main()
{
int k;
chuankou_chushihua( );
while(1)
{
if(flag==1)
{
k=panduan_jisuan();
send_int_to_serial_port(k);
flag=0;
}
}
}
复制代码
作者:
csmyldl
时间:
2023-6-22 13:12
接收中断发生时,需一次把所有接收字符接收完(没有做到),
send_int_to_serial_port这个函数想把接收表达式及结果发送出去,可buffer缓冲区中无内容
作者:
xiaouex
时间:
2023-6-23 14:15
在计算结束后把存储计算结果的变量清零
作者:
芯菲
时间:
2023-6-25 09:47
buffer缓冲区不够了,数据溢出了吧。
作者:
dwping
时间:
2023-7-2 15:55
这个程序有几个问题: 在程序开头引入的头文件reg52.h是基于8051单片机的,而不是适用于大多数现代的开发平台。你可以考虑移除这个头文件。 头文件stdio.h中的printf函数和stdlib.h中的sprintf函数不能直接使用,因为它们是针对标准输入输出流的,而不是嵌入式系统中的串口通信。你需要自己实现串口发送函数和接收函数。 rec_data数组没有进行边界检查,可能导致越界访问。在处理接收到的数据之前,应该先检查接收到的数据长度是否超过了数组的长度。 没有对变量nm进行初始化,可能导致未定义的行为。在使用或判断nm之前,应该将其初始化为合适的值。 在函数panduan_jisuan中,判断数字是否在正确的范围内时,使用了错误的条件。应该是'0'<=rec_data[i]&&rec_data[i]<='9'而不是'0'<=rec_data[0]&&rec_data[0]<='9'。 在函数panduan_jisuan中,在执行完一个运算符后没有重置op的值,可能导致后续运算出错。在处理完一个运算符后,应该将op重置为空字符。 在函数send_int_to_serial_port中,没有定义变量i的类型和初始值。应该在函数开头定义并初始化变量i。
作者:
glinfei
时间:
2023-7-3 08:01
1.累加的原因是没清零,但我觉得连续累加这也是一个功能吧。
2.没有优先级是程序问题,建议使用堆栈处理数据,同时解决只能一位运算的问题。
作者:
real8799190
时间:
2023-7-3 12:57
在您提供的代码中,存在以下问题: chuankou_chushihua() 函数中缺少对串口引脚的配置。在8051单片机中,需要设置相应的引脚(如P3.0和P3.1)为串口通信功能。 在主函数 main() 中,调用 chuankou_chushihua() 函数时没有传入任何参数,但是函数定义中有一个参数。 在 uart() 中断函数中,nm 变量用于记录接收到的字符数量,但未进行初始化。需要在主函数中添加类似 nm = 0; 的语句。 在 panduan_jisuan() 函数中,判断数字范围的条件语句错误。正确的条件应为 '0' <= rec_data[i] && rec_data[i] <= '9'。此外,该条件语句也需要修正为 rec_data[i] 而不是 rec_data[0]。 在 panduan_jisuan() 函数中,返回值 ansi 应在最后的 switch 语句之后进行赋值,而不是在进入循环时
作者:
liyonghua111
时间:
2023-7-31 12:30
我注意到了几个可能的问题: 在 uart() 中断函数中,你在接收到数据后立即发送了相同的数据回去,这可能不是你想要的行为。 在 panduan_jisuan() 函数中,你的代码假设每个数字和运算符都是由单个字符表示的,且每个数字和运算符之间没有任何空格或其他字符。如果输入的表达式不满足这些条件,你的代码可能无法正确地解析和计算它。 同样在 panduan_jisuan() 函数中,你的代码只处理了第一个运算符和等号之后的字符,对于等号之后的字符,你的代码并没有进行处理。 你的代码没有处理除数为0的情况,如果输入的表达式包含除以0的操作,你的代码可能会产生错误。 在 main() 函数中,你使用了一个名为 flag 的变量来判断是否已经接收到数据,但是你并没有在任何地方初始化这个变量。如果这个变量的初始值不是0,你的代码可能会在接收到任何数据之前就开始尝试进行计算。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1