【51单片机上的】函数型计算器
本帖最后由 cnzym 于 2014-9-6 14:55 编辑南京某大学计算机专业大二生一枚……今年(2014年)暑假开始学习8051系列单片机。短学期作业是MFC科学计算器,由此启发,制作了一个51单片机上的函数计算器。
刚开始设计时,有两个方向:
第一个方向是卡西欧fx-350MS之类函数计算器的风格,即完整输入中缀表达式后按EXE统一进行计算;
第二个方向是夏普EL-501单行计算器的风格,即每输入一个运算符就会返回堆栈中的临时结果,并且对于一元函数采用后缀式输入,请参考维基百科
http://en.wikipedia.org/wiki/Calculator_input_methods#Immediate_execution
考虑之后觉得选择第二个方向比较好:一是1602液晶屏显示字符数太少;二是51单片机RAM极其有限,恐怕不能胜任复杂一点的字符串处理。
关于EL-501计算器,请参考夏普官网介绍:
http://sharp-world.com/products/calculators/sc_calculator/el-501x/index.html
市面上有很多廉价的基于EL-501的山寨计算器,下面这台就是今年春天在淘宝上以10元的价格买到的……
可见,从键盘到屏幕,和夏普EL-501一模一样。
/////////////////////////////////////////////////////////////////////////////////////////////////
下面介绍自制的51单片机上函数计算器。
手上只有一块开发板、一块STC90C516RD+单片机、一块1602LCD、一个红外接收管和一个遥控器。
因为16键矩阵键盘按键太少,所以选择了很常见的红外遥控器如下图:
定义对应功能如下图所示:
开发板如下图:
编写MFC计算器时,曾经用这样一个表达式测试其功能:
5^2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))
结果是165。
上电复位,初始化显示是这样的
第一排是状态栏,Deg代表角度状态,R代表Ready,就绪,表示现在可以输入数字。
输入第一个数字‘5’……可见右上角R变成了I,代表输入状态,此时可以接受运算符和一元函数。
现在的输入进度是:5……^2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))
输入乘方符号(2ndF + *),右上角即显示“^”,提示可以输入乘方的第二个操作数,也就是2.
现在的输入进度是:5^……2+ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))
输入到第一个加号时,自动计算出乘方运算结果,25
现在的输入进度是:5^2+……ln(exp(10))*sqrt(100)+(1+(23*2-3)-sqrt(16))
输入到第二个加号时,自动计算出乘方运算结果,125。
对于一元函数,本计算器采取后缀输入方式,即
如果要计算sqrt(100),需要先输入100,再输入√
现在的输入进度是:5^2+ln(exp(10))*sqrt(100)+……(1+(23*2-3)-sqrt(16))
现在的输入进度是:5^2+ln(exp(10))*sqrt(100)+(1+(23*2-……3)-sqrt(16))
“B02”代表当前还有两个右括号没有输入。
全部输入完成之后,按“=”,得出结果165.
5^2+ln(exp(10))*sqrt(100)+(1+(23*2……-3)-sqrt(16)) == 165
下面这幅图演示错误提醒,以左括号为例……
若刚刚输入一个数字就输入左括号,会提示出错。
“关于”界面……
源代码在此:
大角虫!!! 好吧……留一个膝盖就是了……
打码什么的完全没必要,因为可以从源代码偷窥(喂 很好
页:
[1]