cnzym 发表于 2014-9-6 14:49:25

【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



下面这幅图演示错误提醒,以左括号为例……
若刚刚输入一个数字就输入左括号,会提示出错。



“关于”界面……


源代码在此:

Cursor 发表于 2014-9-7 20:14:12

大角虫!!!

lazydog 发表于 2014-9-7 20:53:09

好吧……留一个膝盖就是了……
打码什么的完全没必要,因为可以从源代码偷窥(喂

blink1970 发表于 2015-12-15 23:24:00

很好
页: [1]
查看完整版本: 【51单片机上的】函数型计算器