高分求:用80c51/52单片机小系统编程制作计算器

求设计程序。实现如下功能:
1.4位led显示器
2.要有0-9个数字输入键,实现“+”“-”“*”“/”“=”“CLR”“RET”,能够实现带负的算术运算和带浮点(小数)的运算。
3.就是能够实现小学买的计算机上的功能
大虾们,给段参考程序就OK啦!谢谢啦~1L,表挖苦啦。。。
发我邮箱吧,yu13115721952@126.com
最好附带程序注解
满意的话,追加分数
最新回答
少年风流曾几时

2024-05-04 02:20:56

************************
************************
** 满意要加分哦! **
************************
************************

要实现算术符号的识别,这里是有学问的,没看过《数据结构》难度还是比较大的,这里要用的算法叫做逆波兰算法,可以看看我的博客里的"c语言/数据结构" 一栏里的相关文章:

《51单片机通过串口进行基于逆波兰算法的逻辑运算》
《双数组逆波兰表达式法:计算器源程(c语言) 转载》
《RPN——逆波兰算法简介(huiyujian翻译) 转载》

认真读完,不用注释,你能看懂了!
************************
************************
** 满意要加分哦! **
************************
************************

这里也贴一段程序:
#include "stdio.h"
#include "REG52.h"
#define m0 15
void init()
{SCON=0x50; //串口方式1,允许接收
TMOD=0x20; //定时器1定时方式2
TCON=0x40; //设定时器1开始计数
TH1=0xE8; //11.0592MHz 1200波特率
TL1=0xE8;
TI=1;
TR1=1; //启动定时器
}
void caculate()
{ idata char str[m0]={"!(1+0)#"};
idata char exp[m0];
idata char stack[10];
idata char stack1[10],d;
char ch,c;
int i,j,t,top=0;
i=0;
/* do
{ i++;
scanf("%c",&str[i]);
}while (str[i]!='#'&&i!=m0);
*/
t=1;
i=0;
ch=str[i];
i++;
while(ch!='#')
{if(ch=='0'||ch=='1')
{ exp[t]=ch;
t++;
}
else
if(ch=='(')
{ top++;
stack[top]=ch;
}
else
if(ch==')')
{ while(stack[top]!='(')
{ exp[t]=stack[top];
top--;
t++;
}
top--;
}
else
if (ch=='+')
{ while(top!=0&&stack[top]!='(')
{ exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
else
if(ch=='*')
{ while(stack[top]=='*')
{ exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
else
if(ch=='!')
{ while(stack[top]=='!')
{ exp[t]=stack[top];
top--;
t++;
}
top++;
stack[top]=ch;
}
ch=str[i];
i++;
}
while(top!=0)
{ exp[t]=stack[top];
t++;
top--;
}
exp[t]='#';
for(j=1;j<=t;j++)printf("%c",exp[j]);
printf("\n");
exp[t+1]='\0';
t=1;
top=0;
c=exp[t];
t++;
while(c!='#')
{if(c=='0'||c=='1')
{d=c-'0';
top++;
stack1[top]=d;
}
else
{ switch (c)
{ case '+':stack1[top-1]=stack1[top-1]|stack1[top];break;
case '*':stack1[top-1]=stack1[top-1]&stack1[top];break;
case '!':stack1[top-1]=!stack1[top];break;
default:break;
}
top--;
}
c=exp[t];
t++;
}
printf("The mark is %d",stack1[top]);
}
main()
{ init();
caculate();
while(1);
}
蓝萱薇

2024-05-04 10:57:04

我好像有一个也
给你发过去
cxhmcu
﹏小阿蓉er

2024-05-04 10:26:28

你很急,恩 是的
与审美无关△

2024-05-04 09:58:32

我已经发了